/ Hex Artifact Content
Login

Artifact 587dd00c675e99d61614c9537feb73bfc2e9683d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3040: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3050: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3060: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3070: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3090: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
30a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30b0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30c0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30e0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30f0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
3100: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3110: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3120: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3130: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3140: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3150: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3160: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3170: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3180: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3190: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
31a0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31b0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31c0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31d0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
3200: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3210: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3230: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3240: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3250: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3260: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3270: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3280: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
32a0: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32b0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32c0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32d0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32e0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32f0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
3300: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3310: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3320: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3330: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3340: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3350: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3370: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3380: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3390: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
33a0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33b0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33c0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33d0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33f0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
3400: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3410: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3430: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3440: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3450: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3460: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3470: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3480: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3490: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
34a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34b0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34d0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34e0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34f0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
3500: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3510: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3520: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3540: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3550: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3560: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3570: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3580: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3590: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
35a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35b0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35c0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35e0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35f0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
3600: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3610: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3620: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3630: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3640: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3650: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3660: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3670: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3680: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3690: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
36a0: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36c0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36d0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36e0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36f0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
3700: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3710: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3720: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3730: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3740: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3750: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3760: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3770: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3780: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3790: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
37a0: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37b0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37c0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37d0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37f0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
3800: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3810: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3820: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3830: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3840: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3850: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3860: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3870: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3880: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
38a0: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38b0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38c0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38d0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38e0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38f0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
3900: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3910: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3920: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3930: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3940: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3950: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3960: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3970: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3980: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3990: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
39a0: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3a00: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a10: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a20: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a30: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a40: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a60: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3a70: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3a80: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3a90: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
3aa0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3ab0: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
3ac0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3ad0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
3ae0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
3af0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3b00: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
3b10: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
3b20: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
3b30: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b40: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3b50: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
3b60: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
3b70: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
3b80: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
3b90: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
3ba0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3bb0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
3bc0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
3bd0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
3be0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3bf0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3c00: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3c10: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
3c20: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
3c30: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
3c40: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
3c50: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
3c60: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
3c70: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3c80: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
3c90: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
3ca0: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3cb0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3cc0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3cd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3ce0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3cf0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
3d00: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
3d10: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3d20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d30: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3d40: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3d50: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3d60: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3d70: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
3d80: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
3d90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3da0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
3db0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3dc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
3dd0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
3de0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
3df0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
3e00: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
3e10: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3e20: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3e30: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3e40: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3e50: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
3e60: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3e70: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3e80: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3e90: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3ea0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3eb0: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
3ec0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3ed0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
3ee0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
3ef0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
3f00: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
3f10: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3f20: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3f30: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3f40: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3f50: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3f60: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3f70: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3f80: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3f90: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3fa0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3fb0: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
3fc0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
3fd0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
3fe0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
3ff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4000: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4010: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
4020: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
4030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4040: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
4050: 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  eck */.  i64 iRo
4060: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
4070: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
4080: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
4090: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
40a0: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
40b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
40c0: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
40d0: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
40e0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42  BtCursor *p;.  B
40f0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
4100: 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73  Btree->pBt;.  as
4110: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
4120: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74  eeHoldsMutex(pBt
4130: 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  ree) );.  for(p=
4140: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
4150: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
4160: 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c 61    if( (p->curFla
4170: 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62 6c  gs & BTCF_Incrbl
4180: 6f 62 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  ob)!=0.     && (
4190: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20  isClearTable || 
41a0: 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52  p->info.nKey==iR
41b0: 6f 77 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ow).    ){.     
41c0: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
41d0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
41e0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
41f0: 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69    /* Stub functi
4200: 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42  on when INCRBLOB
4210: 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20   is omitted */. 
4220: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
4230: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
4240: 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  rs(x,y,z).#endif
4250: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
4260: 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a  INCRBLOB */../*.
4270: 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20  ** Set bit pgno 
4280: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  of the BtShared.
4290: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
42a0: 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  ec. This is call
42b0: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61  ed .** when a pa
42c0: 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73  ge that previous
42d0: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74  ly contained dat
42e0: 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65  a becomes a free
42f0: 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70  -list leaf .** p
4300: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  age..**.** The B
4310: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4320: 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74  ent bitvec exist
4330: 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  s to work around
4340: 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62   an obscure.** b
4350: 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65  ug caused by the
4360: 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20   interaction of 
4370: 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70  two useful IO op
4380: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72  timizations surr
4390: 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d  ounding.** free-
43a0: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a  list leaf pages:
43b0: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e  .**.**   1) When
43c0: 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c   all data is del
43d0: 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65  eted from a page
43e0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65   and the page be
43f0: 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20  comes.**      a 
4400: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4410: 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73  age, the page is
4420: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
4430: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
4440: 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69       (as free-li
4450: 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f  st leaf pages co
4460: 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67  ntain no meaning
4470: 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74  ful data). Somet
4480: 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63  imes.**      suc
4490: 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20  h a page is not 
44a0: 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  even journalled 
44b0: 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  (as it will not 
44c0: 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20  be modified,.** 
44d0: 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20       why bother 
44e0: 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29  journalling it?)
44f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
4500: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4510: 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65  af page is reuse
4520: 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69  d, its content i
4530: 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20  s not read.**   
4540: 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61     from the data
4550: 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20  base or written 
4560: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
4570: 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20  ile (why should 
4580: 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69  it.**      be, i
4590: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61  f it is not at a
45a0: 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e  ll meaningful?).
45b0: 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65  .**.** By themse
45c0: 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69  lves, these opti
45d0: 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66  mizations work f
45e0: 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20  ine and provide 
45f0: 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f  a handy.** perfo
4600: 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20  rmance boost to 
4610: 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69  bulk delete or i
4620: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
4630: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a  . However, if.**
4640: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
4650: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
4660: 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  t and then reuse
4670: 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  d within the sam
4680: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
4690: 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65  , a problem come
46a0: 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67  s up. If the pag
46b0: 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  e is not journal
46c0: 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69  led when.** it i
46d0: 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  s moved to the f
46e0: 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20  ree-list and it 
46f0: 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72  is also not jour
4700: 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a  nalled when it.*
4710: 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  * is extracted f
4720: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
4730: 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68  t and reused, th
4740: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
4750: 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c  data.** may be l
4760: 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e  ost. In the even
4770: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  t of a rollback,
4780: 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70   it may not be p
4790: 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65  ossible.** to re
47a0: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
47b0: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
47c0: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
47d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75  ..**.** The solu
47e0: 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68  tion is the BtSh
47f0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4800: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4810: 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20  r a page is .** 
4820: 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20  moved to become 
4830: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4840: 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65   page, the corre
4850: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a  sponding bit is.
4860: 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69  ** set in the bi
4870: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
4880: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78   leaf page is ex
4890: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
48a0: 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f   free-list,.** o
48b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62  ptimization 2 ab
48c0: 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69  ove is omitted i
48d0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
48e0: 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61  ing bit is alrea
48f0: 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53  dy.** set in BtS
4900: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4910: 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  t. The contents 
4920: 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72  of the bitvec ar
4930: 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20  e cleared.** at 
4940: 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
4950: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
4960: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4970: 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42  eSetHasContent(B
4980: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
4990: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
49a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
49b0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
49c0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61  Content ){.    a
49d0: 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74  ssert( pgno<=pBt
49e0: 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70  ->nPage );.    p
49f0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4a00: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
4a10: 72 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65  reate(pBt->nPage
4a20: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d  );.    if( !pBt-
4a30: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
4a40: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
4a50: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
4a60: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
4a70: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
4a80: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
4a90: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
4aa0: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
4ab0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
4ac0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4ad0: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
4ae0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4af0: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
4b00: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4b10: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
4b20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
4b30: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4b40: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4b50: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
4b60: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
4b70: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
4b80: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
4b90: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
4ba0: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
4bb0: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
4bc0: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
4bd0: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
4be0: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
4bf0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
4c00: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
4c10: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4c20: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
4c30: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
4c40: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
4c50: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
4c60: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
4c70: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
4c80: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
4c90: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
4ca0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
4cb0: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
4cc0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4cd0: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
4ce0: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
4cf0: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
4d00: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
4d10: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
4d20: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
4d30: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
4d40: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4d50: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
4d60: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
4d70: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
4d80: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
4d90: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
4da0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
4db0: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
4dc0: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
4dd0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
4de0: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
4df0: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
4e00: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4e10: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
4e20: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
4e30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
4e40: 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
4e50: 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43  Page[i]);.    pC
4e60: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
4e70: 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  0;.  }.  pCur->i
4e80: 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f  Page = -1;.}.../
4e90: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
4ea0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
4eb0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
4ec0: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
4ed0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
4ee0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
4ef0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
4f00: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
4f10: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
4f20: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
4f30: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
4f40: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
4f50: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
4f60: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
4f70: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
4f80: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
4f90: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
4fa0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
4fb0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
4fc0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
4fd0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
4fe0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
4ff0: 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b  ate || CURSOR_SK
5000: 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53  IPNEXT==pCur->eS
5010: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
5020: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
5030: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
5040: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
5050: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
5060: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
5070: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
5080: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
5090: 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
50a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
50b0: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
50c0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
50d0: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
50e0: 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65  pCur, &pCur->nKe
50f0: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
5100: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
5110: 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63 61 6e  /* KeySize() can
5120: 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f  not fail */..  /
5130: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
5140: 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68  intKey table, th
5150: 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c  en the above cal
5160: 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a  l to BtreeKeySiz
5170: 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  e().  ** stores 
5180: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
5190: 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49  in pCur->nKey. I
51a0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
51b0: 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61   value is.  ** a
51c0: 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ll that is requi
51d0: 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  red. Otherwise, 
51e0: 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f  if pCur is not o
51f0: 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79  pen on an intKey
5200: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  .  ** table, the
5210: 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66  n malloc space f
5220: 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  or and store the
5230: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65   pCur->nKey byte
5240: 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64  s of key .  ** d
5250: 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ata..  */.  if( 
5260: 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  0==pCur->apPage[
5270: 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  0]->intKey ){.  
5280: 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73    void *pKey = s
5290: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43  qlite3Malloc( pC
52a0: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
52b0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
52c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
52d0: 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
52e0: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c  (int)pCur->nKey,
52f0: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
5300: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5310: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
5320: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
5330: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5340: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5350: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
5360: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5370: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
5380: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  M;.    }.  }.  a
5390: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61 70  ssert( !pCur->ap
53a0: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
53b0: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
53c0: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
53d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74  ITE_OK ){.    bt
53e0: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
53f0: 73 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a  sorPages(pCur);.
5400: 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
5410: 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   = CURSOR_REQUIR
5420: 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e  ESEEK;.  }..  in
5430: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
5440: 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72  Cache(pCur);.  r
5450: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
5460: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
5470: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
5480: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
5490: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
54a0: 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f  t(BtCursor*,Pgno
54b0: 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a  ,BtCursor*);../*
54c0: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73  .** Save the pos
54d0: 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75  itions of all cu
54e0: 72 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45  rsors (except pE
54f0: 78 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20  xcept) that are 
5500: 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74  open on.** the t
5510: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
5520: 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76  age iRoot.  "Sav
5530: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70  ing the cursor p
5540: 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74  osition" means t
5550: 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74  hat.** the locat
5560: 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65  ion in the btree
5570: 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69   is remembered i
5580: 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
5590: 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d  t it can be.** m
55a0: 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  oved back to the
55b0: 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72   same spot after
55c0: 20 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62   the btree has b
55d0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54  een modified.  T
55e0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
55f0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
5600: 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63  fore cursor pExc
5610: 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ept is used to m
5620: 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62  odify the.** tab
5630: 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20  le, for example 
5640: 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29  in BtreeDelete()
5650: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
5660: 29 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  )..**.** Impleme
5670: 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54  ntation note:  T
5680: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65  his routine mere
5690: 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  ly checks to see
56a0: 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a   if any cursors.
56b0: 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61  ** need to be sa
56c0: 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f  ved.  It calls o
56d0: 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72  ut to saveCursor
56e0: 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65  sOnList() in the
56f0: 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76   (unusual).** ev
5700: 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73  ent that cursors
5710: 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20   are in need to 
5720: 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a  being saved..*/.
5730: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41  static int saveA
5740: 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  llCursors(BtShar
5750: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52  ed *pBt, Pgno iR
5760: 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
5770: 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72  Except){.  BtCur
5780: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
5790: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
57a0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
57b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
57c0: 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63  xcept==0 || pExc
57d0: 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ept->pBt==pBt );
57e0: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
57f0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
5800: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
5810: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
5820: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
5830: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20  oRoot==iRoot) ) 
5840: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
5850: 75 72 6e 20 70 20 3f 20 73 61 76 65 43 75 72 73  urn p ? saveCurs
5860: 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f  orsOnList(p, iRo
5870: 6f 74 2c 20 70 45 78 63 65 70 74 29 20 3a 20 53  ot, pExcept) : S
5880: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
5890: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
58a0: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
58b0: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
58c0: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
58d0: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
58e0: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
58f0: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
5900: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
5910: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
5920: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
5930: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
5940: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
5950: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
5960: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
5970: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
5980: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
5990: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
59a0: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
59b0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
59c0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
59d0: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
59e0: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
59f0: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
5a00: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
5a10: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
5a20: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
5a30: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
5a40: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
5a50: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
5a60: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
5a70: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
5a80: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
5a90: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
5aa0: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
5ab0: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
5ac0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5ad0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
5ae0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
5af0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
5b00: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
5b10: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
5b20: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
5b30: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
5b40: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
5b50: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
5b60: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
5b70: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
5b80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
5b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
5ba0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
5bb0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30  case( p->iPage>0
5bc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65   );.        btre
5bd0: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5be0: 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20  rPages(p);.     
5bf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d   }.    }.    p =
5c00: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77 68   p->pNext;.  }wh
5c10: 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74 75  ile( p );.  retu
5c20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5c30: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
5c40: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5c50: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
5c60: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
5c70: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
5c80: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
5c90: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5ca0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5cb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5cc0: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
5cd0: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
5ce0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5cf0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
5d00: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
5d10: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
5d20: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
5d30: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
5d40: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
5d50: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
5d60: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
5d70: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
5d80: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
5d90: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
5da0: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
5db0: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
5dc0: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
5dd0: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
5de0: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
5df0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
5e00: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
5e10: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
5e20: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
5e30: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
5e40: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
5e50: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
5e60: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
5e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
5e80: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
5e90: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
5ea0: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
5eb0: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
5ec0: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
5ed0: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
5ee0: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
5ef0: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
5f00: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
5f10: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
5f20: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5f40: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
5f50: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
5f60: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
5f70: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
5f80: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
5f90: 70 61 63 65 5b 32 30 30 5d 3b 20 20 20 20 20 20  pace[200];      
5fa0: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
5fb0: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
5fc0: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
5fd0: 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72  c */.  char *pFr
5fe0: 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ee = 0;..  if( p
5ff0: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
6000: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
6010: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
6020: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
6030: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
6040: 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20  dRecord(.       
6050: 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c   pCur->pKeyInfo,
6060: 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
6070: 61 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a  aSpace), &pFree.
6080: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
6090: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
60a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
60b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
60c0: 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
60d0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
60e0: 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49  t)nKey, pKey, pI
60f0: 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20  dxKey);.    if( 
6100: 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d  pIdxKey->nField=
6110: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
6120: 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e  te3DbFree(pCur->
6130: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46  pKeyInfo->db, pF
6140: 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ree);.      retu
6150: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6160: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
6170: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
6180: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
6190: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
61a0: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
61b0: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
61c0: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
61d0: 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
61e0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
61f0: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d  (pCur->pKeyInfo-
6200: 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d  >db, pFree);.  }
6210: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6220: 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74  ./*.** Restore t
6230: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
6240: 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73   position it was
6250: 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65   in (or as close
6260: 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29   to as possible)
6270: 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72  .** when saveCur
6280: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61  sorPosition() wa
6290: 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74  s called. Note t
62a0: 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65  hat this call de
62b0: 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61  letes the .** sa
62c0: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ved position inf
62d0: 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65  o stored by save
62e0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
62f0: 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62  , so there can b
6300: 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e.** at most one
6310: 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f   effective resto
6320: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
6330: 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61  () call after ea
6340: 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f  ch .** saveCurso
6350: 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a  rPosition()..*/.
6360: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
6370: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
6380: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
6390: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
63a0: 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b  .  int skipNext;
63b0: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
63c0: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
63d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
63e0: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
63f0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
6400: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
6410: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
6420: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
6430: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
6440: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
6450: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
6460: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
6470: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
6480: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
6490: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70  ->nKey, 0, &skip
64a0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
64b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
64c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
64d0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
64e0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
64f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
6500: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6510: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
6520: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
6530: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43  NVALID );.    pC
6540: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20  ur->skipNext |= 
6550: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  skipNext;.    if
6560: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
6570: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
6580: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
6590: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
65a0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
65b0: 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  IPNEXT;.    }.  
65c0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
65d0: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
65e0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
65f0: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
6600: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
6610: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
6620: 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43     btreeRestoreC
6630: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
6640: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
6650: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
6660: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
6670: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
6680: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
6690: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68   the position wh
66a0: 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61  ere.** it was la
66b0: 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61  st placed, or ha
66c0: 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74  s been invalidat
66d0: 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  ed for any other
66e0: 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73   reason..** Curs
66f0: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
6700: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
6710: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69  re pointing at i
6720: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a  s deleted out.**
6730: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
6740: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
6750: 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73  Cursor might als
6760: 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65  o move if a btre
6770: 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63  e.** is rebalanc
6780: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  ed..**.** Callin
6790: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  g this routine w
67a0: 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f  ith a NULL curso
67b0: 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  r pointer return
67c0: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55  s false..**.** U
67d0: 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  se the separate 
67e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
67f0: 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74  orRestore() rout
6800: 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ine to restore a
6810: 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20   cursor.** back 
6820: 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  to where it ough
6830: 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20  t to be if this 
6840: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
6850: 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
6860: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
6870: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
6880: 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
6890: 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  n pCur->eState!=
68a0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
68b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
68c0: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
68d0: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
68e0: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
68f0: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
6900: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
6910: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
6920: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
6930: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
6940: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
6950: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
6960: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
6970: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
6980: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
6990: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
69a0: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
69b0: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
69c0: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
69d0: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
69e0: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
69f0: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
6a00: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
6a10: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
6a20: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
6a30: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
6a40: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
6a50: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
6a60: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
6a70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6a80: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
6a90: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
6aa0: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
6ab0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
6ac0: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
6ad0: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
6ae0: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
6af0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
6b00: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
6b10: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
6b20: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
6b30: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6b40: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
6b50: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
6b60: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
6b70: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
6b80: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6b90: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
6ba0: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
6bb0: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
6bc0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
6bd0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
6be0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
6bf0: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
6c00: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
6c10: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
6c20: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
6c30: 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   );.    *pDiffer
6c40: 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a  entRow = 0;.  }.
6c50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6c60: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
6c70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
6c80: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ACUUM./*.** Give
6c90: 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  n a page number 
6ca0: 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74  of a regular dat
6cb0: 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75  abase page, retu
6cc0: 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  rn the page.** n
6cd0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f  umber for the po
6ce0: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74  inter-map page t
6cf0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
6d00: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a   entry for the.*
6d10: 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d  * input page num
6d20: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ber..**.** Retur
6d30: 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64  n 0 (not a valid
6d40: 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d   page) for pgno=
6d50: 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  =1 since there i
6d60: 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20  s.** no pointer 
6d70: 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77  map associated w
6d80: 69 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65  ith page 1.  The
6d90: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
6da0: 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72   logic.** requir
6db0: 65 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61  es that ptrmapPa
6dc0: 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f  geno(*,1)!=1..*/
6dd0: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72  .static Pgno ptr
6de0: 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72  mapPageno(BtShar
6df0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
6e00: 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  no){.  int nPage
6e10: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50  sPerMapPage;.  P
6e20: 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74  gno iPtrMap, ret
6e30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6e40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6e50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
6e60: 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74  if( pgno<2 ) ret
6e70: 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50  urn 0;.  nPagesP
6e80: 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74  erMapPage = (pBt
6e90: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b  ->usableSize/5)+
6ea0: 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28  1;.  iPtrMap = (
6eb0: 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65  pgno-2)/nPagesPe
6ec0: 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20  rMapPage;.  ret 
6ed0: 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65  = (iPtrMap*nPage
6ee0: 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32  sPerMapPage) + 2
6ef0: 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45  ; .  if( ret==PE
6f00: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
6f10: 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b  pBt) ){.    ret+
6f20: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
6f30: 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ret;.}../*.** Wr
6f40: 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ite an entry int
6f50: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
6f60: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  p..**.** This ro
6f70: 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68  utine updates th
6f80: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
6f90: 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  try for page num
6fa0: 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20  ber 'key'.** so 
6fb0: 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20  that it maps to 
6fc0: 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64  type 'eType' and
6fd0: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
6fe0: 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a  ber 'pgno'..**.*
6ff0: 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69  * If *pRC is ini
7000: 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20  tially non-zero 
7010: 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20  (non-SQLITE_OK) 
7020: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
7030: 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  e is.** a no-op.
7040: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
7050: 63 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70  curs, the approp
7060: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
7070: 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
7080: 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61  nto *pRC..*/.sta
7090: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
70a0: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
70b0: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
70c0: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
70d0: 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  t, int *pRC){.  
70e0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
70f0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
7100: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75   map page */.  u
7110: 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20  8 *pPtrmap;     
7120: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7130: 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67  map data */.  Pg
7140: 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  no iPtrmap;     
7150: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
7160: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ap page number *
7170: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
7180: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
7190: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  in pointer map p
71a0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
71b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
71c0: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
71d0: 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a  ubfunctions */..
71e0: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
71f0: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
7200: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7210: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
7220: 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65  ;.  /* The maste
7230: 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e  r-journal page n
7240: 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72  umber must never
7250: 20 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f   be used as a po
7260: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
7270: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50  /.  assert( 0==P
7280: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
7290: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  , PENDING_BYTE_P
72a0: 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  AGE(pBt)) );..  
72b0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
72c0: 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28  oVacuum );.  if(
72d0: 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a   key==0 ){.    *
72e0: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
72f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
7300: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74  eturn;.  }.  iPt
7310: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
7320: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
7330: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
7340: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
7350: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
7360: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
7370: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7380: 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
7390: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
73a0: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
73b0: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
73c0: 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f  p, key);.  if( o
73d0: 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a  ffset<0 ){.    *
73e0: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
73f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67  RUPT_BKPT;.    g
7400: 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b  oto ptrmap_exit;
7410: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
7420: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
7430: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
7440: 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28  );.  pPtrmap = (
7450: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
7460: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
7470: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
7480: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
7490: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
74a0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
74b0: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
74c0: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
74d0: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
74e0: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
74f0: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
7500: 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69   *pRC= rc = sqli
7510: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
7520: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
7530: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7540: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f  .      pPtrmap[o
7550: 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a  ffset] = eType;.
7560: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
7570: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
7580: 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  ], parent);.    
7590: 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78  }.  }..ptrmap_ex
75a0: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  it:.  sqlite3Pag
75b0: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
75c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
75d0: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
75e0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
75f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7600: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
7610: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
7620: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
7630: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
7640: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
7650: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
7660: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
7670: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
7680: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
7690: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
76a0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
76b0: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
76c0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
76d0: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
76e0: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
76f0: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
7700: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
7710: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
7720: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
7730: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
7740: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
7750: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
7760: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
7770: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
7780: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
7790: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
77a0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
77b0: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
77c0: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
77d0: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
77e0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
77f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7800: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
7810: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50  >mutex) );..  iP
7820: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
7830: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
7840: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
7850: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
7860: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
7870: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
7880: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
7890: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
78a0: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
78b0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
78c0: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
78d0: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
78e0: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
78f0: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
7900: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  set<0 ){.    sql
7910: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
7920: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  DbPage);.    ret
7930: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7940: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
7950: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
7960: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
7970: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73  eSize-5 );.  ass
7980: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
7990: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
79a0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
79b0: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
79c0: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
79d0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
79e0: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
79f0: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
7a00: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
7a10: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
7a20: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
7a30: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7a40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7a50: 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
7a60: 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f   defined SQLITE_
7a70: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
7a80: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  */.  #define ptr
7a90: 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72  mapPut(w,x,y,z,r
7aa0: 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  c).  #define ptr
7ab0: 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20  mapGet(w,x,y,z) 
7ac0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
7ad0: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66  ine ptrmapPutOvf
7ae0: 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23  lPtr(x, y, rc).#
7af0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  endif../*.** Giv
7b00: 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20  en a btree page 
7b10: 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78  and a cell index
7b20: 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69   (0 means the fi
7b30: 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74  rst cell on.** t
7b40: 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73  he page, 1 means
7b50: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c   the second cell
7b60: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20  , and so forth) 
7b70: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
7b80: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  .** to the cell 
7b90: 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  content..**.** T
7ba0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
7bb0: 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73  s only for pages
7bc0: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e   that do not con
7bd0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
7be0: 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lls..*/.#define 
7bf0: 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a  findCell(P,I) \.
7c00: 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20    ((P)->aData + 
7c10: 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26  ((P)->maskPage &
7c20: 20 67 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e   get2byte(&(P)->
7c30: 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29  aCellIdx[2*(I)])
7c40: 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  ))../*.** This i
7c50: 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72  s common tail pr
7c60: 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72  ocessing for btr
7c70: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
7c80: 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72   and.** btreePar
7c90: 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29  seCellPtrIndex()
7ca0: 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68   for the case wh
7cb0: 65 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73  en the cell does
7cc0: 20 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c   not fit entirel
7cd0: 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65  y.** on a single
7ce0: 20 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d   B-tree page.  M
7cf0: 61 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61 64  ake necessary ad
7d00: 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65  justments to the
7d10: 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72   CellInfo.** str
7d20: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
7d30: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
7d40: 45 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  E void btreePars
7d50: 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46  eCellAdjustSizeF
7d60: 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65  orOverflow(.  Me
7d70: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
7d80: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
7d90: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
7da0: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
7db0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7dc0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
7dd0: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
7de0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
7df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
7e00: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
7e10: 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66  re */.){.  /* If
7e20: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
7e30: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
7e40: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
7e50: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
7e60: 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68    ** to decide h
7e70: 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65  ow much to store
7e80: 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77   locally and how
7e90: 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f   much to spill o
7ea0: 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f  nto.  ** overflo
7eb0: 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74  w pages.  The st
7ec0: 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e  rategy is to min
7ed0: 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74  imize the amount
7ee0: 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20   of unused.  ** 
7ef0: 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f  space on overflo
7f00: 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65  w pages while ke
7f10: 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74  eping the amount
7f20: 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67   of local storag
7f30: 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65  e.  ** in betwee
7f40: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
7f50: 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20  axLocal..  **.  
7f60: 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61  ** Warning:  cha
7f70: 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76  nging the way ov
7f80: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69  erflow payload i
7f90: 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  s distributed in
7fa0: 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69   any.  ** way wi
7fb0: 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
7fc0: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c  incompatible fil
7fd0: 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20  e format..  */. 
7fe0: 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20   int minLocal;  
7ff0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e  /* Minimum amoun
8000: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
8010: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69  d locally */.  i
8020: 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a  nt maxLocal;  /*
8030: 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Maximum amount 
8040: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
8050: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74  locally */.  int
8060: 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f   surplus;   /* O
8070: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
8080: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f  available for lo
8090: 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a  cal storage */..
80a0: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
80b0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
80c0: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  maxLocal = pPage
80d0: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75  ->maxLocal;.  su
80e0: 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c  rplus = minLocal
80f0: 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c   + (pInfo->nPayl
8100: 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25  oad - minLocal)%
8110: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
8120: 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65  bleSize-4);.  te
8130: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
8140: 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  =maxLocal );.  t
8150: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
8160: 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ==maxLocal+1 );.
8170: 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d    if( surplus <=
8180: 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20   maxLocal ){.   
8190: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
81a0: 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20   (u16)surplus;. 
81b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66   }else{.    pInf
81c0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
81d0: 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20  )minLocal;.  }. 
81e0: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
81f0: 77 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f  w = (u16)(&pInfo
8200: 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f  ->pPayload[pInfo
8210: 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c  ->nLocal] - pCel
8220: 6c 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  l);.  pInfo->nSi
8230: 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  ze = pInfo->iOve
8240: 72 66 6c 6f 77 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a  rflow + 4;.}../*
8250: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
8260: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
8270: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
8280: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50  f the MemPage.xP
8290: 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65  arseCell().** me
82a0: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73  thod..**.** Pars
82b0: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
82c0: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
82d0: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
82e0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
82f0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
8300: 74 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20  tr()        =>  
8310: 20 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61   table btree lea
8320: 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65  f nodes.** btree
8330: 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f  ParseCellNoPaylo
8340: 61 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65  ad()  =>   table
8350: 20 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20   btree internal 
8360: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
8370: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
8380: 29 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62  )   =>   index b
8390: 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a  tree nodes.**.**
83a0: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
83b0: 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f   wrapper functio
83c0: 6e 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  n btreeParseCell
83d0: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
83e0: 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65  r.** all MemPage
83f0: 20 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20   types and that 
8400: 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63  references the c
8410: 65 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74  ell by index rat
8420: 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70  her than.** by p
8430: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
8440: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
8450: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
8460: 64 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d(.  MemPage *pP
8470: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
8480: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
8490: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
84a0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
84b0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
84c0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
84d0: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
84e0: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
84f0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
8500: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
8510: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8520: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8530: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8540: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
8550: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20  ge->leaf==0 );. 
8560: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8570: 6e 6f 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 61  noPayload );.  a
8580: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
8590: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
85a0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20  .  pInfo->nSize 
85b0: 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28  = 4 + getVarint(
85c0: 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a  &pCell[4], (u64*
85d0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
85e0: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
85f0: 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e  d = 0;.  pInfo->
8600: 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49  nLocal = 0;.  pI
8610: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
8620: 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61   0;.  pInfo->pPa
8630: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65 74  yload = 0;.  ret
8640: 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  urn;.}.static vo
8650: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
8660: 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20  lPtr(.  MemPage 
8670: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
8680: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
8690: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
86a0: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
86b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
86c0: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
86d0: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
86e0: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
86f0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
8700: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
8710: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
8720: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8730: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
8740: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
8750: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
8760: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8770: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
8780: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  ll payload */.  
8790: 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20  u64 iKey;       
87a0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
87b0: 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20 2a  cted Key value *
87c0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
87d0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
87e0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
87f0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
8800: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
8810: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
8820: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
8830: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
8840: 7c 7c 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c  || pPage->noPayl
8850: 6f 61 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  oad );.  assert(
8860: 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61   pPage->noPayloa
8870: 64 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  d==0 );.  assert
8880: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
8890: 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eaf );.  assert(
88a0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
88b0: 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74  Size==0 );.  pIt
88c0: 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f  er = pCell;..  /
88d0: 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b  * The next block
88e0: 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75 69   of code is equi
88f0: 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a  valent to:.  **.
8900: 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b    **     pIter +
8910: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49  = getVarint32(pI
8920: 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  ter, nPayload);.
8930: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f    **.  ** The co
8940: 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f  de is inlined to
8950: 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f   avoid a functio
8960: 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e  n call..  */.  n
8970: 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72  Payload = *pIter
8980: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
8990: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
89a0: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
89b0: 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  8];.    nPayload
89c0: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
89d0: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
89e0: 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29   = (nPayload<<7)
89f0: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
8a00: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
8a10: 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78 38 30  ( (*pIter)>=0x80
8a20: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
8a30: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
8a40: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
8a50: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
8a60: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
8a70: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
8a80: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
8a90: 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29 26 70  (pIter, (u64*)&p
8aa0: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a  Info->nKey);.  *
8ab0: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20  *.  ** The code 
8ac0: 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76  is inlined to av
8ad0: 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  oid a function c
8ae0: 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79  all..  */.  iKey
8af0: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
8b00: 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20   iKey>=0x80 ){. 
8b10: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
8b20: 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65  Iter[7];.    iKe
8b30: 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 77  y &= 0x7f;.    w
8b40: 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20 69  hile(1){.      i
8b50: 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20  Key = (iKey<<7) 
8b60: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
8b70: 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  7f);.      if( (
8b80: 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29 20 62  *pIter)<0x80 ) b
8b90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
8ba0: 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20  pIter>=pEnd ){. 
8bb0: 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69         iKey = (i
8bc0: 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74  Key<<8) | *++pIt
8bd0: 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  er;.        brea
8be0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
8bf0: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
8c00: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d  .  pInfo->nKey =
8c10: 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20   *(i64*)&iKey;. 
8c20: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
8c30: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
8c40: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
8c50: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
8c60: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
8c70: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
8c80: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
8c90: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
8ca0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
8cb0: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
8cc0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
8cd0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
8ce0: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
8cf0: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
8d00: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
8d10: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
8d20: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
8d30: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
8d40: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
8d50: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
8d60: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
8d70: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
8d80: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
8d90: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
8da0: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
8db0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
8dc0: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
8dd0: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72      pInfo->iOver
8de0: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  flow = 0;.  }els
8df0: 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  e{.    btreePars
8e00: 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46  eCellAdjustSizeF
8e10: 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65  orOverflow(pPage
8e20: 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b  , pCell, pInfo);
8e30: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
8e40: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
8e50: 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d  lPtrIndex(.  Mem
8e60: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
8e70: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
8e80: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
8e90: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8eb0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
8ec0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
8ed0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
8ee0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
8ef0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
8f00: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
8f10: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
8f20: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
8f30: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
8f40: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
8f50: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
8f60: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
8f70: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
8f80: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
8f90: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8fa0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
8fb0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
8fc0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
8fd0: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
8fe0: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
8ff0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
9000: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
9010: 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61   pPage->noPayloa
9020: 64 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20  d==0 );.  pIter 
9030: 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d  = pCell + pPage-
9040: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
9050: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74   nPayload = *pIt
9060: 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f  er;.  if( nPaylo
9070: 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ad>=0x80 ){.    
9080: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
9090: 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f  r[8];.    nPaylo
90a0: 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ad &= 0x7f;.    
90b0: 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  do{.      nPaylo
90c0: 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c  ad = (nPayload<<
90d0: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
90e0: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
90f0: 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78  le( *(pIter)>=0x
9100: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
9110: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
9120: 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  +;.  pInfo->nKey
9130: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
9140: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
9150: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
9160: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70  fo->pPayload = p
9170: 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65  Iter;.  testcase
9180: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
9190: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
91a0: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
91b0: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
91c0: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
91d0: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
91e0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
91f0: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
9200: 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61  (easy) common ca
9210: 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74  se where the ent
9220: 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73  ire payload fits
9230: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  .    ** on the l
9240: 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f  ocal page.  No o
9250: 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69  verflow is requi
9260: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
9270: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e  pInfo->nSize = n
9280: 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28  Payload + (u16)(
9290: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
92a0: 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e      if( pInfo->n
92b0: 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e  Size<4 ) pInfo->
92c0: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70  nSize = 4;.    p
92d0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
92e0: 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  u16)nPayload;.  
92f0: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
9300: 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ow = 0;.  }else{
9310: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
9320: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
9330: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
9340: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
9350: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
9360: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
9370: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
9380: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
9390: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
93a0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
93b0: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
93c0: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
93d0: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
93e0: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
93f0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
9400: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
9410: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
9420: 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50  /.){.  pPage->xP
9430: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
9440: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
9450: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
9460: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
9470: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
9480: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  are implementati
9490: 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ons of the MemPa
94a0: 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20  ge.xCellSize.** 
94b0: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  method..**.** Co
94c0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
94d0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
94e0: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
94f0: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
9500: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
9510: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
9520: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
9530: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
9540: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
9550: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
9560: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
9570: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
9580: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
9590: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
95a0: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ell pointer..**.
95b0: 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  ** cellSizePtrNo
95c0: 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20  Payload()    => 
95d0: 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c    table internal
95e0: 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69   nodes.** cellSi
95f0: 7a 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20  zePtr()         
9600: 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64      =>   all ind
9610: 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65  ex nodes & table
9620: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73   leaf nodes.*/.s
9630: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
9640: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
9650: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
9660: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
9670: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
9680: 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20  hildPtrSize; /* 
9690: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
96a0: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
96b0: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
96e0: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
96f0: 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20  varint */.  u32 
9700: 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9720: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c       /* Size val
9730: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
9740: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
9750: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
9760: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
9770: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
9780: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
9790: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
97a0: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
97b0: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
97c0: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
97d0: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
97e0: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
97f0: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
9800: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
9810: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
9820: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
9830: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
9840: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
9850: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
9860: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
9870: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50   debuginfo;.  pP
9880: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
9890: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
98a0: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
98b0: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
98c0: 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d 3d 30  ge->noPayload==0
98d0: 20 29 3b 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70   );.  nSize = *p
98e0: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a  Iter;.  if( nSiz
98f0: 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70  e>=0x80 ){.    p
9900: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b  End = &pIter[8];
9910: 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78  .    nSize &= 0x
9920: 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  7f;.    do{.    
9930: 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65    nSize = (nSize
9940: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9950: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
9960: 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d  hile( *(pIter)>=
9970: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
9980: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
9990: 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  r++;.  if( pPage
99a0: 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
99b0: 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69  /* pIter now poi
99c0: 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69  nts at the 64-bi
99d0: 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61  t integer key va
99e0: 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20  lue, a variable 
99f0: 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69  length .    ** i
9a00: 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c  nteger. The foll
9a10: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65  owing block move
9a20: 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74  s pIter to point
9a30: 20 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79   at the first by
9a40: 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74  te.    ** past t
9a50: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65  he end of the ke
9a60: 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20  y value. */.    
9a70: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d  pEnd = &pIter[9]
9a80: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70  ;.    while( (*p
9a90: 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20  Iter++)&0x80 && 
9aa0: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
9ab0: 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53  }.  testcase( nS
9ac0: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
9ad0: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
9ae0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
9af0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
9b00: 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61    if( nSize<=pPa
9b10: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
9b20: 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33      nSize += (u3
9b30: 32 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  2)(pIter - pCell
9b40: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  );.    if( nSize
9b50: 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a  <4 ) nSize = 4;.
9b60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
9b70: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
9b80: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
9b90: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
9ba0: 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e  l + (nSize - min
9bb0: 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d  Local) % (pPage-
9bc0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
9bd0: 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63   - 4);.    testc
9be0: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
9bf0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
9c00: 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69     testcase( nSi
9c10: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
9c20: 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  cal+1 );.    if(
9c30: 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61   nSize>pPage->ma
9c40: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
9c50: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
9c60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a  ;.    }.    nSiz
9c70: 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70  e += 4 + (u16)(p
9c80: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
9c90: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69   }.  assert( nSi
9ca0: 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53  ze==debuginfo.nS
9cb0: 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ize || CORRUPT_D
9cc0: 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  B );.  return (u
9cd0: 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74  16)nSize;.}.stat
9ce0: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50  ic u16 cellSizeP
9cf0: 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50  trNoPayload(MemP
9d00: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
9d10: 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49  pCell){.  u8 *pI
9d20: 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b  ter = pCell + 4;
9d30: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
9d40: 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43  over bytes of pC
9d50: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  ell */.  u8 *pEn
9d60: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
9d70: 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20  /* End mark for 
9d80: 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66  a varint */..#if
9d90: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
9da0: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
9db0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
9dc0: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
9dd0: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
9de0: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
9df0: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
9e00: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
9e10: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
9e20: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
9e30: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
9e40: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
9e50: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
9e60: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
9e70: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
9e80: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
9e90: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
9ea0: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
9eb0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
9ec0: 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d  uginfo;.  pPage-
9ed0: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
9ee0: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
9ef0: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
9f00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9f10: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
9f20: 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65  );.  pEnd = pIte
9f30: 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20  r + 9;.  while( 
9f40: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
9f50: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
9f60: 0a 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67  .  assert( debug
9f70: 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36  info.nSize==(u16
9f80: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
9f90: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
9fa0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
9fb0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
9fc0: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
9fd0: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
9fe0: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
9ff0: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
a000: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
a010: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
a020: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
a030: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
a040: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
a050: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
a060: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43  return pPage->xC
a070: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66  ellSize(pPage, f
a080: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
a090: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
a0a0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
a0b0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
a0c0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
a0d0: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
a0e0: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
a0f0: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
a100: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
a110: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
a120: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
a130: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
a140: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
a150: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
a160: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f   void ptrmapPutO
a170: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
a180: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
a190: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43  , int *pRC){.  C
a1a0: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
a1b0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
a1c0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  n;.  assert( pCe
a1d0: 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  ll!=0 );.  pPage
a1e0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
a1f0: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
a200: 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
a210: 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50  verflow ){.    P
a220: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
a230: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
a240: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
a250: 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
a260: 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52  ->pBt, ovfl, PTR
a270: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
a280: 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29  Page->pgno, pRC)
a290: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
a2a0: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
a2b0: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
a2c0: 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65  .  All Cells are
a2d0: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
a2e0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
a2f0: 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70   and all free sp
a300: 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64  ace is collected
a310: 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67   into one.** big
a320: 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63   FreeBlk that oc
a330: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20  curs in between 
a340: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63  the header and c
a350: 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61  ell.** pointer a
a360: 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c  rray and the cel
a370: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
a380: 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f  **.** EVIDENCE-O
a390: 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33 38  F: R-44582-60138
a3a0: 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d   SQLite may from
a3b0: 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72 65   time to time re
a3c0: 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d  organize a.** b-
a3d0: 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68 61  tree page so tha
a3e0: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66  t there are no f
a3f0: 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61  reeblocks or fra
a400: 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c  gment bytes, all
a410: 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65 73  .** unused bytes
a420: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
a430: 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65  n the unallocate
a440: 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c 20  d space region, 
a450: 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73  and all.** cells
a460: 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67 68   are packed tigh
a470: 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f  tly at the end o
a480: 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  f the page..*/.s
a490: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
a4a0: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
a4b0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
a4c0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
a4d0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
a4e0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
a4f0: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
a500: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
a510: 73 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65  s of the i-th ce
a520: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ll */.  int hdr;
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
a550: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
a560: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
a570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a580: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
a590: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
a5a0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
a5b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
a5c0: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
a5d0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
a5e0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
a5f0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
a600: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
a610: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
a620: 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
a630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
a640: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
a650: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
a660: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
a670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a680: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
a690: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
a6a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
a6b0: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
a6c0: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
a6d0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
a6e0: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
a6f0: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
a700: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
a710: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73  unsigned char *s
a720: 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  rc;        /* So
a730: 75 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20  urce of content 
a740: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69  */.  int iCellFi
a750: 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  rst;            
a760: 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62  /* First allowab
a770: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
a780: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74  .  int iCellLast
a790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
a7a0: 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63   Last possible c
a7b0: 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20  ell index */... 
a7c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a7d0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
a7e0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
a7f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
a800: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
a810: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a820: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
a830: 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  <= SQLITE_MAX_PA
a840: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73  GE_SIZE );.  ass
a850: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
a860: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
a870: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
a880: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
a890: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
a8a0: 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63   temp = 0;.  src
a8b0: 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d   = data = pPage-
a8c0: 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
a8d0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
a8e0: 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ;.  cellOffset =
a8f0: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
a900: 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50  et;.  nCell = pP
a910: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
a920: 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74  sert( nCell==get
a930: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
a940: 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  3]) );.  usableS
a950: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
a960: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
a970: 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a  cbrk = usableSiz
a980: 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20  e;.  iCellFirst 
a990: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
a9a0: 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c  *nCell;.  iCellL
a9b0: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
a9c0: 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   - 4;.  for(i=0;
a9d0: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
a9e0: 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20      u8 *pAddr;  
a9f0: 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
aa00: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
aa10: 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61     pAddr = &data
aa20: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a  [cellOffset + i*
aa30: 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  2];.    pc = get
aa40: 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20  2byte(pAddr);.  
aa50: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
aa60: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
aa70: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
aa80: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
aa90: 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74   /* These condit
aaa0: 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64  ions have alread
aab0: 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20  y been verified 
aac0: 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  in btreeInitPage
aad0: 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50 52 41  ().    ** if PRA
aae0: 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68  GMA cell_size_ch
aaf0: 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20  eck=ON..    */. 
ab00: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
ab10: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
ab20: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
ab30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
ab40: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
ab50: 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d      assert( pc>=
ab60: 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63  iCellFirst && pc
ab70: 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  <=iCellLast );. 
ab80: 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65 2d     size = pPage-
ab90: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
aba0: 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20  , &src[pc]);.   
abb0: 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20   cbrk -= size;. 
abc0: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
abd0: 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a  lFirst || pc+siz
abe0: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
abf0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ac00: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
ac10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
ac20: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
ac30: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
ac40: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
ac50: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
ac60: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
ac70: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
ac80: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
ac90: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
aca0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
acb0: 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20   cbrk);.    if( 
acc0: 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  temp==0 ){.     
acd0: 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66   int x;.      if
ace0: 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e  ( cbrk==pc ) con
acf0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d  tinue;.      tem
ad00: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
ad10: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
ad20: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
ad30: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
ad40: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
ad50: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74  .      memcpy(&t
ad60: 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d  emp[x], &data[x]
ad70: 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20  , (cbrk+size) - 
ad80: 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20  x);.      src = 
ad90: 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  temp;.    }.    
ada0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72  memcpy(&data[cbr
adb0: 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69  k], &src[pc], si
adc0: 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ze);.  }.  asser
add0: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
ade0: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
adf0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
ae00: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
ae10: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
ae20: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
ae30: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
ae40: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
ae50: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
ae60: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
ae70: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ae80: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
ae90: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
aea0: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
aeb0: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
aec0: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
aed0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
aee0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
aef0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
af00: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
af10: 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69  arch the free-li
af20: 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66  st on page pPg f
af30: 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72  or space to stor
af40: 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62  e a cell nByte b
af50: 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e  ytes in.** size.
af60: 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66   If one can be f
af70: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70  ound, return a p
af80: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70  ointer to the sp
af90: 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  ace and remove i
afa0: 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72  t.** from the fr
afb0: 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  ee-list..**.** I
afc0: 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70  f no suitable sp
afd0: 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ace can be found
afe0: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
aff0: 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  t, return NULL..
b000: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
b010: 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63  ion may detect c
b020: 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e  orruption within
b030: 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70   pPg.  If corrup
b040: 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63  tion is.** detec
b050: 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73  ted then *pRc is
b060: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43   set to SQLITE_C
b070: 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20  ORRUPT and NULL 
b080: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
b090: 2a 2a 20 49 66 20 61 20 73 6c 6f 74 20 6f 66 20  ** If a slot of 
b0a0: 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62  at least nByte b
b0b0: 79 74 65 73 20 69 73 20 66 6f 75 6e 64 20 62 75  ytes is found bu
b0c0: 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  t cannot be used
b0d0: 20 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68 65   because .** the
b0e0: 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 61  re are already a
b0f0: 74 20 6c 65 61 73 74 20 36 30 20 66 72 61 67 6d  t least 60 fragm
b100: 65 6e 74 65 64 20 62 79 74 65 73 20 6f 6e 20 74  ented bytes on t
b110: 68 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  he page, return 
b120: 4e 55 4c 4c 2e 0a 2a 2a 20 49 6e 20 74 68 69 73  NULL..** In this
b130: 20 63 61 73 65 2c 20 69 66 20 70 62 44 65 66 72   case, if pbDefr
b140: 61 67 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ag parameter is 
b150: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65 74 20 2a 70  not NULL, set *p
b160: 62 44 65 66 72 61 67 20 74 6f 20 74 72 75 65 2e  bDefrag to true.
b170: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70  .*/.static u8 *p
b180: 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50  ageFindSlot(MemP
b190: 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42  age *pPg, int nB
b1a0: 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 2c 20 69  yte, int *pRc, i
b1b0: 6e 74 20 2a 70 62 44 65 66 72 61 67 29 7b 0a 20  nt *pbDefrag){. 
b1c0: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
b1d0: 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
b1e0: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
b1f0: 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
b200: 3b 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20  ;.  int iAddr;. 
b210: 20 69 6e 74 20 70 63 3b 0a 20 20 69 6e 74 20 75   int pc;.  int u
b220: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d  sableSize = pPg-
b230: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
b240: 3b 0a 0a 20 20 66 6f 72 28 69 41 64 64 72 3d 68  ;..  for(iAddr=h
b250: 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32  dr+1; (pc = get2
b260: 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64 64  byte(&aData[iAdd
b270: 72 5d 29 29 3e 30 3b 20 69 41 64 64 72 3d 70 63  r]))>0; iAddr=pc
b280: 29 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  ){.    int size;
b290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b2a0: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20  ize of the free 
b2b0: 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45  slot */.    /* E
b2c0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36  VIDENCE-OF: R-06
b2d0: 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62 6c  866-39125 Freebl
b2e0: 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20  ocks are always 
b2f0: 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72 64  connected in ord
b300: 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63  er of.    ** inc
b310: 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e 20  reasing offset. 
b320: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73  */.    if( pc>us
b330: 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63  ableSize-4 || pc
b340: 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  <iAddr+4 ){.    
b350: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
b360: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b370: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
b380: 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
b390: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d  NCE-OF: R-22710-
b3a0: 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64 20  53328 The third 
b3b0: 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65 73  and fourth bytes
b3c0: 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20   of each.    ** 
b3d0: 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61  freeblock form a
b3e0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
b3f0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
b400: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   size of the fre
b410: 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e  eblock.    ** in
b420: 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e   bytes, includin
b430: 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65 61  g the 4-byte hea
b440: 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  der. */.    size
b450: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
b460: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69  ta[pc+2]);.    i
b470: 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29  f( size>=nByte )
b480: 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  {.      int x = 
b490: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
b4a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
b4b0: 3d 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =4 );.      test
b4c0: 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20  case( x==3 );.  
b4d0: 20 20 20 20 69 66 28 20 70 63 20 3c 20 70 50 67      if( pc < pPg
b4e0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70  ->cellOffset+2*p
b4f0: 50 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a  Pg->nCell || siz
b500: 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a  e+pc > usableSiz
b510: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  e ){.        *pR
b520: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
b530: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
b540: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
b550: 20 7d 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29   }else if( x<4 )
b560: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
b570: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39  DENCE-OF: R-1149
b580: 38 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c  8-58022 In a wel
b590: 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20  l-formed b-tree 
b5a0: 70 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a  page, the total.
b5b0: 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
b5c0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72  r of bytes in fr
b5d0: 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20  agments may not 
b5e0: 65 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20  exceed 60. */.  
b5f0: 20 20 20 20 20 20 69 66 28 20 61 44 61 74 61 5b        if( aData[
b600: 68 64 72 2b 37 5d 3e 3d 36 30 20 29 7b 0a 20 20  hdr+7]>=60 ){.  
b610: 20 20 20 20 20 20 20 20 69 66 28 20 70 62 44 65          if( pbDe
b620: 66 72 61 67 20 29 20 2a 70 62 44 65 66 72 61 67  frag ) *pbDefrag
b630: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
b640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
b650: 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 52    }.        /* R
b660: 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66  emove the slot f
b670: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
b680: 74 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75  t. Update the nu
b690: 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20  mber of.        
b6a0: 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79  ** fragmented by
b6b0: 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  tes within the p
b6c0: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  age. */.        
b6d0: 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41  memcpy(&aData[iA
b6e0: 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d  ddr], &aData[pc]
b6f0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44  , 2);.        aD
b700: 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75  ata[hdr+7] += (u
b710: 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  8)x;.      }else
b720: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
b730: 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e   slot remains on
b740: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
b750: 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20  Reduce its size 
b760: 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20  to account.     
b770: 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70      ** for the p
b780: 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74  ortion used by t
b790: 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f  he new allocatio
b7a0: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  n. */.        pu
b7b0: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
b7c0: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d  +2], x);.      }
b7d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 61  .      return &a
b7e0: 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20  Data[pc + x];.  
b7f0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
b800: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  n 0;.}../*.** Al
b810: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
b820: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
b830: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
b840: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
b850: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
b860: 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69  rgument. Write i
b870: 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e  nto *pIdx the in
b880: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
b890: 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68  aData[].** of th
b8a0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
b8b0: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
b8c0: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
b8d0: 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61  QLITE_OK or.** a
b8e0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73  n error code (us
b8f0: 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52  ually SQLITE_COR
b900: 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  RUPT)..**.** The
b910: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
b920: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
b930: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
b940: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  e to make the.**
b950: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
b960: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
b970: 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d   need to defragm
b980: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
b990: 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65  bring.** all the
b9a0: 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c   space together,
b9b0: 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20   however.  This 
b9c0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f  routine will avo
b9d0: 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  id using.** the 
b9e0: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20  first two bytes 
b9f0: 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f  past the cell po
ba00: 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65  inter area since
ba10: 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73   presumably this
ba20: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  .** allocation i
ba30: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20  s being made in 
ba40: 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20  order to insert 
ba50: 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77  a new cell, so w
ba60: 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65  e will.** also e
ba70: 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20  nd up needing a 
ba80: 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
ba90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
baa0: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
bab0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
bac0: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49  t nByte, int *pI
bad0: 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  dx){.  const int
bae0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
baf0: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
bb00: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
bb10: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
bb20: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
bb30: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
bb40: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
bb50: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
bb60: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
bb70: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
bba0: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
bbb0: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63  area */.  int rc
bbc0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bbe0: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
bbf0: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67   code */.  int g
bc00: 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ap;        /* Fi
bc10: 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20  rst byte of gap 
bc20: 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69  between cell poi
bc30: 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63  nters and cell c
bc40: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61  ontent */.  .  a
bc50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
bc60: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
bc70: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
bc80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
bc90: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
bca0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
bcb0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
bcc0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
bcd0: 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20  ssert( nByte>=0 
bce0: 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  );  /* Minimum c
bcf0: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
bd00: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
bd10: 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29  ->nFree>=nByte )
bd20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
bd30: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
bd40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
bd50: 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67 65  te < (int)(pPage
bd60: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
bd70: 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  e-8) );..  asser
bd80: 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  t( pPage->cellOf
bd90: 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32  fset == hdr + 12
bda0: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
bdb0: 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67   );.  gap = pPag
bdc0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
bdd0: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
bde0: 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d 36    assert( gap<=6
bdf0: 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49  5536 );.  /* EVI
be00: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35  DENCE-OF: R-2935
be10: 36 2d 30 32 33 39 31 20 49 66 20 74 68 65 20 64  6-02391 If the d
be20: 61 74 61 62 61 73 65 20 75 73 65 73 20 61 20 36  atabase uses a 6
be30: 35 35 33 36 2d 62 79 74 65 20 70 61 67 65 20 73  5536-byte page s
be40: 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ize.  ** and the
be50: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
be60: 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73 75  is zero (the usu
be70: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65 73  al value for res
be80: 65 72 76 65 64 20 73 70 61 63 65 29 0a 20 20 2a  erved space).  *
be90: 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 20  * then the cell 
bea0: 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20 6f  content offset o
beb0: 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  f an empty page 
bec0: 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35 33  wants to be 6553
bed0: 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c  6..  ** However,
bee0: 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 69 73   that integer is
bef0: 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65   too large to be
bf00: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d 62   stored in a 2-b
bf10: 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a  yte unsigned.  *
bf20: 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61 20  * integer, so a 
bf30: 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75 73  value of 0 is us
bf40: 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  ed in its place.
bf50: 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   */.  top = get2
bf60: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
bf70: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66 28  a[hdr+5]);.  if(
bf80: 20 67 61 70 3e 74 6f 70 20 7c 7c 20 4e 45 56 45   gap>top || NEVE
bf90: 52 28 28 75 33 32 29 74 6f 70 3e 70 50 61 67 65  R((u32)top>pPage
bfa0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
bfb0: 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  e) ){.    /* The
bfc0: 20 4e 45 56 45 52 28 29 20 69 73 20 62 65 63 61   NEVER() is beca
bfd0: 75 73 65 20 61 20 6f 76 65 72 73 69 7a 65 20 22  use a oversize "
bfe0: 74 6f 70 22 20 76 61 6c 75 65 20 77 69 6c 6c 20  top" value will 
bff0: 62 65 20 62 6c 6f 63 6b 65 64 20 66 72 6f 6d 0a  be blocked from.
c000: 20 20 20 20 2a 2a 20 72 65 61 63 68 69 6e 67 20      ** reaching 
c010: 74 68 69 73 20 70 6f 69 6e 74 20 62 79 20 62 74  this point by bt
c020: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 6f 72  reeInitPage() or
c030: 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
c040: 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 72 65 74  age() */.    ret
c050: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c060: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
c070: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 65  /* If there is e
c080: 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74 77  nough space betw
c090: 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20  een gap and top 
c0a0: 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c  for one more cel
c0b0: 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61  l pointer.  ** a
c0c0: 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73 65  rray entry offse
c0d0: 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66 72  t, and if the fr
c0e0: 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d  eelist is not em
c0f0: 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68  pty, then search
c100: 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69   the.  ** freeli
c110: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
c120: 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65   free slot big e
c130: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
c140: 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20   the request..  
c150: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
c160: 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+2==top );.  t
c170: 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d  estcase( gap+1==
c180: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
c190: 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20  e( gap==top );. 
c1a0: 20 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20   if( gap+2<=top 
c1b0: 26 26 20 28 64 61 74 61 5b 68 64 72 2b 31 5d 20  && (data[hdr+1] 
c1c0: 7c 7c 20 64 61 74 61 5b 68 64 72 2b 32 5d 29 20  || data[hdr+2]) 
c1d0: 29 7b 0a 20 20 20 20 69 6e 74 20 62 44 65 66 72  ){.    int bDefr
c1e0: 61 67 20 3d 20 30 3b 0a 20 20 20 20 75 38 20 2a  ag = 0;.    u8 *
c1f0: 70 53 70 61 63 65 20 3d 20 70 61 67 65 46 69 6e  pSpace = pageFin
c200: 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42 79  dSlot(pPage, nBy
c210: 74 65 2c 20 26 72 63 2c 20 26 62 44 65 66 72 61  te, &rc, &bDefra
c220: 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
c230: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
c240: 69 66 28 20 62 44 65 66 72 61 67 20 29 20 67 6f  if( bDefrag ) go
c250: 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f 70 61  to defragment_pa
c260: 67 65 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61  ge;.    if( pSpa
c270: 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ce ){.      asse
c280: 72 74 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61  rt( pSpace>=data
c290: 20 26 26 20 28 70 53 70 61 63 65 20 2d 20 64 61   && (pSpace - da
c2a0: 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20  ta)<65536 );.   
c2b0: 20 20 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29     *pIdx = (int)
c2c0: 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b  (pSpace - data);
c2d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
c2e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
c2f0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71   }..  /* The req
c300: 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62  uest could not b
c310: 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e  e fulfilled usin
c320: 67 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f  g a freelist slo
c330: 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74  t.  Check.  ** t
c340: 6f 20 73 65 65 20 69 66 20 64 65 66 72 61 67 6d  o see if defragm
c350: 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65  entation is nece
c360: 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65  ssary..  */.  te
c370: 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42  stcase( gap+2+nB
c380: 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66  yte==top );.  if
c390: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f  ( gap+2+nByte>to
c3a0: 70 20 29 7b 0a 20 64 65 66 72 61 67 6d 65 6e 74  p ){. defragment
c3b0: 5f 70 61 67 65 3a 0a 20 20 20 20 61 73 73 65 72  _page:.    asser
c3c0: 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
c3d0: 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  0 || CORRUPT_DB 
c3e0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  );.    rc = defr
c3f0: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
c400: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
c410: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74  return rc;.    t
c420: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
c430: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
c440: 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
c450: 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29  gap+nByte<=top )
c460: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c  ;.  }...  /* All
c470: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
c480: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
c490: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
c4a0: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
c4b0: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
c4c0: 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65  ntent area.  The
c4d0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
c4e0: 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64   call has alread
c4f0: 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64  y.  ** validated
c500: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
c510: 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66  Given that the f
c520: 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64  reelist is valid
c530: 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  , there.  ** is 
c540: 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20  no way that the 
c550: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65  allocation can e
c560: 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e  xtend off the en
c570: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20  d of the page.. 
c580: 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29   ** The assert()
c590: 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
c5a0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e  the previous sen
c5b0: 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f  tence..  */.  to
c5c0: 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75  p -= nByte;.  pu
c5d0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
c5e0: 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73  +5], top);.  ass
c5f0: 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c  ert( top+nByte <
c600: 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
c610: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
c620: 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a  .  *pIdx = top;.
c630: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c640: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
c650: 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66  urn a section of
c660: 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
c670: 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  a to the freelis
c680: 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  t..** The first 
c690: 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20  byte of the new 
c6a0: 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50  free block is pP
c6b0: 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72  age->aData[iStar
c6c0: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
c6d0: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
c6e0: 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a  is iSize bytes..
c6f0: 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66  **.** Adjacent f
c700: 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f  reeblocks are co
c710: 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e  alesced..**.** N
c720: 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20 74 68  ote that even th
c730: 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f  ough the freeblo
c740: 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63  ck list was chec
c750: 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74  ked by btreeInit
c760: 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20  Page(),.** that 
c770: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74  routine will not
c780: 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20   detect overlap 
c790: 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72  between cells or
c7a0: 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f   freeblocks.  No
c7b0: 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74  r.** does it det
c7c0: 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65  ect cells or fre
c7d0: 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63  eblocks that enc
c7e0: 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72  rouch into the r
c7f0: 65 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a  eserved bytes.**
c800: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
c810: 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20  he page.  So do 
c820: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75  additional corru
c830: 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73  ption checks ins
c840: 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  ide this.** rout
c850: 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ine and return S
c860: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
c870: 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72   any problems ar
c880: 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
c890: 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65  ic int freeSpace
c8a0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
c8b0: 20 75 31 36 20 69 53 74 61 72 74 2c 20 75 31 36   u16 iStart, u16
c8c0: 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69   iSize){.  u16 i
c8d0: 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ptr;            
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8f0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70   /* Address of p
c900: 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62  tr to next freeb
c910: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46  lock */.  u16 iF
c920: 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20  reeBlk;         
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c940: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
c950: 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  e next freeblock
c960: 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20   */.  u8 hdr;   
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
c990: 61 67 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e  age header size.
c9a0: 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20    0 or 100 */.  
c9b0: 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20  u8 nFrag = 0;   
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69        /* Reducti
c9e0: 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74  on in fragmentat
c9f0: 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72  ion */.  u16 iOr
ca00: 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20  igSize = iSize; 
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ca20: 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
ca30: 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75   of iSize */.  u
ca40: 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65  32 iLast = pPage
ca50: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
ca60: 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20  e-4; /* Largest 
ca70: 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f  possible freeblo
ca80: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75  ck offset */.  u
ca90: 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74  32 iEnd = iStart
caa0: 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   + iSize;       
cab0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
cac0: 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61  te past the iSta
cad0: 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75  rt buffer */.  u
cae0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
caf0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
cb00: 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e  a;   /* Page con
cb10: 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tent */..  asser
cb20: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
cb30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
cb40: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
cb50: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
cb60: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
cb70: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
cb80: 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e   iStart>=pPage->
cb90: 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67  hdrOffset+6+pPag
cba0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
cbb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
cbc0: 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20  RUPT_DB || iEnd 
cbd0: 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  <= pPage->pBt->u
cbe0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61  sableSize );.  a
cbf0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
cc00: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
cc10: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
cc20: 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e    assert( iSize>
cc30: 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  =4 );   /* Minim
cc40: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
cc50: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  4 */.  assert( i
cc60: 53 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a  Start<=iLast );.
cc70: 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20  .  /* Overwrite 
cc80: 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
cc90: 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77  ion with zeros w
cca0: 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64  hen the secure_d
ccb0: 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f  elete.  ** optio
ccc0: 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  n is enabled */.
ccd0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
cce0: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
ccf0: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
cd00: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
cd10: 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69  ta[iStart], 0, i
cd20: 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
cd30: 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65   The list of fre
cd40: 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20  eblocks must be 
cd50: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
cd60: 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20  er.  Find the . 
cd70: 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20   ** spot on the 
cd80: 6c 69 73 74 20 77 68 65 72 65 20 69 53 74 61 72  list where iStar
cd90: 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  t should be inse
cda0: 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  rted..  */.  hdr
cdb0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
cdc0: 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64  set;.  iPtr = hd
cdd0: 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74  r + 1;.  if( dat
cde0: 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20  a[iPtr+1]==0 && 
cdf0: 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b  data[iPtr]==0 ){
ce00: 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20  .    iFreeBlk = 
ce10: 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20  0;  /* Shortcut 
ce20: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
ce30: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
ce40: 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c  s empty */.  }el
ce50: 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  se{.    while( (
ce60: 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62  iFreeBlk = get2b
ce70: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29  yte(&data[iPtr])
ce80: 29 3e 30 20 26 26 20 69 46 72 65 65 42 6c 6b 3c  )>0 && iFreeBlk<
ce90: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
cea0: 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74  if( iFreeBlk<iPt
ceb0: 72 2b 34 20 29 20 72 65 74 75 72 6e 20 53 51 4c  r+4 ) return SQL
cec0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
ced0: 3b 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20 69  ;.      iPtr = i
cee0: 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20  FreeBlk;.    }. 
cef0: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e     if( iFreeBlk>
cf00: 69 4c 61 73 74 20 29 20 72 65 74 75 72 6e 20 53  iLast ) return S
cf10: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
cf20: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
cf30: 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c  iFreeBlk>iPtr ||
cf40: 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a   iFreeBlk==0 );.
cf50: 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69    .    /* At thi
cf60: 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20  s point:.    ** 
cf70: 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46     iFreeBlk:   F
cf80: 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61  irst freeblock a
cf90: 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20  fter iStart, or 
cfa0: 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20  zero if none.   
cfb0: 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20   **    iPtr:    
cfc0: 20 20 20 54 68 65 20 61 64 64 72 65 73 73 20 6f     The address o
cfd0: 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  f a pointer to i
cfe0: 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20  FreeBlk.    **. 
cff0: 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
d000: 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73  ee if iFreeBlk s
d010: 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63  hould be coalesc
d020: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
d030: 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a  of iStart..    *
d040: 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  /.    if( iFreeB
d050: 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46  lk && iEnd+3>=iF
d060: 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20  reeBlk ){.      
d070: 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b  nFrag = iFreeBlk
d080: 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69   - iEnd;.      i
d090: 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b  f( iEnd>iFreeBlk
d0a0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d0b0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
d0c0: 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65       iEnd = iFre
d0d0: 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28  eBlk + get2byte(
d0e0: 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32  &data[iFreeBlk+2
d0f0: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4e 45  ]);.      if( NE
d100: 56 45 52 28 69 45 6e 64 20 3e 20 70 50 61 67 65  VER(iEnd > pPage
d110: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
d120: 65 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e) ) return SQLI
d130: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d140: 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69  .      iSize = i
d150: 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20  End - iStart;.  
d160: 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67      iFreeBlk = g
d170: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
d180: 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a  reeBlk]);.    }.
d190: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74    .    /* If iPt
d1a0: 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65  r is another fre
d1b0: 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c  eblock (that is,
d1c0: 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20   if iPtr is not 
d1d0: 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20  the freelist.   
d1e0: 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74   ** pointer in t
d1f0: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 29 20  he page header) 
d200: 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65  then check to se
d210: 65 20 69 66 20 69 53 74 61 72 74 20 73 68 6f 75  e if iStart shou
d220: 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61  ld be.    ** coa
d230: 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20  lesced onto the 
d240: 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20  end of iPtr..   
d250: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72   */.    if( iPtr
d260: 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20  >hdr+1 ){.      
d270: 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50  int iPtrEnd = iP
d280: 74 72 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  tr + get2byte(&d
d290: 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20  ata[iPtr+2]);.  
d2a0: 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b      if( iPtrEnd+
d2b0: 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20  3>=iStart ){.   
d2c0: 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64       if( iPtrEnd
d2d0: 3e 69 53 74 61 72 74 20 29 20 72 65 74 75 72 6e  >iStart ) return
d2e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d2f0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 6e 46  BKPT;.        nF
d300: 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20  rag += iStart - 
d310: 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20  iPtrEnd;.       
d320: 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20   iSize = iEnd - 
d330: 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53  iPtr;.        iS
d340: 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20  tart = iPtr;.   
d350: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
d360: 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64  f( nFrag>data[hd
d370: 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51  r+7] ) return SQ
d380: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d390: 54 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b  T;.    data[hdr+
d3a0: 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d  7] -= nFrag;.  }
d3b0: 0a 20 20 69 66 28 20 69 53 74 61 72 74 3d 3d 67  .  if( iStart==g
d3c0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
d3d0: 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20  r+5]) ){.    /* 
d3e0: 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63  The new freebloc
d3f0: 6b 20 69 73 20 61 74 20 74 68 65 20 62 65 67 69  k is at the begi
d400: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c  nning of the cel
d410: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a  l content area,.
d420: 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65      ** so just e
d430: 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  xtend the cell c
d440: 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74 68  ontent area rath
d450: 65 72 20 74 68 61 6e 20 63 72 65 61 74 65 20 61  er than create a
d460: 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72  nother.    ** fr
d470: 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a  eelist entry */.
d480: 20 20 20 20 69 66 28 20 69 50 74 72 21 3d 68 64      if( iPtr!=hd
d490: 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  r+1 ) return SQL
d4a0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
d4b0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
d4c0: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72  data[hdr+1], iFr
d4d0: 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32  eeBlk);.    put2
d4e0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
d4f0: 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73  ], iEnd);.  }els
d500: 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74  e{.    /* Insert
d510: 20 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f   the new freeblo
d520: 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65  ck into the free
d530: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32  list */.    put2
d540: 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d  byte(&data[iPtr]
d550: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70  , iStart);.    p
d560: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53  ut2byte(&data[iS
d570: 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29  tart], iFreeBlk)
d580: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
d590: 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20  data[iStart+2], 
d5a0: 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50  iSize);.  }.  pP
d5b0: 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f  age->nFree += iO
d5c0: 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72  rigSize;.  retur
d5d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d5e0: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65  /*.** Decode the
d5f0: 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65   flags byte (the
d600: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
d610: 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61  he header) for a
d620: 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69   page.** and ini
d630: 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f  tialize fields o
d640: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74  f the MemPage st
d650: 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e  ructure accordin
d660: 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  gly..**.** Only 
d670: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
d680: 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73  mbinations are s
d690: 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68  upported.  Anyth
d6a0: 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ing different.**
d6b0: 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72   indicates a cor
d6c0: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
d6d0: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
d6e0: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a     PTF_ZERODATA.
d6f0: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
d700: 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45  ERODATA | PTF_LE
d710: 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  AF.**         PT
d720: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
d730: 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20  _INTKEY.**      
d740: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
d750: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50  | PTF_INTKEY | P
d760: 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69  TF_LEAF.*/.stati
d770: 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67  c int decodeFlag
d780: 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
d790: 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b  , int flagByte){
d7a0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
d7b0: 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20  ;     /* A copy 
d7c0: 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f  of pPage->pBt */
d7d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
d7e0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70  e->hdrOffset==(p
d7f0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
d800: 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73  100 : 0) );.  as
d810: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d820: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
d830: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
d840: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28   pPage->leaf = (
d850: 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29  u8)(flagByte>>3)
d860: 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c  ;  assert( PTF_L
d870: 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20  EAF == 1<<3 );. 
d880: 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54   flagByte &= ~PT
d890: 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d  F_LEAF;.  pPage-
d8a0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20  >childPtrSize = 
d8b0: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  4-4*pPage->leaf;
d8c0: 0a 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  .  pPage->xCellS
d8d0: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
d8e0: 72 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  r;.  pBt = pPage
d8f0: 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61  ->pBt;.  if( fla
d900: 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46  gByte==(PTF_LEAF
d910: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
d920: 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  Y) ){.    /* EVI
d930: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 36 34  DENCE-OF: R-0364
d940: 30 2d 31 33 34 31 35 20 41 20 76 61 6c 75 65 20  0-13415 A value 
d950: 6f 66 20 35 20 6d 65 61 6e 73 20 74 68 65 20 70  of 5 means the p
d960: 61 67 65 20 69 73 20 61 6e 20 69 6e 74 65 72 69  age is an interi
d970: 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  or.    ** table 
d980: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
d990: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
d9a0: 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e  _LEAFDATA|PTF_IN
d9b0: 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20  TKEY)==5 );.    
d9c0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
d9d0: 52 2d 32 30 35 30 31 2d 36 31 37 39 36 20 41 20  R-20501-61796 A 
d9e0: 76 61 6c 75 65 20 6f 66 20 31 33 20 6d 65 61 6e  value of 13 mean
d9f0: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 20  s the page is a 
da00: 6c 65 61 66 0a 20 20 20 20 2a 2a 20 74 61 62 6c  leaf.    ** tabl
da10: 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  e b-tree page. *
da20: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
da30: 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
da40: 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29  INTKEY|PTF_LEAF)
da50: 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67  ==13 );.    pPag
da60: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20  e->intKey = 1;. 
da70: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
da80: 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  af ){.      pPag
da90: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
daa0: 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  1;.      pPage->
dab0: 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20  noPayload = 0;. 
dac0: 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
dad0: 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61  seCell = btreePa
dae0: 72 73 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20  rseCellPtr;.    
daf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
db00: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d  ge->intKeyLeaf =
db10: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   0;.      pPage-
db20: 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 31 3b 0a  >noPayload = 1;.
db30: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65        pPage->xCe
db40: 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  llSize = cellSiz
db50: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20  ePtrNoPayload;. 
db60: 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
db70: 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61  seCell = btreePa
db80: 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c  rseCellPtrNoPayl
db90: 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  oad;.    }.    p
dba0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
dbb0: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20   pBt->maxLeaf;. 
dbc0: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
dbd0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  al = pBt->minLea
dbe0: 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  f;.  }else if( f
dbf0: 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52  lagByte==PTF_ZER
dc00: 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20  ODATA ){.    /* 
dc10: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
dc20: 37 32 32 35 2d 35 33 39 33 36 20 41 20 76 61 6c  7225-53936 A val
dc30: 75 65 20 6f 66 20 32 20 6d 65 61 6e 73 20 74 68  ue of 2 means th
dc40: 65 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74  e page is an int
dc50: 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 64  erior.    ** ind
dc60: 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ex b-tree page. 
dc70: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
dc80: 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32  PTF_ZERODATA)==2
dc90: 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   );.    /* EVIDE
dca0: 4e 43 45 2d 4f 46 3a 20 52 2d 31 36 35 37 31 2d  NCE-OF: R-16571-
dcb0: 31 31 36 31 35 20 41 20 76 61 6c 75 65 20 6f 66  11615 A value of
dcc0: 20 31 30 20 6d 65 61 6e 73 20 74 68 65 20 70 61   10 means the pa
dcd0: 67 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20 20  ge is a leaf.   
dce0: 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72 65 65   ** index b-tree
dcf0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
dd00: 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44  sert( (PTF_ZEROD
dd10: 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31  ATA|PTF_LEAF)==1
dd20: 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  0 );.    pPage->
dd30: 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  intKey = 0;.    
dd40: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
dd50: 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  f = 0;.    pPage
dd60: 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 30 3b  ->noPayload = 0;
dd70: 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72  .    pPage->xPar
dd80: 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61  seCell = btreePa
dd90: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b  rseCellPtrIndex;
dda0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
ddb0: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
ddc0: 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  ocal;.    pPage-
ddd0: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
dde0: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c  >minLocal;.  }el
ddf0: 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  se{.    /* EVIDE
de00: 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d  NCE-OF: R-47608-
de10: 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72 20  56469 Any other 
de20: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62 2d  value for the b-
de30: 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20 69  tree page type i
de40: 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f  s.    ** an erro
de50: 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  r. */.    return
de60: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
de70: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67  BKPT;.  }.  pPag
de80: 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  e->max1bytePaylo
de90: 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79  ad = pBt->max1by
dea0: 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74  tePayload;.  ret
deb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
dec0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
ded0: 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  ze the auxiliary
dee0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
def0: 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a   a disk block..*
df00: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
df10: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
df20: 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61  .  If we see tha
df30: 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a  t the page does.
df40: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
df50: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
df60: 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e  abase page, then
df70: 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
df80: 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74  TE_CORRUPT.  Not
df90: 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20  e that a return 
dfa0: 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65  of SQLITE_OK doe
dfb0: 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74  s not.** guarant
dfc0: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
dfd0: 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e   is well-formed.
dfe0: 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20    It only shows 
dff0: 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65  that.** we faile
e000: 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20  d to detect any 
e010: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
e020: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
e030: 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  nitPage(MemPage 
e040: 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65  *pPage){..  asse
e050: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
e060: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
e070: 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30  Page->pBt->db!=0
e080: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
e090: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
e0a0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
e0b0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
e0c0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
e0d0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
e0e0: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
e0f0: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
e100: 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
e110: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
e120: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
e130: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
e140: 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
e150: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
e160: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
e170: 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
e180: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
e190: 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20 20   u16 pc;        
e1a0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
e1b0: 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69  f a freeblock wi
e1c0: 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  thin pPage->aDat
e1d0: 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64  a[] */.    u8 hd
e1e0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
e1f0: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
e200: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
e210: 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64  der */.    u8 *d
e220: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
e230: 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
e240: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74  >aData */.    Bt
e250: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
e260: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
e270: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
e280: 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c  */.    int usabl
e290: 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f  eSize;    /* Amo
e2a0: 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70  unt of usable sp
e2b0: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
e2c0: 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c   */.    u16 cell
e2d0: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66  Offset;    /* Of
e2e0: 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20  fset from start 
e2f0: 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74  of page to first
e300: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
e310: 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  .    int nFree; 
e320: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
e330: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
e340: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
e350: 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  .    int top;   
e360: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
e370: 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c   byte of the cel
e380: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
e390: 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46  /.    int iCellF
e3a0: 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73  irst;    /* Firs
e3b0: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
e3c0: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
e3d0: 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  fset */.    int 
e3e0: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f  iCellLast;     /
e3f0: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
e400: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
e410: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20  k offset */..   
e420: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
e430: 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50  t;..    hdr = pP
e440: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
e450: 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
e460: 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20  ->aData;.    /* 
e470: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
e480: 38 35 39 34 2d 30 32 38 39 30 20 54 68 65 20 6f  8594-02890 The o
e490: 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74 20  ne-byte flag at 
e4a0: 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63 61 74  offset 0 indicat
e4b0: 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  ing.    ** the b
e4c0: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 2e  -tree page type.
e4d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65 63 6f   */.    if( deco
e4e0: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64  deFlags(pPage, d
e4f0: 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75  ata[hdr]) ) retu
e500: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e510: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65  T_BKPT;.    asse
e520: 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
e530: 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
e540: 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29  ageSize<=65536 )
e550: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73  ;.    pPage->mas
e560: 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42  kPage = (u16)(pB
e570: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29  t->pageSize - 1)
e580: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76  ;.    pPage->nOv
e590: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
e5a0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
e5b0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
e5c0: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
e5d0: 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  set = cellOffset
e5e0: 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50 61   = hdr + 8 + pPa
e5f0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
e600: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61  ;.    pPage->aDa
e610: 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73  taEnd = &data[us
e620: 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70  ableSize];.    p
e630: 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
e640: 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65   &data[cellOffse
e650: 74 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  t];.    /* EVIDE
e660: 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d  NCE-OF: R-58015-
e670: 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d 62 79  48175 The two-by
e680: 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
e690: 66 73 65 74 20 35 20 64 65 73 69 67 6e 61 74 65  fset 5 designate
e6a0: 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  s.    ** the sta
e6b0: 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  rt of the cell c
e6c0: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a  ontent area. A z
e6d0: 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ero value for th
e6e0: 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20  is integer is.  
e6f0: 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64    ** interpreted
e700: 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20   as 65536. */.  
e710: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
e720: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
e730: 72 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20 45 56  r+5]);.    /* EV
e740: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30  IDENCE-OF: R-370
e750: 30 32 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f  02-32774 The two
e760: 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
e770: 20 6f 66 66 73 65 74 20 33 20 67 69 76 65 73 20   offset 3 gives 
e780: 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  the.    ** numbe
e790: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
e7a0: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70  e page. */.    p
e7b0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
e7c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
e7d0: 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50  +3]);.    if( pP
e7e0: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45  age->nCell>MX_CE
e7f0: 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  LL(pBt) ){.     
e800: 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
e810: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
e820: 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
e830: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
e840: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
e850: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
e860: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65  PT;.    }.    te
e870: 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
e880: 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42  Cell==MX_CELL(pB
e890: 74 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  t) );.    /* EVI
e8a0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38  DENCE-OF: R-2408
e8b0: 39 2d 35 37 39 37 39 20 49 66 20 61 20 70 61 67  9-57979 If a pag
e8c0: 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
e8d0: 6c 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e  lls (which is on
e8e0: 6c 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62  ly.    ** possib
e8f0: 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70 61  le for a root pa
e900: 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68  ge of a table th
e910: 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72  at contains no r
e920: 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20 20  ows) then the.  
e930: 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74    ** offset to t
e940: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
e950: 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20  area will equal 
e960: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69  the page size mi
e970: 6e 75 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 62  nus the.    ** b
e980: 79 74 65 73 20 6f 66 20 72 65 73 65 72 76 65 64  ytes of reserved
e990: 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61   space. */.    a
e9a0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
e9b0: 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73  ell>0 || top==us
e9c0: 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52  ableSize || CORR
e9d0: 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20 20 2f  UPT_DB );..    /
e9e0: 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61  * A malformed da
e9f0: 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68  tabase page migh
ea00: 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65  t cause us to re
ea10: 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a  ad past the end.
ea20: 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77      ** of page w
ea30: 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65  hen parsing a ce
ea40: 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ll.  .    **.   
ea50: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
ea60: 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  g block of code 
ea70: 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20  checks early to 
ea80: 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78  see if a cell ex
ea90: 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73  tends.    ** pas
eaa0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70  t the end of a p
eab0: 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64  age boundary and
eac0: 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43   causes SQLITE_C
ead0: 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20  ORRUPT to be .  
eae0: 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66    ** returned if
eaf0: 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f   it does..    */
eb00: 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20  .    iCellFirst 
eb10: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
eb20: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
eb30: 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75     iCellLast = u
eb40: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
eb50: 20 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e     if( pBt->db->
eb60: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43  flags & SQLITE_C
eb70: 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20  ellSizeCk ){.   
eb80: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
eb90: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
eba0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
ebb0: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  ter array */.   
ebc0: 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20     int sz;      
ebd0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
ebe0: 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20  a cell */..     
ebf0: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
ec00: 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b  f ) iCellLast--;
ec10: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
ec20: 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
ec30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63  i++){.        pc
ec40: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
ec50: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32  a[cellOffset+i*2
ec60: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
ec70: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
ec80: 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  irst );.        
ec90: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
eca0: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20  ellLast );.     
ecb0: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
ecc0: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
ecd0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
ece0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ecf0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ed00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ed10: 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c  sz = pPage->xCel
ed20: 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61  lSize(pPage, &da
ed30: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20  ta[pc]);.       
ed40: 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
ed50: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
ed60: 20 20 20 20 20 20 20 20 69 66 28 20 70 63 2b 73          if( pc+s
ed70: 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  z>usableSize ){.
ed80: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
ed90: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
eda0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
edb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
edc0: 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
edd0: 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20   iCellLast++;.  
ede0: 20 20 7d 20 20 0a 0a 20 20 20 20 2f 2a 20 43 6f    }  ..    /* Co
edf0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
ee00: 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
ee10: 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 45 56  e page.    ** EV
ee20: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35  IDENCE-OF: R-235
ee30: 38 38 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f  88-34450 The two
ee40: 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
ee50: 20 6f 66 66 73 65 74 20 31 20 67 69 76 65 73 20   offset 1 gives 
ee60: 74 68 65 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  the.    ** start
ee70: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 72   of the first fr
ee80: 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70  eeblock on the p
ee90: 61 67 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20  age, or is zero 
eea0: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a  if there are no.
eeb0: 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b      ** freeblock
eec0: 73 2e 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67  s. */.    pc = g
eed0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
eee0: 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65  r+1]);.    nFree
eef0: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
ef00: 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e   top;  /* Init n
ef10: 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65  Free to non-free
ef20: 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65  block free space
ef30: 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
ef40: 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36  c>0 ){.      u16
ef50: 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20   next, size;.   
ef60: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
ef70: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
ef80: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
ef90: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
efa0: 52 2d 35 35 35 33 30 2d 35 32 39 33 30 20 49 6e  R-55530-52930 In
efb0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62   a well-formed b
efc0: 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 72  -tree page, ther
efd0: 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 2a  e will.        *
efe0: 2a 20 61 6c 77 61 79 73 20 62 65 20 61 74 20 6c  * always be at l
eff0: 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65  east one cell be
f000: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 66  fore the first f
f010: 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  reeblock..      
f020: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
f030: 4f 72 2c 20 74 68 65 20 66 72 65 65 62 6c 6f 63  Or, the freebloc
f040: 6b 20 69 73 20 6f 66 66 20 74 68 65 20 65 6e 64  k is off the end
f050: 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20 20   of the page.   
f060: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
f070: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f080: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
f090: 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20     }.      next 
f0a0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
f0b0: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a  [pc]);.      siz
f0c0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
f0d0: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
f0e0: 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26 20   if( (next>0 && 
f0f0: 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29  next<=pc+size+3)
f100: 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62   || pc+size>usab
f110: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
f120: 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73    /* Free blocks
f130: 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65   must be in asce
f140: 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64  nding order. And
f150: 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
f160: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
f170: 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74   free-block must
f180: 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61 74 61   lie on the data
f190: 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  base page.  */. 
f1a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
f1b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
f1c0: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
f1d0: 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20    nFree = nFree 
f1e0: 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63  + size;.      pc
f1f0: 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a   = next;.    }..
f200: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
f210: 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74  oint, nFree cont
f220: 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20  ains the sum of 
f230: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
f240: 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f  e start.    ** o
f250: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
f260: 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65  nt area plus the
f270: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
f280: 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20  bytes within.   
f290: 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
f2a0: 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
f2b0: 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
f2c0: 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
f2d0: 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ze.    ** of the
f2e0: 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
f2f0: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
f300: 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
f310: 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73  ck also.    ** s
f320: 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20  erves to verify 
f330: 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20  that the offset 
f340: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
f350: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
f360: 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63  .    ** area, ac
f370: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70  cording to the p
f380: 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73  age header, lies
f390: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
f3a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
f3b0: 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
f3c0: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
f3d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f3e0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
f3f0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
f400: 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69   (u16)(nFree - i
f410: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20  CellFirst);.    
f420: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
f430: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
f440: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
f450: 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
f460: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
f470: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
f480: 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
f490: 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
f4a0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
f4b0: 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
f4c0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
f4d0: 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
f4e0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
f4f0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
f500: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
f510: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
f520: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
f530: 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69  Offset;.  u16 fi
f540: 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
f550: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
f560: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
f570: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
f580: 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
f590: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
f5a0: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
f5b0: 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
f5c0: 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
f5d0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
f5e0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
f5f0: 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29  bPage) == data )
f600: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
f610: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
f620: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
f630: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
f640: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
f650: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
f660: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  );.  if( pBt->bt
f670: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
f680: 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
f690: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
f6a0: 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
f6b0: 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a  bleSize - hdr);.
f6c0: 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20    }.  data[hdr] 
f6d0: 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
f6e0: 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28   first = hdr + (
f6f0: 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
f700: 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20  ==0 ? 12 : 8);. 
f710: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
f720: 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
f730: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
f740: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
f750: 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
f760: 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
f770: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
f780: 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
f790: 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65  e - first);.  de
f7a0: 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
f7b0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65   flags);.  pPage
f7c0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66  ->cellOffset = f
f7d0: 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61  irst;.  pPage->a
f7e0: 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
f7f0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
f800: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c  ;.  pPage->aCell
f810: 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73  Idx = &data[firs
f820: 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  t];.  pPage->nOv
f830: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73  erflow = 0;.  as
f840: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
f850: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
f860: 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
f870: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
f880: 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42  kPage = (u16)(pB
f890: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29  t->pageSize - 1)
f8a0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
f8b0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
f8c0: 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f  sInit = 1;.}.../
f8d0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44  *.** Convert a D
f8e0: 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66  bPage obtained f
f8f0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e  rom the pager in
f900: 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65  to a MemPage use
f910: 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65  d by.** the btre
f920: 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74  e layer..*/.stat
f930: 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
f940: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
f950: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  DbPage *pDbPage,
f960: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68   Pgno pgno, BtSh
f970: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
f980: 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28  mPage *pPage = (
f990: 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
f9a0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
f9b0: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
f9c0: 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  >aData = sqlite3
f9d0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
f9e0: 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Page);.  pPage->
f9f0: 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  pDbPage = pDbPag
fa00: 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20  e;.  pPage->pBt 
fa10: 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e  = pBt;.  pPage->
fa20: 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70  pgno = pgno;.  p
fa30: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
fa40: 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  = pPage->pgno==1
fa50: 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65   ? 100 : 0;.  re
fa60: 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a  turn pPage; .}..
fa70: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
fa80: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
fa90: 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65    Initialize the
faa0: 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
fab0: 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
fac0: 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
fad0: 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a  eded.  See also:
fae0: 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
faf0: 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age()..**.** If 
fb00: 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  the PAGER_GET_NO
fb10: 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20  CONTENT flag is 
fb20: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
fb30: 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
fb40: 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63  e.** about the c
fb50: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
fb60: 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
fb70: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
fb80: 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
fb90: 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
fba0: 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
fbb0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
fbc0: 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
fbd0: 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
fbe0: 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
fbf0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
fc00: 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
fc10: 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
fc20: 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
fc30: 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
fc40: 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
fc50: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
fc60: 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
fc70: 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
fc80: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
fc90: 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
fca0: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
fcb0: 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
fcc0: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
fcd0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
fce0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
fcf0: 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
fd00: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
fd10: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
fd20: 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
fd30: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  eter */.  int fl
fd40: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
fd50: 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  * PAGER_GET_NOCO
fd60: 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47  NTENT or PAGER_G
fd70: 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29  ET_READONLY */.)
fd80: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
fd90: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
fda0: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
fdb0: 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  =0 || flags==PAG
fdc0: 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
fdd0: 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
fde0: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b  _GET_READONLY );
fdf0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fe00: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
fe10: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
fe20: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
fe30: 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
fe40: 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
fe50: 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66  ge**)&pDbPage, f
fe60: 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20  lags);.  if( rc 
fe70: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
fe80: 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  ppPage = btreePa
fe90: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
fea0: 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
feb0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
fec0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
fed0: 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66  etrieve a page f
fee0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
fef0: 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75  che. If the requ
ff00: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
ff10: 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20  t.** already in 
ff20: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
ff30: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69  return NULL. Ini
ff40: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
ff50: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
ff60: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
ff70: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
ff80: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
ff90: 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f  ge *btreePageLoo
ffa0: 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  kup(BtShared *pB
ffb0: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
ffc0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
ffd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
ffe0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
fff0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
10000 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
10010 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
10020 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
10030 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
10040 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
10050 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
10060 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
10070 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pBt);.  }.  retu
10080 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
10090 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
100a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
100b0 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66  ile in pages. If
100c0 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
100d0 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20  nd of.** error, 
100e0 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65  return ((unsigne
100f0 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74  d int)-1)..*/.st
10100 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50  atic Pgno btreeP
10110 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65  agecount(BtShare
10120 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72  d *pBt){.  retur
10130 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a  n pBt->nPage;.}.
10140 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65  u32 sqlite3Btree
10150 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a  LastPage(Btree *
10160 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
10170 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
10180 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
10190 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e  ert( ((p->pBt->n
101a0 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29  Page)&0x8000000)
101b0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
101c0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
101d0 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pBt);.}../*.**
101e0 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
101f0 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
10200 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54  nitialize it.  T
10210 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
10220 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69  ust a.** conveni
10230 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f  ence wrapper aro
10240 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c  und separate cal
10250 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ls to btreeGetPa
10260 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72  ge() and .** btr
10270 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a  eeInitPage()..**
10280 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
10290 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
102a0 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69   value *ppPage i
102b0 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65  s set to is unde
102c0 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79  fined. It.** may
102d0 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
102e0 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  d, or it may be 
102f0 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  set to an invali
10300 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  d value..*/.stat
10310 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
10320 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
10330 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
10340 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10350 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
10360 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
10370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10380 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10390 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
103a0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
103b0 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
103c0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
103d0 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
103e0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ere */.  int bRe
103f0 61 64 6f 6e 6c 79 20 20 20 20 20 20 20 20 20 20  adonly          
10400 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
10410 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 6f  R_GET_READONLY o
10420 72 20 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  r 0 */.){.  int 
10430 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
10440 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10450 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
10460 20 20 61 73 73 65 72 74 28 20 62 52 65 61 64 6f    assert( bReado
10470 6e 6c 79 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52  nly==PAGER_GET_R
10480 45 41 44 4f 4e 4c 59 20 7c 7c 20 62 52 65 61 64  EADONLY || bRead
10490 6f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  only==0 );..  if
104a0 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  ( pgno>btreePage
104b0 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
104c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
104d0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65  RRUPT_BKPT;.  }e
104e0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  lse{.    rc = bt
104f0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
10500 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 52  pgno, ppPage, bR
10510 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 69 66  eadonly);.    if
10520 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10530 26 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73  && (*ppPage)->is
10540 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Init==0 ){.     
10550 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
10560 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
10570 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
10590 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
105a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
105b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74     }.  }..  test
105c0 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
105d0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
105e0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
105f0 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
10600 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10610 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
10620 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
10630 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
10640 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
10650 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
10660 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
10670 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
10680 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
10690 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
106a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
106b0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
106c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
106d0 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
106e0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62  sert( pPage->pDb
106f0 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61  Page!=0 );.    a
10700 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
10710 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
10720 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
10730 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
10740 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
10750 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
10760 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
10770 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
10780 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
10790 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
107a0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
107b0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
107c0 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
107d0 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  l(pPage->pDbPage
107e0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
107f0 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61  Get an unused pa
10800 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ge..**.** This w
10810 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62  orks just like b
10820 74 72 65 65 47 65 74 50 61 67 65 28 29 20 77 69  treeGetPage() wi
10830 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a  th the addition:
10840 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74  .**.**   *  If t
10850 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
10860 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f  dy in use for so
10870 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
10880 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  , immediately.**
10890 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 69 74        release it
108a0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53   and return an S
108b0 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65 72  QLITE_CURRUPT er
108c0 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b  ror..**   *  Mak
108d0 65 20 73 75 72 65 20 74 68 65 20 69 73 49 6e 69  e sure the isIni
108e0 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a  t flag is clear.
108f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
10900 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
10910 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
10920 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
10930 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
10940 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
10950 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
10960 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
10970 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
10980 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
10990 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
109a0 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
109b0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
109c0 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
109d0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
109e0 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
109f0 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
10a00 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
10a10 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
10a20 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
10a30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10a40 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  K ){.    if( sql
10a50 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
10a60 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
10a70 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
10a80 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
10a90 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
10aa0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
10ab0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10ac0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
10ad0 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61      }.    (*ppPa
10ae0 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  ge)->isInit = 0;
10af0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
10b00 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
10b10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
10b20 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
10b30 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
10b40 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
10b50 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
10b60 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
10b70 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
10b80 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
10b90 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
10ba0 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
10bb0 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
10bc0 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
10bd0 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
10be0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
10bf0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
10c00 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
10c10 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
10c20 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
10c30 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
10c40 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
10c50 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
10c60 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
10c70 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
10c80 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
10c90 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
10ca0 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
10cb0 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
10cc0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
10cd0 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
10ce0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
10cf0 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
10d00 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >0 );.  if( pPag
10d10 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
10d20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10d30 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
10d40 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
10d50 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
10d60 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
10d70 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
10d80 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
10d90 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >1 ){.      /* p
10da0 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
10db0 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
10dc0 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
10dd0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
10de0 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
10df0 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
10e00 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
10e10 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
10e20 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
10e30 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50  ll to btreeInitP
10e40 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c  age() will likel
10e50 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
10e60 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a  CORRUPT..      *
10e70 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73  * But no harm is
10e80 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20   done by this.  
10e90 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69  And it is very i
10ea0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20  mportant that.  
10eb0 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74      ** btreeInit
10ec0 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64  Page() be called
10ed0 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20   on every btree 
10ee0 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a  page so we make.
10ef0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
10f00 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65  l for every page
10f10 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66   that comes in f
10f20 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a  or re-initing. *
10f30 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69  /.      btreeIni
10f40 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
10f50 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
10f60 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
10f70 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
10f80 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
10f90 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
10fa0 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
10fb0 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
10fc0 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
10fd0 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
10fe0 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
10ff0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11000 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
11010 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
11020 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
11030 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
11040 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
11050 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
11060 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
11070 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
11080 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
11090 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
110a0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
110b0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
110c0 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68  L.** then an eph
110d0 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
110e0 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  is created.  The
110f0 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62   ephemeral datab
11100 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ase might.** be 
11110 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d  exclusively in m
11120 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67  emory, or it mig
11130 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61  ht use a disk-ba
11140 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  sed memory cache
11150 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c  ..** Either way,
11160 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64   the ephemeral d
11170 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20  atabase will be 
11180 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
11190 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73  leted .** when s
111a0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
111b0 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
111c0 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
111d0 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
111e0 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  hen an in-memory
111f0 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
11200 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20  ated.** that is 
11210 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
11220 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20  stroyed when it 
11230 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
11240 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61 72   The "flags" par
11250 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
11260 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63  ask that might c
11270 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65  ontain bits like
11280 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a  .** BTREE_OMIT_J
11290 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54  OURNAL and/or BT
112a0 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a  REE_MEMORY..**.*
112b0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
112c0 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
112d0 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ned in the same 
112e0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
112f0 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72  ion.** and we ar
11300 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68  e in shared cach
11310 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  e mode, then the
11320 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20   open will fail 
11330 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54  with an.** SQLIT
11340 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72  E_CONSTRAINT err
11350 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61  or.  We cannot a
11360 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65  llow two or more
11370 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a   BtShared.** obj
11380 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65  ects in the same
11390 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
113a0 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67  tion since doing
113b0 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a   so will lead.**
113c0 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74   to problems wit
113d0 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e  h locking..*/.in
113e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  t sqlite3BtreeOp
113f0 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
11400 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a  s *pVfs,      /*
11410 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
11420 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20  this b-tree */. 
11430 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
11440 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
11450 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
11460 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
11470 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
11480 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
11490 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
114a0 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
114b0 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
114c0 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
114d0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
114e0 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
114f0 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
11500 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
11510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
11520 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
11530 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
11540 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
11550 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
11560 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
11570 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  () */.){.  BtSha
11580 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20  red *pBt = 0;   
11590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
115a0 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65  red part of btre
115b0 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
115c0 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20   Btree *p;      
115d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115e0 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74  /* Handle to ret
115f0 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  urn */.  sqlite3
11600 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65  _mutex *mutexOpe
11610 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65  n = 0;  /* Preve
11620 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69  nts a race condi
11630 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35  tion. Ticket #35
11640 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  37 */.  int rc =
11650 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
11660 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
11670 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20   code from this 
11680 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  function */.  u8
11690 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
116a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
116b0 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73  Byte of unused s
116c0 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
116d0 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
116e0 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31  char zDbHeader[1
116f0 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  00];  /* Databas
11700 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74  e header content
11710 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69   */..  /* True i
11720 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68  f opening an eph
11730 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72  emeral, temporar
11740 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
11750 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70  const int isTemp
11760 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  Db = zFilename==
11770 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  0 || zFilename[0
11780 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ]==0;..  /* Set 
11790 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d  the variable isM
117a0 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72  emdb to true for
117b0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
117c0 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a  tabase, or .  **
117d0 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c   false for a fil
117e0 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  e-based database
117f0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
11800 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
11810 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  DB.  const int i
11820 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73  sMemdb = 0;.#els
11830 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  e.  const int is
11840 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61  Memdb = (zFilena
11850 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69  me && strcmp(zFi
11860 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79  lename, ":memory
11870 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  :")==0).        
11880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
11890 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20 73  | (isTempDb && s
118a0 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
118b0 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20 20  ry(db)).        
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
118d0 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  | (vfsFlags & SQ
118e0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
118f0 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  )!=0;.#endif..  
11900 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
11910 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 21  .  assert( pVfs!
11920 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
11930 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11940 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
11950 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
11960 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29  s&0xff)==flags )
11970 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74  ;   /* flags fit
11980 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20   in 8 bits */.. 
11990 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45   /* Only a BTREE
119a0 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
119b0 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e   can be BTREE_UN
119c0 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73  ORDERED */.  ass
119d0 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
119e0 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d  REE_UNORDERED)==
119f0 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54  0 || (flags & BT
11a00 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29  REE_SINGLE)!=0 )
11a10 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f  ;..  /* A BTREE_
11a20 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20  SINGLE database 
11a30 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70  is always a temp
11a40 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68  orary and/or eph
11a50 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65  emeral */.  asse
11a60 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52  rt( (flags & BTR
11a70 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c  EE_SINGLE)==0 ||
11a80 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20   isTempDb );..  
11a90 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
11aa0 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45     flags |= BTRE
11ab0 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
11ac0 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20  if( (vfsFlags & 
11ad0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
11ae0 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65  _DB)!=0 && (isMe
11af0 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29  mdb || isTempDb)
11b00 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73   ){.    vfsFlags
11b10 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e   = (vfsFlags & ~
11b20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
11b30 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50  _DB) | SQLITE_OP
11b40 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a  EN_TEMP_DB;.  }.
11b50 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
11b60 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
11b70 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70  tree));.  if( !p
11b80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11b90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
11ba0 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
11bb0 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  TRANS_NONE;.  p-
11bc0 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65  >db = db;.#ifnde
11bd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
11be0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e  ARED_CACHE.  p->
11bf0 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b  lock.pBtree = p;
11c00 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  .  p->lock.iTabl
11c10 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 1;.#endif..#
11c20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
11c30 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
11c40 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
11c50 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
11c60 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  SKIO).  /*.  ** 
11c70 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73  If this Btree is
11c80 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
11c90 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74   shared cache, t
11ca0 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20  ry to find an.  
11cb0 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68  ** existing BtSh
11cc0 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74  ared object that
11cd0 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69   we can share wi
11ce0 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  th.  */.  if( is
11cf0 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73  TempDb==0 && (is
11d00 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73  Memdb==0 || (vfs
11d10 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
11d20 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20  N_URI)!=0) ){.  
11d30 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20 26    if( vfsFlags &
11d40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
11d50 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20  REDCACHE ){.    
11d60 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20    int nFilename 
11d70 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
11d80 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a  0(zFilename)+1;.
11d90 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
11da0 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
11db0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
11dc0 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
11dd0 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
11de0 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c  3Malloc(MAX(nFul
11df0 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e  lPathname,nFilen
11e00 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54  ame));.      MUT
11e10 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
11e20 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
11e30 61 72 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70  ared; )..      p
11e40 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
11e50 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c        if( !zFull
11e60 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
11e70 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
11e80 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
11e90 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
11ea0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11eb0 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
11ec0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46         memcpy(zF
11ed0 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69  ullPathname, zFi
11ee0 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d  lename, nFilenam
11ef0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
11f00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
11f10 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
11f20 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
11f30 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f50 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74          nFullPat
11f60 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
11f70 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
11f80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
11f90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
11fa0 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
11fb0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11fc0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
11fd0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
11fe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11ff0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
12000 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
12010 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
12020 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
12030 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
12040 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
12050 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
12060 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
12070 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
12080 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
12090 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
120a0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
120b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
120c0 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
120d0 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
120e0 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
120f0 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
12100 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
12110 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
12120 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
12130 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
12140 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
12150 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
12160 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
12170 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
12180 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
12190 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
121a0 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
121b0 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
121c0 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
121d0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
121e0 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
121f0 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
12200 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
12210 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
12220 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
12230 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
12240 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
12250 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
12260 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
12270 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
12280 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
12290 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
122a0 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
122b0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
122c0 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
122d0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
122e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
122f0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
12300 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
12310 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
12320 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
12330 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
12340 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
12350 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
12360 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
12370 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
12380 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
12390 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
123a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
123b0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
123c0 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
123d0 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
123e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
123f0 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
12400 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
12410 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
12420 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
12430 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
12440 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
12450 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
12460 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
12470 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
12480 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
12490 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
124a0 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
124b0 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
124c0 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
124d0 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
124e0 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
124f0 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
12500 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
12510 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
12520 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
12530 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
12540 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
12550 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
12560 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
12570 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
12580 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
12590 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
125a0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
125b0 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
125c0 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
125d0 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
125e0 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
125f0 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
12600 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
12610 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
12620 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
12630 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
12640 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
12650 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73  64)==8 );.    as
12660 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
12670 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65  )==8 );.    asse
12680 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
12690 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
126a0 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
126b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
126c0 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20  sizeof(Pgno)==4 
126d0 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20  );.  .    pBt = 
126e0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
126f0 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  o( sizeof(*pBt) 
12700 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d  );.    if( pBt==
12710 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
12720 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
12730 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
12740 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
12750 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
12760 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26  agerOpen(pVfs, &
12770 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
12780 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127a0 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c    EXTRA_SIZE, fl
127b0 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70  ags, vfsFlags, p
127c0 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20  ageReinit);.    
127d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
127e0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
127f0 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
12800 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  mit(pBt->pPager,
12810 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20   db->szMmap);.  
12820 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12830 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
12840 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  der(pBt->pPager,
12850 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72  sizeof(zDbHeader
12860 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20  ),zDbHeader);.  
12870 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
12880 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12890 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
128a0 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
128b0 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73    pBt->openFlags
128c0 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20   = (u8)flags;.  
128d0 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a    pBt->db = db;.
128e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
128f0 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70  SetBusyhandler(p
12900 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65  Bt->pPager, btre
12910 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
12920 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d  er, pBt);.    p-
12930 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20  >pBt = pBt;.  . 
12940 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
12950 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  = 0;.    pBt->pP
12960 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66  age1 = 0;.    if
12970 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
12980 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50  readonly(pBt->pP
12990 61 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73  ager) ) pBt->bts
129a0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
129b0 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53  D_ONLY;.#ifdef S
129c0 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
129d0 45 54 45 0a 20 20 20 20 70 42 74 2d 3e 62 74 73  ETE.    pBt->bts
129e0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
129f0 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64  URE_DELETE;.#end
12a00 69 66 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  if.    /* EVIDEN
12a10 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33  CE-OF: R-51873-3
12a20 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69  9618 The page si
12a30 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  ze for a databas
12a40 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a  e file is.    **
12a50 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
12a60 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65  he 2-byte intege
12a70 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20  r located at an 
12a80 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74  offset of 16 byt
12a90 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  es from.    ** t
12aa0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
12ab0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12ac0 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70  e. */.    pBt->p
12ad0 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65  ageSize = (zDbHe
12ae0 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  ader[16]<<8) | (
12af0 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31  zDbHeader[17]<<1
12b00 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  6);.    if( pBt-
12b10 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c  >pageSize<512 ||
12b20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53   pBt->pageSize>S
12b30 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
12b40 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  IZE.         || 
12b50 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d  ((pBt->pageSize-
12b60 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1)&pBt->pageSize
12b70 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
12b80 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  t->pageSize = 0;
12b90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12ba0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
12bb0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
12bc0 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d  magic name ":mem
12bd0 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74  ory:" will creat
12be0 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
12bf0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20  atabase, then.  
12c00 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65      ** leave the
12c10 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65   autoVacuum mode
12c20 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75   at 0 (do not au
12c30 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e  to-vacuum), even
12c40 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
12c50 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
12c60 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20  VACUUM is true. 
12c70 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
12c80 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  d, if.      ** S
12c90 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
12ca0 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66  YDB has been def
12cb0 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d  ined, then ":mem
12cc0 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a  ory:" is just a.
12cd0 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72        ** regular
12ce0 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74   file-name. In t
12cf0 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74  his case the aut
12d00 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73  o-vacuum applies
12d10 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a   as per normal..
12d20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
12d30 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
12d40 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
12d50 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
12d60 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
12d70 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
12d80 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
12d90 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
12da0 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
12db0 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d  AULT_AUTOVACUUM=
12dc0 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  =2 ? 1 : 0);.   
12dd0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
12de0 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
12df0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12e00 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
12e10 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54   R-37497-42412 T
12e20 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72  he size of the r
12e30 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69  eserved region i
12e40 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72  s.      ** deter
12e50 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
12e60 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
12e70 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
12e80 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
12e90 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68        ** into th
12ea0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12eb0 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20  header. */.     
12ec0 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48   nReserve = zDbH
12ed0 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20  eader[20];.     
12ee0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
12ef0 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
12f00 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51  IXED;.#ifndef SQ
12f10 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
12f20 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
12f30 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
12f40 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
12f50 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
12f60 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
12f70 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
12f80 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
12f90 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
12fa0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
12fb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
12fc0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
12fd0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
12fe0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
12ff0 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72  erve);.    if( r
13000 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f  c ) goto btree_o
13010 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74  pen_out;.    pBt
13020 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
13030 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
13040 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
13050 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
13060 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
13070 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
13080 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
13090 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69  */.   .#if !defi
130a0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
130b0 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
130c0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
130d0 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
130e0 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
130f0 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
13100 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   to the linked l
13110 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53  ist sharable BtS
13120 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  hareds..    */. 
13130 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
13140 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45  le ){.      MUTE
13150 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
13160 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
13170 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 42 74  red; ).      pBt
13180 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
13190 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d    MUTEX_LOGIC( m
131a0 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
131b0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
131c0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
131d0 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20  IC_MASTER);).   
131e0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
131f0 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69  READSAFE && sqli
13200 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
13210 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
13220 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78        pBt->mutex
13230 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
13240 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
13250 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20  X_FAST);.       
13260 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d   if( pBt->mutex=
13270 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13280 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
13290 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  M;.          db-
132a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
132b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  0;.          got
132c0 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
132d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
132e0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
132f0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
13300 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
13310 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
13320 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
13330 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
13340 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
13350 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
13360 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
13370 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
13380 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
13390 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
133a0 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
133b0 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
133c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
133d0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
133e0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
133f0 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
13400 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
13410 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
13420 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
13430 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
13440 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
13450 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
13460 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
13470 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
13480 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
13490 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
134a0 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
134b0 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
134c0 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
134d0 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
134e0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
134f0 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
13500 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
13510 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
13520 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
13530 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
13540 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
13550 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
13560 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
13570 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
13580 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
13590 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e  f( p->pBt<pSib->
135a0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
135b0 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
135c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
135d0 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
135e0 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
135f0 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
13600 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
13610 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
13620 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d   && pSib->pNext-
13630 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20  >pBt<p->pBt ){. 
13640 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
13650 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
13660 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13670 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
13680 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
13690 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
136a0 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
136b0 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
136c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
136d0 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
136e0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
136f0 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
13700 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
13710 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
13720 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
13730 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
13740 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
13750 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
13760 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13770 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
13780 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
13790 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
137a0 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
137b0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
137c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
137d0 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
137e0 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
137f0 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  pBtree = 0;.  }e
13800 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
13810 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75  he B-Tree was su
13820 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
13830 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72  d, set the pager
13840 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74  -cache size to t
13850 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  he.    ** defaul
13860 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c  t value. Except,
13870 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e   when opening on
13880 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61   an existing sha
13890 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c  red pager-cache,
138a0 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63  .    ** do not c
138b0 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d  hange the pager-
138c0 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20  cache size..    
138d0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
138e0 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c  e3BtreeSchema(p,
138f0 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20   0, 0)==0 ){.   
13900 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
13910 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70  etCachesize(p->p
13920 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49  Bt->pPager, SQLI
13930 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
13940 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _SIZE);.    }.  
13950 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65  }.  if( mutexOpe
13960 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
13970 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
13980 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29  eld(mutexOpen) )
13990 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
139a0 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
139b0 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pen);.  }.  retu
139c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
139d0 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74  Decrement the Bt
139e0 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
139f0 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65  ter.  When it re
13a00 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72  aches zero,.** r
13a10 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72  emove the BtShar
13a20 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ed structure fro
13a30 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  m the sharing li
13a40 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  st.  Return.** t
13a50 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61  rue if the BtSha
13a60 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
13a70 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e   reaches zero an
13a80 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73  d return.** fals
13a90 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c  e if it is still
13aa0 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74   positive..*/.st
13ab0 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46  atic int removeF
13ac0 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42  romSharingList(B
13ad0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23  tShared *pBt){.#
13ae0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13af0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
13b00 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
13b10 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
13b20 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61  aster; ).  BtSha
13b30 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  red *pList;.  in
13b40 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a  t removed = 0;..
13b50 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13b60 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
13b70 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
13b80 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d   MUTEX_LOGIC( pM
13b90 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
13ba0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
13bb0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
13bc0 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74  STER); ).  sqlit
13bd0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
13be0 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e  Master);.  pBt->
13bf0 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
13c00 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20  t->nRef<=0 ){.  
13c10 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53    if( GLOBAL(BtS
13c20 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
13c30 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d  aredCacheList)==
13c40 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f  pBt ){.      GLO
13c50 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
13c60 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
13c70 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65  List) = pBt->pNe
13c80 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
13c90 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f       pList = GLO
13ca0 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
13cb0 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
13cc0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69  List);.      whi
13cd0 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  le( ALWAYS(pList
13ce0 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78  ) && pList->pNex
13cf0 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t!=pBt ){.      
13d00 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70    pList=pList->p
13d10 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
13d20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
13d30 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  List) ){.       
13d40 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20   pList->pNext = 
13d50 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
13d60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13d70 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
13d80 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  AFE ){.      sql
13d90 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
13da0 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  pBt->mutex);.   
13db0 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d   }.    removed =
13dc0 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
13dd0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
13de0 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
13df0 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a   removed;.#else.
13e00 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
13e10 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  if.}../*.** Make
13e20 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53   sure pBt->pTmpS
13e30 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  pace points to a
13e40 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  n allocation of 
13e50 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  .** MX_CELL_SIZE
13e60 28 70 42 74 29 20 62 79 74 65 73 20 77 69 74 68  (pBt) bytes with
13e70 20 61 20 34 2d 62 79 74 65 20 70 72 65 66 69 78   a 4-byte prefix
13e80 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68 69 6c   for a left-chil
13e90 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  d.** pointer..*/
13ea0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c  .static void all
13eb0 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42  ocateTempSpace(B
13ec0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
13ed0 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53   if( !pBt->pTmpS
13ee0 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
13ef0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
13f00 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20  ite3PageMalloc( 
13f10 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
13f20 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20  ..    /* One of 
13f30 74 68 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d  the uses of pBt-
13f40 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f  >pTmpSpace is to
13f50 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65   format cells be
13f60 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65  fore.    ** inse
13f70 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20  rting them into 
13f80 61 20 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e  a leaf page (fun
13f90 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c  ction fillInCell
13fa0 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  ()). If.    ** a
13fb0 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68   cell is less th
13fc0 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73 69  an 4 bytes in si
13fd0 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65  ze, it is rounde
13fe0 64 20 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a  d up to 4 bytes.
13ff0 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61      ** by the va
14000 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74  rious routines t
14010 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62  hat manipulate b
14020 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69  inary cells. Whi
14030 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65  ch.    ** can me
14040 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65  an that fillInCe
14050 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61  ll() only initia
14060 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73 74 20  lizes the first 
14070 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79  2 or 3.    ** by
14080 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65  tes of pTmpSpace
14090 2c 20 62 75 74 20 74 68 61 74 20 74 68 65 20 66  , but that the f
140a0 69 72 73 74 20 34 20 62 79 74 65 73 20 61 72 65  irst 4 bytes are
140b0 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20   copied from.   
140c0 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61   ** it into a da
140d0 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68 69  tabase page. Thi
140e0 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
140f0 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74  y a problem, but
14100 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20   it.    ** does 
14110 63 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64  cause a valgrind
14120 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20   error when the 
14130 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20  1 or 2 bytes of 
14140 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20  unitialized .   
14150 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73 73   ** data is pass
14160 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c  ed to system cal
14170 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f  l write(). So to
14180 20 61 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f   avoid this erro
14190 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  r,.    ** zero t
141a0 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
141b0 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20 68   of temp space h
141c0 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ere..    **.    
141d0 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64  ** Also:  Provid
141e0 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20  e four bytes of 
141f0 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63  initialized spac
14200 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  e before the.   
14210 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   ** beginning of
14220 20 70 54 6d 70 53 70 61 63 65 20 61 73 20 61 6e   pTmpSpace as an
14230 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c 65 20   area available 
14240 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65 0a 20  to prepend the. 
14250 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64     ** left-child
14260 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
14270 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63  beginning of a c
14280 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
14290 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  if( pBt->pTmpSpa
142a0 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  ce ){.      mems
142b0 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  et(pBt->pTmpSpac
142c0 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 20 20  e, 0, 8);.      
142d0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b  pBt->pTmpSpace +
142e0 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 4;.    }.  }.}
142f0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
14300 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
14310 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74  allocation.*/.st
14320 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65  atic void freeTe
14330 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
14340 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42   *pBt){.  if( pB
14350 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
14360 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
14370 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c  ce -= 4;.    sql
14380 69 74 65 33 50 61 67 65 46 72 65 65 28 70 42 74  ite3PageFree(pBt
14390 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
143a0 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
143b0 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
143c0 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e  ** Close an open
143d0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e   database and in
143e0 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72  validate all cur
143f0 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sors..*/.int sql
14400 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42  ite3BtreeClose(B
14410 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
14420 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
14430 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  Bt;.  BtCursor *
14440 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  pCur;..  /* Clos
14450 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  e all cursors op
14460 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61  ened via this ha
14470 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ndle.  */.  asse
14480 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
14490 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
144a0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
144b0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
144c0 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43    pCur = pBt->pC
144d0 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20  ursor;.  while( 
144e0 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75  pCur ){.    BtCu
144f0 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75  rsor *pTmp = pCu
14500 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43  r;.    pCur = pC
14510 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69  ur->pNext;.    i
14520 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d  f( pTmp->pBtree=
14530 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =p ){.      sqli
14540 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
14550 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d  sor(pTmp);.    }
14560 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62  .  }..  /* Rollb
14570 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74  ack any active t
14580 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66  ransaction and f
14590 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73  ree the handle s
145a0 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54  tructure..  ** T
145b0 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
145c0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
145d0 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c  ) drops any tabl
145e0 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a  e-locks held by.
145f0 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65    ** this handle
14600 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
14610 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c  BtreeRollback(p,
14620 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a   SQLITE_OK, 0);.
14630 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
14640 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ave(p);..  /* If
14650 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
14660 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69   other outstandi
14670 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
14680 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
14690 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
146a0 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68  , return now. Th
146b0 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
146c0 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
146d0 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68  eans .  ** up th
146e0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a  e shared-btree..
146f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
14700 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
14710 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  && p->locked==0 
14720 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  );.  if( !p->sha
14730 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46  rable || removeF
14740 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70  romSharingList(p
14750 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Bt) ){.    /* Th
14760 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e pBt is no long
14770 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e  er on the sharin
14780 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61  g list, so we ca
14790 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20  n access.    ** 
147a0 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  it without havin
147b0 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  g to hold the mu
147c0 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tex..    **.    
147d0 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64  ** Clean out and
147e0 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68   delete the BtSh
147f0 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20  ared object..   
14800 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
14810 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
14820 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
14830 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
14840 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  er);.    if( pBt
14850 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
14860 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
14870 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65  .      pBt->xFre
14880 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63  eSchema(pBt->pSc
14890 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
148a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
148b0 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  , pBt->pSchema);
148c0 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
148d0 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ce(pBt);.    sql
148e0 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
148f0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
14900 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
14910 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20  CACHE.  assert( 
14920 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
14930 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
14940 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
14950 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70  if( p->pPrev ) p
14960 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
14970 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28   p->pNext;.  if(
14980 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70   p->pNext ) p->p
14990 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
149a0 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a  >pPrev;.#endif..
149b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
149c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
149d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
149e0 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
149f0 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
14a00 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20  f pages allowed 
14a10 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
14a20 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
14a30 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20  number of cache 
14a40 70 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20  pages is set to 
14a50 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20  the absolute.** 
14a60 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e  value of mxPage.
14a70 20 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e    If mxPage is n
14a80 65 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67  egative, the pag
14a90 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61  er will.** opera
14aa0 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  te asynchronousl
14ab0 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  y - it will not 
14ac0 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63  stop to do fsync
14ad0 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65  ()s.** to insure
14ae0 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
14af0 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72   to the disk sur
14b00 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63  face before.** c
14b10 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e  ontinuing.  Tran
14b20 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77  sactions still w
14b30 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f  ork if synchrono
14b40 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e  us is off,.** an
14b50 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
14b60 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  annot be corrupt
14b70 65 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72  ed if this progr
14b80 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20  am.** crashes.  
14b90 42 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61  But if the opera
14ba0 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
14bb0 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a  hes or there is.
14bc0 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77  ** an abrupt pow
14bd0 65 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20  er failure when 
14be0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
14bf0 66 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ff, the database
14c00 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66  .** could be lef
14c10 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
14c20 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76  tent and unrecov
14c30 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a  erable state..**
14c40 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   Synchronous is 
14c50 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f  on by default so
14c60 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
14c70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e  tion is not.** n
14c80 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e  ormally a worry.
14c90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
14ca0 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
14cb0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
14cc0 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
14cd0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
14ce0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
14cf0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
14d00 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
14d10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
14d20 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
14d30 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
14d40 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
14d50 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
14d60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
14d70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14d80 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
14d90 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
14da0 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  >0./*.** Change 
14db0 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  the limit on the
14dc0 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64   amount of the d
14dd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61  atabase file tha
14de0 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f  t may be.** memo
14df0 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e  ry mapped..*/.in
14e00 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
14e10 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65  tMmapLimit(Btree
14e20 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74   *p, sqlite3_int
14e30 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74  64 szMmap){.  Bt
14e40 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
14e50 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
14e60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
14e70 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
14e80 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
14e90 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
14ea0 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
14eb0 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
14ec0 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73  er, szMmap);.  s
14ed0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
14ee0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
14ef0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
14f00 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
14f10 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
14f20 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
14f30 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e   way data is syn
14f40 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f  ced to disk in o
14f50 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65  rder to increase
14f60 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20   or decrease.** 
14f70 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74  how well the dat
14f80 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61  abase resists da
14f90 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
14fa0 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72  rashes and power
14fb0 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c  .** failures.  L
14fc0 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61  evel 1 is the sa
14fd0 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f  me as asynchrono
14fe0 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f  us (no syncs() o
14ff0 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72  ccur and.** ther
15000 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62  e is a high prob
15010 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
15020 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74  e)  Level 2 is t
15030 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65  he default.  The
15040 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20  re.** is a very 
15050 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f  low but non-zero
15060 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
15070 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33  damage.  Level 3
15080 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20   reduces the.** 
15090 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
150a0 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65  amage to near ze
150b0 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72  ro but with a wr
150c0 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ite performance 
150d0 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  reduction..*/.#i
150e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
150f0 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
15100 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
15110 53 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20  SetPagerFlags(. 
15120 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
15130 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
15140 74 72 65 65 20 74 6f 20 73 65 74 20 74 68 65 20  tree to set the 
15150 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20  safety level on 
15160 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67  */.  unsigned pg
15170 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56  Flags       /* V
15180 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66  arious PAGER_* f
15190 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  lags */.){.  BtS
151a0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
151b0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
151c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
151d0 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
151e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
151f0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
15200 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
15210 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  s(pBt->pPager, p
15220 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74  gFlags);.  sqlit
15230 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
15240 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15250 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
15260 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
15270 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62 74   if the given bt
15280 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73 61  ree is set to sa
15290 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49  fety level 1.  I
152a0 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
152b0 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
152c0 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72   no sync() occur
152d0 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s on the disk fi
152e0 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
152f0 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61  te3BtreeSyncDisa
15300 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a  bled(Btree *p){.
15310 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
15320 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
15330 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
15340 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15350 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
15360 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ;  .  sqlite3Btr
15370 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
15380 73 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74  sert( pBt && pBt
15390 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63  ->pPager );.  rc
153a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e   = sqlite3PagerN
153b0 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65  osync(pBt->pPage
153c0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
153d0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
153e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
153f0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66  * Change the def
15400 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20  ault pages size 
15410 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
15420 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
15430 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72   per page..** Or
15440 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  , if the page si
15450 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ze has already b
15460 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72  een fixed, retur
15470 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
15480 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68  Y .** without ch
15490 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e  anging anything.
154a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
154b0 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70  size must be a p
154c0 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65  ower of 2 betwee
154d0 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e  n 512 and 65536.
154e0 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a    If the page.**
154f0 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64   size supplied d
15500 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69  oes not meet thi
15510 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65  s constraint the
15520 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  n the page size 
15530 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65  is not.** change
15540 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69  d..**.** Page si
15550 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69  zes are constrai
15560 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  ned to be a powe
15570 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74  r of two so that
15580 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f   the region.** o
15590 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
155a0 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ile used for loc
155b0 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20  king (beginning 
155c0 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  at PENDING_BYTE,
155d0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79  .** the first by
155e0 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20  te past the 1GB 
155f0 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30  boundary, 0x4000
15600 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f  0000) needs to o
15610 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62  ccur.** at the b
15620 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61  eginning of a pa
15630 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ge..**.** If par
15640 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20  ameter nReserve 
15650 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
15660 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  o, then the numb
15670 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a  er of reserved.*
15680 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  * bytes per page
15690 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
156a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
156b0 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68   iFix!=0 then th
156c0 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  e BTS_PAGESIZE_F
156d0 49 58 45 44 20 66 6c 61 67 20 69 73 20 73 65 74  IXED flag is set
156e0 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
156f0 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75  e size.** and au
15700 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61  tovacuum mode ca
15710 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63  n no longer be c
15720 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
15730 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
15740 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
15750 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69   int pageSize, i
15760 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74  nt nReserve, int
15770 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63   iFix){.  int rc
15780 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15790 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
157a0 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
157b0 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26  ( nReserve>=-1 &
157c0 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
157d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
157e0 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53  eEnter(p);.#if S
157f0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
15800 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70    if( nReserve>p
15810 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
15820 76 65 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61  ve ) pBt->optima
15830 6c 52 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e  lReserve = (u8)n
15840 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a  Reserve;.#endif.
15850 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
15860 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
15870 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20  ZE_FIXED ){.    
15880 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15890 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
158a0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
158b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
158c0 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
158d0 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
158e0 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
158f0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
15900 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
15910 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
15920 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61  =255 );.  if( pa
15930 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
15940 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
15950 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
15960 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
15970 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
15980 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
15990 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
159a0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
159b0 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
159c0 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
159d0 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61  geSize = (u32)pa
159e0 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65  geSize;.    free
159f0 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
15a00 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
15a10 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
15a20 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
15a30 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
15a40 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74  nReserve);.  pBt
15a50 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
15a60 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28  Bt->pageSize - (
15a70 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  u16)nReserve;.  
15a80 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e  if( iFix ) pBt->
15a90 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
15aa0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
15ab0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
15ac0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
15ad0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
15ae0 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
15af0 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
15b00 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
15b10 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
15b20 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
15b30 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
15b40 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  pageSize;.}../*.
15b50 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
15b60 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73   is similar to s
15b70 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
15b80 73 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20  serve(), except 
15b90 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f  that it.** may o
15ba0 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66  nly be called if
15bb0 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
15bc0 64 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65  d that the b-tre
15bd0 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61  e mutex is alrea
15be0 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a  dy.** held..**.*
15bf0 2a 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c  * This is useful
15c00 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20   in one special 
15c10 63 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b  case in the back
15c20 75 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72  up API code wher
15c30 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e  e it is.** known
15c40 20 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64   that the shared
15c50 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
15c60 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d   held, but the m
15c70 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  utex on the .** 
15c80 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
15c90 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20  that owns *p is 
15ca0 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  not. In this cas
15cb0 65 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65  e if sqlite3Btre
15cc0 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65  eEnter().** were
15cd0 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69   to be called, i
15ce0 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20  t might collide 
15cf0 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20  with some other 
15d00 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65  operation on the
15d10 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
15d20 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
15d30 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69  , causing undefi
15d40 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  ned behavior..*/
15d50 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15d60 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74  eGetReserveNoMut
15d70 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ex(Btree *p){.  
15d80 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28  int n;.  assert(
15d90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
15da0 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65  eld(p->pBt->mute
15db0 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70  x) );.  n = p->p
15dc0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
15dd0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
15de0 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  e;.  return n;.}
15df0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
15e00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
15e10 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74  es of space at t
15e20 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
15e30 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65  page that.** are
15e40 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66   intentually lef
15e50 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20  t unused.  This 
15e60 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64  is the "reserved
15e70 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a  " space that is.
15e80 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65  ** sometimes use
15e90 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e  d by extensions.
15ea0 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
15eb0 5f 48 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65  _HAS_MUTEX is de
15ec0 66 69 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e  fined then the n
15ed0 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69  umber returned i
15ee0 73 20 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72  s the.** greater
15ef0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
15f00 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 61  reserved space a
15f10 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72  nd the maximum r
15f20 65 71 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65  equested.** rese
15f30 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e  rve space..*/.in
15f40 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
15f50 74 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28  tOptimalReserve(
15f60 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
15f70 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
15f80 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
15f90 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
15fa0 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28  tReserveNoMutex(
15fb0 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
15fc0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
15fd0 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69  ( n<p->pBt->opti
15fe0 6d 61 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d  malReserve ) n =
15ff0 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c   p->pBt->optimal
16000 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a  Reserve;.#endif.
16010 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16020 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
16030 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65   n;.}.../*.** Se
16040 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
16050 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
16060 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
16070 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
16080 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
16090 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
160a0 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
160b0 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
160c0 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
160d0 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
160e0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
160f0 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
16100 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
16110 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
16120 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
16130 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
16140 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
16150 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
16160 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
16170 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
16180 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
16190 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
161a0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
161b0 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f  .** Set the BTS_
161c0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c  SECURE_DELETE fl
161d0 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73  ag if newFlag is
161e0 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77   0 or 1.  If new
161f0 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74  Flag is -1,.** t
16200 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e  hen make no chan
16210 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74  ges.  Always ret
16220 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
16230 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f   the BTS_SECURE_
16240 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e  DELETE.** settin
16250 67 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  g after the chan
16260 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
16270 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c  e3BtreeSecureDel
16280 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ete(Btree *p, in
16290 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e  t newFlag){.  in
162a0 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t b;.  if( p==0 
162b0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71  ) return 0;.  sq
162c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
162d0 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61  p);.  if( newFla
162e0 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70  g>=0 ){.    p->p
162f0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
16300 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45  ~BTS_SECURE_DELE
16310 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46  TE;.    if( newF
16320 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74  lag ) p->pBt->bt
16330 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45  sFlags |= BTS_SE
16340 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d  CURE_DELETE;.  }
16350 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d   .  b = (p->pBt-
16360 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
16370 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d  SECURE_DELETE)!=
16380 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
16390 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
163a0 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn b;.}../*.** 
163b0 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f  Change the 'auto
163c0 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
163d0 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
163e0 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56  e. If the 'autoV
163f0 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65  acuum'.** parame
16400 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
16410 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75   then auto-vacuu
16420 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65  m mode is enable
16430 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a  d. If zero, it.*
16440 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54  * is disabled. T
16450 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
16460 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61   for the auto-va
16470 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73  cuum property is
16480 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
16490 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45  by the SQLITE_DE
164a0 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
164b0 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73   macro..*/.int s
164c0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75  qlite3BtreeSetAu
164d0 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
164e0 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  p, int autoVacuu
164f0 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m){.#ifdef SQLIT
16500 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
16510 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  M.  return SQLIT
16520 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73  E_READONLY;.#els
16530 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  e.  BtShared *pB
16540 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
16550 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16560 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29  ;.  u8 av = (u8)
16570 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73  autoVacuum;..  s
16580 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16590 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d  (p);.  if( (pBt-
165a0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
165b0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21  PAGESIZE_FIXED)!
165c0 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21  =0 && (av ?1:0)!
165d0 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  =pBt->autoVacuum
165e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
165f0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
16600 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
16610 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20  autoVacuum = av 
16620 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69  ?1:0;.    pBt->i
16630 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d  ncrVacuum = av==
16640 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71  2 ?1:0;.  }.  sq
16650 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16660 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
16670 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
16680 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
16690 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
166a0 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
166b0 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
166c0 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
166d0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
166e0 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
166f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
16700 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
16710 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
16720 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
16730 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
16740 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
16750 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
16760 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
16770 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
16780 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
16790 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
167a0 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
167b0 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
167c0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
167d0 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
167e0 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
167f0 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
16800 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
16810 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16820 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
16830 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  if.}.../*.** Get
16840 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
16850 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
16860 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
16870 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
16880 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
16890 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
168a0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
168b0 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
168c0 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
168d0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
168e0 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
168f0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
16900 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
16910 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
16920 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
16930 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
16940 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
16950 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
16960 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
16970 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
16980 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
16990 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
169a0 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
169b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
169c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
169d0 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  ult code from su
169e0 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  bfunctions */.  
169f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
16a00 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f       /* Page 1 o
16a10 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
16a20 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
16a30 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
16a40 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
16a50 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
16a60 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46   */.  int nPageF
16a70 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75  ile = 0;   /* Nu
16a80 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
16a90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16aa0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
16ab0 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20  eHeader;     /* 
16ac0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
16ad0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
16ae0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72  according to hdr
16af0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
16b00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16b10 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
16b20 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
16b30 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72  pPage1==0 );.  r
16b40 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16b50 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e  SharedLock(pBt->
16b60 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
16b70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
16b80 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
16b90 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
16ba0 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
16bb0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
16bc0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
16bd0 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  rc;..  /* Do som
16be0 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
16bf0 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
16c00 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
16c10 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
16c20 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
16c30 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65  e. .  */.  nPage
16c40 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d   = nPageHeader =
16c50 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38   get4byte(28+(u8
16c60 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  *)pPage1->aData)
16c70 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
16c80 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
16c90 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c  Pager, &nPageFil
16ca0 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d  e);.  if( nPage=
16cb0 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b  =0 || memcmp(24+
16cc0 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
16cd0 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67  ta, 92+(u8*)pPag
16ce0 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20  e1->aData,4)!=0 
16cf0 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  ){.    nPage = n
16d00 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20  PageFile;.  }.  
16d10 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
16d20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b     u32 pageSize;
16d30 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53  .    u32 usableS
16d40 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67  ize;.    u8 *pag
16d50 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61  e1 = pPage1->aDa
16d60 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ta;.    rc = SQL
16d70 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
16d80 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
16d90 52 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45 76  R-43737-39999 Ev
16da0 65 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65  ery valid SQLite
16db0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
16dc0 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74  egins.    ** wit
16dd0 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
16de0 31 36 20 62 79 74 65 73 20 28 69 6e 20 68 65 78  16 bytes (in hex
16df0 29 3a 20 35 33 20 35 31 20 34 63 20 36 39 20 37  ): 53 51 4c 69 7
16e00 34 20 36 35 20 32 30 20 36 36 20 36 66 20 37 32  4 65 20 66 6f 72
16e10 20 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34   6d.    ** 61 74
16e20 20 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20   20 33 00. */.  
16e30 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
16e40 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
16e50 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
16e60 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
16e70 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
16e80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
16e90 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20  MIT_WAL.    if( 
16ea0 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20  page1[18]>1 ){. 
16eb0 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
16ec0 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
16ed0 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
16ee0 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
16ef0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
16f00 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
16f10 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
16f20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20  if( page1[18]>2 
16f30 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
16f40 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
16f50 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
16f60 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
16f70 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >2 ){.      goto
16f80 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
16f90 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
16fa0 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76  * If the write v
16fb0 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f  ersion is set to
16fc0 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73   2, this databas
16fd0 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65  e should be acce
16fe0 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57  ssed.    ** in W
16ff0 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  AL mode. If the 
17000 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  log is not alrea
17010 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74  dy open, open it
17020 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20   now. Then .    
17030 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
17040 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77  _OK and return w
17050 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e  ithout populatin
17060 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65  g BtShared.pPage
17070 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  1..    ** The ca
17080 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69  ller detects thi
17090 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73  s and calls this
170a0 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e   function again.
170b0 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20   This is.    ** 
170c0 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20  required as the 
170d0 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
170e0 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  1 currently in t
170f0 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a  he page1 buffer.
17100 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62      ** may not b
17110 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72  e the latest ver
17120 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79  sion - there may
17130 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20   be a newer one 
17140 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a  in the log.    *
17150 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  * file..    */. 
17160 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
17170 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73  ==2 && (pBt->bts
17180 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57  Flags & BTS_NO_W
17190 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  AL)==0 ){.      
171a0 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a  int isOpen = 0;.
171b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
171c0 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
171d0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f  Bt->pPager, &isO
171e0 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pen);.      if( 
171f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17200 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
17210 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
17220 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
17230 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20   isOpen==0 ){.  
17240 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
17250 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
17260 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17270 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
17280 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
17290 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e  OTADB;.    }.#en
172a0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44  dif..    /* EVID
172b0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35  ENCE-OF: R-15465
172c0 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d  -20813 The maxim
172d0 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65  um and minimum e
172e0 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a  mbedded payload.
172f0 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73      ** fractions
17300 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61   and the leaf pa
17310 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76  yload fraction v
17320 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 36 34  alues must be 64
17330 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20  , 32, and 32..  
17340 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
17350 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
17360 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d  allowed these am
17370 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62  ounts to vary, b
17380 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ut as of.    ** 
17390 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77  version 3.6.0, w
173a0 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74  e require them t
173b0 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20  o be fixed..    
173c0 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
173d0 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c  p(&page1[21], "\
173e0 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21  100\040\040",3)!
173f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
17400 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
17410 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
17420 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
17430 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20  51873-39618 The 
17440 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20  page size for a 
17450 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
17460 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e  .    ** determin
17470 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65  ed by the 2-byte
17480 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64   integer located
17490 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
174a0 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20   16 bytes from. 
174b0 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e     ** the beginn
174c0 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
174d0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
174e0 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67   pageSize = (pag
174f0 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61  e1[16]<<8) | (pa
17500 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  ge1[17]<<16);.  
17510 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
17520 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20  : R-25008-21688 
17530 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61  The size of a pa
17540 67 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66  ge is a power of
17550 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77   two.    ** betw
17560 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
17570 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a  6 inclusive. */.
17580 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69      if( ((pageSi
17590 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21  ze-1)&pageSize)!
175a0 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  =0.     || pageS
175b0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
175c0 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c  AGE_SIZE .     |
175d0 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20  | pageSize<=256 
175e0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
175f0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
17600 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
17610 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
17620 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
17630 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
17640 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54   R-59310-51205 T
17650 68 65 20 22 72 65 73 65 72 76 65 64 20 73 70 61  he "reserved spa
17660 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20  ce" size in the 
17670 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e  1-byte.    ** in
17680 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
17690 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  20 is the number
176a0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
176b0 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
176c0 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67  .    ** each pag
176d0 65 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72  e to reserve for
176e0 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20   extensions. .  
176f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44    **.    ** EVID
17700 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37  ENCE-OF: R-37497
17710 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20  -42412 The size 
17720 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20  of the reserved 
17730 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a  region is.    **
17740 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
17750 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69  he one-byte unsi
17760 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75  gned integer fou
17770 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  nd at an offset 
17780 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74  of 20.    ** int
17790 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
177a0 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  ile header. */. 
177b0 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
177c0 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31  pageSize - page1
177d0 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75  [20];.    if( (u
177e0 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74  32)pageSize!=pBt
177f0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
17800 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61      /* After rea
17810 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  ding the first p
17820 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
17830 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70  ase assuming a p
17840 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a  age size.      *
17850 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61  * of BtShared.pa
17860 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20  geSize, we have 
17870 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
17880 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73  the page-size is
17890 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  .      ** actual
178a0 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c  ly pageSize. Unl
178b0 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
178c0 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  , leave pBt->pPa
178d0 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20  ge1 at.      ** 
178e0 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  zero and return 
178f0 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63  SQLITE_OK. The c
17900 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  aller will call 
17910 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
17920 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
17930 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  h the correct pa
17940 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a  ge-size..      *
17950 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  /.      releaseP
17960 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
17970 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
17980 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  ze = usableSize;
17990 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
179a0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
179b0 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53  .      freeTempS
179c0 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20  pace(pBt);.     
179d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
179e0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
179f0 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
17a00 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
17a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
17a30 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a  geSize-usableSiz
17a40 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
17a50 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
17a60 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61  f( (pBt->db->fla
17a70 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 63 6f  gs & SQLITE_Reco
17a80 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20  veryMode)==0 && 
17a90 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20  nPage>nPageFile 
17aa0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
17ab0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
17ac0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
17ad0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
17ae0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56  .    }.    /* EV
17af0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33  IDENCE-OF: R-283
17b00 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76 65 72  12-64704 However
17b10 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73 69 7a  , the usable siz
17b20 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  e is not allowed
17b30 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65   to.    ** be le
17b40 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49 6e 20  ss than 480. In 
17b50 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
17b60 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
17b70 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65 0a 20   512, then the. 
17b80 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64 20 73     ** reserved s
17b90 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74  pace size cannot
17ba0 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20   exceed 32. */. 
17bb0 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a     if( usableSiz
17bc0 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67  e<480 ){.      g
17bd0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
17be0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
17bf0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
17c00 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
17c10 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
17c20 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66   usableSize;.#if
17c30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17c40 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
17c50 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
17c60 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
17c70 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  e1[36 + 4*4])?1:
17c80 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  0);.    pBt->inc
17c90 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
17ca0 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
17cb0 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
17cc0 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78  if.  }..  /* max
17cd0 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78  Local is the max
17ce0 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
17cf0 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20  ayload to store 
17d00 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a  locally for.  **
17d10 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73   a cell.  Make s
17d20 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20  ure it is small 
17d30 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
17d40 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75  t least minFanou
17d50 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e  t.  ** cells can
17d60 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65   will fit on one
17d70 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d   page.  We assum
17d80 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65  e a 10-byte page
17d90 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65   header..  ** Be
17da0 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61  sides the payloa
17db0 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74  d, the cell must
17dc0 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20   store:.  **    
17dd0 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20   2-byte pointer 
17de0 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a  to the cell.  **
17df0 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c       4-byte chil
17e00 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20  d pointer.  **  
17e10 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76     9-byte nKey v
17e20 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
17e30 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65  byte nData value
17e40 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
17e50 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
17e60 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61  ointer.  ** So a
17e70 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
17e80 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74  f a 2-byte point
17e90 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69  er, a header whi
17ea0 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73  ch is as much as
17eb0 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c  .  ** 17 bytes l
17ec0 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65  ong, 0 to N byte
17ed0 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e  s of payload, an
17ee0 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20  d an optional 4 
17ef0 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20  byte overflow.  
17f00 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e  ** page pointer.
17f10 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78  .  */.  pBt->max
17f20 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70  Local = (u16)((p
17f30 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
17f40 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b  2)*64/255 - 23);
17f50 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c  .  pBt->minLocal
17f60 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
17f70 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
17f80 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
17f90 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31  t->maxLeaf = (u1
17fa0 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  6)(pBt->usableSi
17fb0 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d  ze - 35);.  pBt-
17fc0 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29  >minLeaf = (u16)
17fd0 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
17fe0 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
17ff0 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d  3);.  if( pBt->m
18000 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20  axLocal>127 ){. 
18010 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65     pBt->max1byte
18020 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20  Payload = 127;. 
18030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
18040 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
18050 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c   = (u8)pBt->maxL
18060 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ocal;.  }.  asse
18070 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  rt( pBt->maxLeaf
18080 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c   + 23 <= MX_CELL
18090 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
180a0 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50  pBt->pPage1 = pP
180b0 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61  age1;.  pBt->nPa
180c0 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
180d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
180e0 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c  .page1_init_fail
180f0 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ed:.  releasePag
18100 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74  e(pPage1);.  pBt
18110 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
18120 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
18130 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
18140 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
18150 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
18160 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69  open on pBt. Thi
18170 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
18180 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
18190 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
181a0 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
181b0 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
181c0 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
181d0 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75  ** Only write cu
181e0 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
181f0 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74  d if wrOnly is t
18200 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20  rue.  If wrOnly 
18210 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e  is.** false then
18220 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
18230 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   counted..**.** 
18240 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
18250 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
18260 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e  , a cursor is an
18270 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a  y cursor that.**
18280 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72   is capable of r
18290 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
182a0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
182b0 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61 74  e.  Cursors that
182c0 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72  .** have been tr
182d0 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43  ipped into the C
182e0 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74  URSOR_FAULT stat
182f0 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65  e are not counte
18300 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
18310 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f   countValidCurso
18320 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
18330 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20  , int wrOnly){. 
18340 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
18350 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
18360 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
18370 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
18380 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
18390 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d      if( (wrOnly=
183a0 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72  =0 || (pCur->cur
183b0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
183c0 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20  teFlag)!=0).    
183d0 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
183e0 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  !=CURSOR_FAULT )
183f0 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
18400 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
18410 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  ./*.** If there 
18420 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
18430 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77  ng cursors and w
18440 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  e are not in the
18450 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20   middle.** of a 
18460 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20  transaction but 
18470 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20  there is a read 
18480 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
18490 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  base, then.** th
184a0 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66  is routine unref
184b0 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
184c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
184d0 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20   file which .** 
184e0 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
184f0 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  f releasing the 
18500 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  read lock..**.**
18510 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
18520 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
18530 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75  ogress, this rou
18540 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
18550 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18560 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
18570 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42  sed(BtShared *pB
18580 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
18590 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
185a0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
185b0 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56    assert( countV
185c0 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c  alidCursors(pBt,
185d0 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e  0)==0 || pBt->in
185e0 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e  Transaction>TRAN
185f0 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  S_NONE );.  if( 
18600 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
18610 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
18620 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30  & pBt->pPage1!=0
18630 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   ){.    MemPage 
18640 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
18650 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73 65 72  Page1;.    asser
18660 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t( pPage1->aData
18670 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18680 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
18690 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
186a0 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==1 );.    pBt-
186b0 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
186c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
186d0 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ge1);.  }.}../*.
186e0 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73  ** If pBt points
186f0 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c   to an empty fil
18700 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74  e then convert t
18710 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a  hat empty file.*
18720 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70  * into a new emp
18730 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69  ty database by i
18740 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
18750 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a  first page of.**
18760 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
18770 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
18780 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
18790 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
187a0 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67  ge *pP1;.  unsig
187b0 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
187c0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
187d0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
187e0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
187f0 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
18800 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ->nPage>0 ){.   
18810 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18820 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70  K;.  }.  pP1 = p
18830 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
18840 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
18850 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
18860 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
18870 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
18880 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
18890 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
188a0 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
188b0 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
188c0 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
188d0 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
188e0 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
188f0 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64  ader)==16 );.  d
18900 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28  ata[16] = (u8)((
18910 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38  pBt->pageSize>>8
18920 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
18930 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  17] = (u8)((pBt-
18940 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30  >pageSize>>16)&0
18950 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  xff);.  data[18]
18960 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
18970 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
18980 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c  pBt->usableSize<
18990 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  =pBt->pageSize &
189a0 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  & pBt->usableSiz
189b0 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65  e+255>=pBt->page
189c0 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30  Size);.  data[20
189d0 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61  ] = (u8)(pBt->pa
189e0 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
189f0 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  ableSize);.  dat
18a00 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61  a[21] = 64;.  da
18a10 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64  ta[22] = 32;.  d
18a20 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20  ata[23] = 32;.  
18a30 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
18a40 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
18a50 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
18a60 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
18a70 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
18a80 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ;.  pBt->btsFlag
18a90 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
18aa0 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
18ab0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
18ac0 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
18ad0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
18ae0 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
18af0 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
18b00 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
18b10 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
18b20 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
18b30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
18b40 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
18b50 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
18b60 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
18b70 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
18b80 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
18b90 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50  #endif.  pBt->nP
18ba0 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  age = 1;.  data[
18bb0 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  31] = 1;.  retur
18bc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
18bd0 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
18be0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
18bf0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
18c00 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61  file (creating a
18c10 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
18c20 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e  sisting of a sin
18c30 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20  gle page and no 
18c40 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e  schema objects).
18c50 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
18c60 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66  K.** if successf
18c70 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
18c80 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
18c90 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
18ca0 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62 28  lite3BtreeNewDb(
18cb0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
18cc0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
18cd0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
18ce0 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30  ->pBt->nPage = 0
18cf0 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61  ;.  rc = newData
18d00 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20  base(p->pBt);.  
18d10 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
18d20 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
18d30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
18d40 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e  mpt to start a n
18d50 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ew transaction. 
18d60 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
18d70 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65  ion.** is starte
18d80 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  d if the second 
18d90 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a  argument is nonz
18da0 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ero, otherwise a
18db0 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61   read-.** transa
18dc0 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ction.  If the s
18dd0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
18de0 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20  s 2 or more and 
18df0 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61  exclusive.** tra
18e00 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
18e10 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  ted, meaning tha
18e20 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
18e30 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  ss is allowed.**
18e40 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
18e50 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65  atabase.  A pree
18e60 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74  xisting transact
18e70 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ion may not be.*
18e80 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78  * upgraded to ex
18e90 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69  clusive by calli
18ea0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
18eb0 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20  a second time - 
18ec0 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69  the.** exclusivi
18ed0 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72  ty flag only wor
18ee0 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61  ks for a new tra
18ef0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
18f00 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
18f10 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
18f20 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  ted before attem
18f30 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68  pting any .** ch
18f40 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
18f50 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20  abase.  None of 
18f60 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
18f70 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20  utines .** will 
18f80 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72  work unless a tr
18f90 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
18fa0 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a  rted first:.**.*
18fb0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
18fc0 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
18fd0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
18fe0 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78  BtreeCreateIndex
18ff0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
19000 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
19010 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
19020 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
19030 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
19040 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29  te3BtreeInsert()
19050 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
19060 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a  BtreeDelete().**
19070 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
19080 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a  eeUpdateMeta().*
19090 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69  *.** If an initi
190a0 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  al attempt to ac
190b0 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66  quire the lock f
190c0 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20  ails because of 
190d0 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a  lock contention.
190e0 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
190f0 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ase was previous
19100 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  ly unlocked, the
19110 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  n invoke the bus
19120 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20  y handler.** if 
19130 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42  there is one.  B
19140 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ut if there was 
19150 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61  previously a rea
19160 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a  d-lock, do not.*
19170 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
19180 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74  y handler - just
19190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
191a0 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53  USY.  SQLITE_BUS
191b0 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  Y is .** returne
191c0 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
191d0 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
191e0 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ock in order to 
191f0 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b  avoid a deadlock
19200 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ..**.** Suppose 
19210 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72  there are two pr
19220 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e  ocesses A and B.
19230 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c    A has a read l
19240 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a  ock and B has.**
19250 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
19260 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72  .  B tries to pr
19270 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69  omote to exclusi
19280 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ve but is blocke
19290 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20  d because.** of 
192a0 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20  A's read lock.  
192b0 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  A tries to promo
192c0 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62  te to reserved b
192d0 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79  ut is blocked by
192e0 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68   B..** One or th
192f0 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74  e other of the t
19300 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73  wo processes mus
19310 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68  t give way or th
19320 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f  ere can be.** no
19330 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72   progress.  By r
19340 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
19350 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76  BUSY and not inv
19360 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63  oking the busy c
19370 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20  allback.** when 
19380 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
19390 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e  read lock, we en
193a0 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76  courage A to giv
193b0 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a  e up and let B.*
193c0 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e  * proceed..*/.in
193d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
193e0 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  ginTrans(Btree *
193f0 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a  p, int wrflag){.
19400 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63    sqlite3 *pBloc
19410 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65  k = 0;.  BtShare
19420 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
19430 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19440 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65  TE_OK;..  sqlite
19450 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
19460 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
19470 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
19480 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61  e btree is alrea
19490 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72  dy in a write-tr
194a0 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74  ansaction, or it
194b0 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  .  ** is already
194c0 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73   in a read-trans
194d0 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61  action and a rea
194e0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d-transaction.  
194f0 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ** is requested,
19500 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
19510 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
19520 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
19530 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72  RITE || (p->inTr
19540 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ans==TRANS_READ 
19550 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20  && !wrflag) ){. 
19560 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
19570 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  gun;.  }.  asser
19580 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
19590 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
195a0 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41  TE || IfNotOmitA
195b0 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61  V(pBt->bDoTrunca
195c0 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  te)==0 );..  /* 
195d0 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  Write transactio
195e0 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69  ns are not possi
195f0 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e  ble on a read-on
19600 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
19610 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
19620 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
19630 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61  NLY)!=0 && wrfla
19640 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
19650 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
19660 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
19670 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
19680 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
19690 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20  ARED_CACHE.  /* 
196a0 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
196b0 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
196c0 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
196d0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
196e0 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  n .  ** on this 
196f0 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
19700 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
19710 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
19720 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65  ction is.  ** re
19730 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
19740 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
19750 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61   */.  if( (wrfla
19760 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
19770 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
19780 52 49 54 45 29 0a 20 20 20 7c 7c 20 28 70 42 74  RITE).   || (pBt
19790 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
197a0 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 29  _PENDING)!=0.  )
197b0 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70  {.    pBlock = p
197c0 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b  Bt->pWriter->db;
197d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66  .  }else if( wrf
197e0 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c  lag>1 ){.    BtL
197f0 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20  ock *pIter;.    
19800 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
19810 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
19820 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
19830 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
19840 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a  r->pBtree!=p ){.
19850 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d          pBlock =
19860 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e   pIter->pBtree->
19870 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  db;.        brea
19880 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
19890 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63  .  }.  if( pBloc
198a0 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
198b0 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
198c0 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29  d(p->db, pBlock)
198d0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
198e0 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
198f0 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74  ACHE;.    goto t
19900 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
19910 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79  #endif..  /* Any
19920 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65   read-only or re
19930 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63  ad-write transac
19940 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72  tion implies a r
19950 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a  ead-lock on .  *
19960 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20  * page 1. So if 
19970 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65  some other share
19980 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61  d-cache client a
19990 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69  lready has a wri
199a0 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e  te-lock .  ** on
199b0 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61   page 1, the tra
199c0 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  nsaction cannot 
199d0 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  be opened. */.  
199e0 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64  rc = queryShared
199f0 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
19a00 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52  , MASTER_ROOT, R
19a10 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  EAD_LOCK);.  if(
19a20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
19a30 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
19a40 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c  n;..  pBt->btsFl
19a50 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54  ags &= ~BTS_INIT
19a60 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69  IALLY_EMPTY;.  i
19a70 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30  f( pBt->nPage==0
19a80 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
19a90 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c   |= BTS_INITIALL
19aa0 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a  Y_EMPTY;.  do {.
19ab0 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b      /* Call lock
19ac0 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69  Btree() until ei
19ad0 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31  ther pBt->pPage1
19ae0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72   is populated or
19af0 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65  .    ** lockBtre
19b00 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65  e() returns some
19b10 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
19b20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b   SQLITE_OK. lock
19b30 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d  Btree().    ** m
19b40 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
19b50 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42  _OK but leave pB
19b60 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f  t->pPage1 set to
19b70 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20   0 if after.    
19b80 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20  ** reading page 
19b90 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74  1 it discovers t
19ba0 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
19bb0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
19bc0 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69  e .    ** file i
19bd0 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53  s not pBt->pageS
19be0 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ize. In this cas
19bf0 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69  e lockBtree() wi
19c00 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a  ll update.    **
19c10 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74   pBt->pageSize t
19c20 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  o the page-size 
19c30 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
19c40 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  isk..    */.    
19c50 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67  while( pBt->pPag
19c60 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  e1==0 && SQLITE_
19c70 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74  OK==(rc = lockBt
19c80 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  ree(pBt)) );..  
19c90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19ca0 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
19cb0 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74 2d  .      if( (pBt-
19cc0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
19cd0 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b  READ_ONLY)!=0 ){
19ce0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
19cf0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
19d00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19d10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19d20 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e  PagerBegin(pBt->
19d30 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c  pPager,wrflag>1,
19d40 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
19d50 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  ory(p->db));.   
19d60 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
19d70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19d80 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
19d90 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
19da0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
19db0 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63   }.  .    if( rc
19dc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19dd0 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
19de0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
19df0 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28     }.  }while( (
19e00 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45  rc&0xFF)==SQLITE
19e10 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e  _BUSY && pBt->in
19e20 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
19e30 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20  NS_NONE &&.     
19e40 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65       btreeInvoke
19e50 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29  BusyHandler(pBt)
19e60 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
19e70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19e80 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
19e90 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
19ea0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
19eb0 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66  ction++;.#ifndef
19ec0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
19ed0 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
19ee0 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
19ef0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
19f00 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  t( p->lock.pBtre
19f10 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e  e==p && p->lock.
19f20 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20  iTable==1 );.   
19f30 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f       p->lock.eLo
19f40 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
19f50 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
19f60 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
19f70 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  ck;.        pBt-
19f80 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63  >pLock = &p->loc
19f90 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  k;.      }.#endi
19fa0 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  f.    }.    p->i
19fb0 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67  nTrans = (wrflag
19fc0 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41  ?TRANS_WRITE:TRA
19fd0 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66  NS_READ);.    if
19fe0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74  ( p->inTrans>pBt
19ff0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1a000 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
1a010 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d  Transaction = p-
1a020 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a  >inTrans;.    }.
1a030 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29      if( wrflag )
1a040 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  {.      MemPage 
1a050 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
1a060 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53  Page1;.#ifndef S
1a070 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1a080 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61 73  D_CACHE.      as
1a090 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69  sert( !pBt->pWri
1a0a0 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ter );.      pBt
1a0b0 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20  ->pWriter = p;. 
1a0c0 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
1a0d0 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55  gs &= ~BTS_EXCLU
1a0e0 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20  SIVE;.      if( 
1a0f0 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e  wrflag>1 ) pBt->
1a100 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
1a110 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69  EXCLUSIVE;.#endi
1a120 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  f..      /* If t
1a130 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65  he db-size heade
1a140 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72  r field is incor
1a150 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79 20  rect (as it may 
1a160 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20  be if an old.   
1a170 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73     ** client has
1a180 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68   been writing th
1a190 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
1a1a0 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e  , update it now.
1a1b0 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   Doing.      ** 
1a1c0 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68  this sooner rath
1a1d0 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65  er than later me
1a1e0 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
1a1f0 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79   size can safely
1a200 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65   .      ** re-re
1a210 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
1a220 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31  size from page 1
1a230 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   if a savepoint 
1a240 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  or transaction. 
1a250 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
1a260 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
1a270 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
1a280 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1a290 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67  f( pBt->nPage!=g
1a2a0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1a2b0 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20  >aData[28]) ){. 
1a2c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1a2d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1a2e0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1a2f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1a300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a310 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1a320 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
1a330 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
1a340 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a350 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74   }.    }.  }...t
1a360 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66  rans_begun:.  if
1a370 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a380 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
1a390 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61   /* This call ma
1a3a0 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68  kes sure that th
1a3b0 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
1a3c0 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f  correct number o
1a3d0 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61  f.    ** open sa
1a3e0 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65  vepoints. If the
1a3f0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
1a400 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
1a410 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74  n 0 and.    ** t
1a420 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
1a430 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
1a440 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  en, then it will
1a450 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e   be opened here.
1a460 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1a470 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1a480 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
1a490 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e  pPager, p->db->n
1a4a0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
1a4b0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1a4c0 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  y(p);.  sqlite3B
1a4d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1a4e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
1a4f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a500 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a  T_AUTOVACUUM../*
1a510 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e  .** Set the poin
1a520 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
1a530 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  for all children
1a540 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20   of page pPage. 
1a550 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67  Also, if.** pPag
1a560 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73  e contains cells
1a570 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
1a580 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73  verflow pages, s
1a590 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  et the pointer.*
1a5a0 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  * map entries fo
1a5b0 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
1a5c0 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ages as well..*/
1a5d0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43  .static int setC
1a5e0 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50  hildPtrmaps(MemP
1a5f0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
1a600 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a620 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72    /* Counter var
1a630 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  iable */.  int n
1a640 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
1a650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a660 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
1a670 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a   in page pPage *
1a680 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1a6b0 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61   code */.  BtSha
1a6c0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
1a6d0 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e  ->pBt;.  u8 isIn
1a6e0 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
1a6f0 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70  isInit;.  Pgno p
1a700 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
1a710 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
1a720 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1a730 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
1a740 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74  ex) );.  rc = bt
1a750 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
1a760 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
1a770 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
1a780 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
1a790 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20  rmaps_out;.  }. 
1a7a0 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
1a7b0 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d  nCell;..  for(i=
1a7c0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
1a7d0 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
1a7e0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
1a7f0 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61  , i);..    ptrma
1a800 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
1a810 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a  e, pCell, &rc);.
1a820 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
1a830 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
1a840 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
1a850 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
1a860 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1a870 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
1a880 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
1a890 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  gno, &rc);.    }
1a8a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
1a8b0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1a8c0 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
1a8d0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1a8e0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1a8f0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1a900 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1a910 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
1a920 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
1a930 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63  &rc);.  }..set_c
1a940 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
1a950 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  :.  pPage->isIni
1a960 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
1a970 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a980 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20  /*.** Somewhere 
1a990 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f  on pPage is a po
1a9a0 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46  inter to page iF
1a9b0 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69  rom.  Modify thi
1a9c0 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20  s pointer so.** 
1a9d0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
1a9e0 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72  o iTo. Parameter
1a9f0 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73   eType describes
1aa00 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69   the type of poi
1aa10 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f  nter to.** be mo
1aa20 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c  dified, as  foll
1aa30 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  ows:.**.** PTRMA
1aa40 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61  P_BTREE:     pPa
1aa50 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
1aa60 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
1aa70 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c  points at a chil
1aa80 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  d .**           
1aa90 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20          page of 
1aaa0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
1aab0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70  MAP_OVERFLOW1: p
1aac0 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
1aad0 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1aae0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f  r points at an o
1aaf0 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20  verflow.**      
1ab00 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
1ab10 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
1ab20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  one of the cells
1ab30 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   on pPage..**.**
1ab40 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1ab50 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f  2: pPage is an o
1ab60 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68  verflow-page. Th
1ab70 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1ab80 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   at the next.** 
1ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aba0 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20    overflow page 
1abb0 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  in the list..*/.
1abc0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66  static int modif
1abd0 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d  yPagePointer(Mem
1abe0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e  Page *pPage, Pgn
1abf0 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54  o iFrom, Pgno iT
1ac00 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20  o, u8 eType){.  
1ac10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1ac20 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
1ac30 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
1ac40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1ac50 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
1ac60 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
1ac70 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70  e) );.  if( eTyp
1ac80 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1ac90 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  OW2 ){.    /* Th
1aca0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77  e pointer is alw
1acb0 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ays the first 4 
1acc0 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67  bytes of the pag
1acd0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  e in this case. 
1ace0 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34   */.    if( get4
1acf0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
1ad00 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  a)!=iFrom ){.   
1ad10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ad20 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1ad30 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
1ad40 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
1ad50 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
1ad60 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67     u8 isInitOrig
1ad70 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
1ad80 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
1ad90 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20   int nCell;.    
1ada0 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72 63 20  int rc;..    rc 
1adb0 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
1adc0 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
1add0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1ade0 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67      nCell = pPag
1adf0 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66  e->nCell;..    f
1ae00 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
1ae10 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20   i++){.      u8 
1ae20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
1ae30 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
1ae40 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1ae50 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
1ae60 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  {.        CellIn
1ae70 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
1ae80 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
1ae90 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
1aea0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
1aeb0 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
1aec0 6c 6f 77 0a 20 20 20 20 20 20 20 20 20 26 26 20  low.         && 
1aed0 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72  pCell+info.iOver
1aee0 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61  flow+3<=pPage->a
1aef0 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
1af00 50 61 67 65 0a 20 20 20 20 20 20 20 20 20 26 26  Page.         &&
1af10 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65   iFrom==get4byte
1af20 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
1af30 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20  erflow]).       
1af40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1af50 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
1af60 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69  fo.iOverflow], i
1af70 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
1af80 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1af90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1afa0 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
1afb0 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20  e(pCell)==iFrom 
1afc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
1afd0 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f  4byte(pCell, iTo
1afe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
1aff0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1b000 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
1b010 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20     if( i==nCell 
1b020 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  ){.      if( eTy
1b030 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe!=PTRMAP_BTREE
1b040 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67   || .          g
1b050 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1b060 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1b070 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f  Offset+8])!=iFro
1b080 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m ){.        ret
1b090 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1b0a0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
1b0b0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1b0c0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1b0d0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1b0e0 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a  ], iTo);.    }..
1b0f0 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
1b100 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
1b110 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1b120 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
1b130 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20  * Move the open 
1b140 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
1b150 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f  bPage to locatio
1b160 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74  n iFreePage in t
1b170 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  he .** database.
1b180 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66   The pDbPage ref
1b190 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76  erence remains v
1b1a0 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alid..**.** The 
1b1b0 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e  isCommit flag in
1b1c0 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1b1d0 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
1b1e0 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a   remember that.*
1b1f0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  * the journal ne
1b200 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
1b210 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61  ed before databa
1b220 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d  se page pDbPage-
1b230 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65  >pgno .** can be
1b240 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65   written to. The
1b250 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
1b260 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74  ady promised not
1b270 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61   to write to tha
1b280 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  t.** page..*/.st
1b290 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74  atic int relocat
1b2a0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
1b2b0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
1b2c0 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20    /* Btree */.  
1b2d0 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65  MemPage *pDbPage
1b2e0 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ,        /* Open
1b2f0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f   page to move */
1b300 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
1b310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1b320 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65  ointer map 'type
1b330 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
1b340 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  age */.  Pgno iP
1b350 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  trPage,         
1b360 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
1b370 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79   'page-no' entry
1b380 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
1b390 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
1b3a0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
1b3b0 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f  e location to mo
1b3c0 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f  ve pDbPage to */
1b3d0 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1b3e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1b3f0 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73  sCommit flag pas
1b400 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61  sed to sqlite3Pa
1b410 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29  gerMovepage */.)
1b420 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74  {.  MemPage *pPt
1b430 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  rPage;   /* The 
1b440 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
1b450 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
1b460 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1b470 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50  o iDbPage = pDbP
1b480 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  age->pgno;.  Pag
1b490 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
1b4a0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1b4b0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  rc;..  assert( e
1b4c0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1b4d0 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d  RFLOW2 || eType=
1b4e0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1b4f0 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70  1 || .      eTyp
1b500 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1b510 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1b520 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61  _ROOTPAGE );.  a
1b530 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1b540 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1b550 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1b560 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d  t( pDbPage->pBt=
1b570 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  =pBt );..  /* Mo
1b580 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
1b590 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74  from its current
1b5a0 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
1b5b0 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
1b5c0 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
1b5d0 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
1b5e0 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
1b5f0 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
1b600 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
1b610 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
1b620 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
1b630 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
1b640 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1b650 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
1b660 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
1b670 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
1b680 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  sCommit);.  if( 
1b690 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b6a0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1b6b0 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70    }.  pDbPage->p
1b6c0 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b  gno = iFreePage;
1b6d0 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67  ..  /* If pDbPag
1b6e0 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61  e was a btree-pa
1b6f0 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  ge, then it may 
1b700 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73  have child pages
1b710 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20   and/or cells.  
1b720 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
1b730 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
1b740 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
1b750 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
1b760 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65   these.  ** page
1b770 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  s need to be cha
1b780 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nged..  **.  ** 
1b790 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e  If pDbPage is an
1b7a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
1b7b0 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34  then the first 4
1b7c0 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65   bytes may store
1b7d0 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20   a.  ** pointer 
1b7e0 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  to a subsequent 
1b7f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
1b800 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
1b810 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  se, then.  ** th
1b820 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65  e pointer map ne
1b830 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
1b840 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71  d for the subseq
1b850 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1b860 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
1b870 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
1b880 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
1b890 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1b8a0 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
1b8b0 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65  dPtrmaps(pDbPage
1b8c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1b8d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b8e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1b8f0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1b900 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20  Pgno nextOvfl = 
1b910 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65  get4byte(pDbPage
1b920 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
1b930 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b  ( nextOvfl!=0 ){
1b940 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1b950 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
1b960 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1b970 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63  , iFreePage, &rc
1b980 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b990 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b9a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b9b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b9c0 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65   }..  /* Fix the
1b9d0 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
1b9e0 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61  r on page iPtrPa
1b9f0 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20  ge that pointed 
1ba00 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20  at iDbPage so.  
1ba10 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
1ba20 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20  s at iFreePage. 
1ba30 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69  Also fix the poi
1ba40 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
1ba50 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65  or.  ** iPtrPage
1ba60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1ba70 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
1ba80 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
1ba90 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1baa0 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
1bab0 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  rPage, 0);.    i
1bac0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bad0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1bae0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
1baf0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1bb00 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  Write(pPtrPage->
1bb10 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1bb20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1bb30 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
1bb40 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1bb50 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1bb60 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1bb70 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
1bb80 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50  r(pPtrPage, iDbP
1bb90 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1bba0 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65  eType);.    rele
1bbb0 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
1bbc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1bbd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1bbe0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1bbf0 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
1bc00 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63  e, iPtrPage, &rc
1bc10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1bc20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1bc30 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
1bc40 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
1bc50 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
1bc60 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
1bc70 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1bc80 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65  e(BtShared *, Me
1bc90 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a  mPage **, Pgno *
1bca0 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a  , Pgno, u8);../*
1bcb0 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
1bcc0 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20  ngle step of an 
1bcd0 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
1bce0 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  um. If successfu
1bcf0 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  l, return.** SQL
1bd00 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65  ITE_OK. If there
1bd10 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64   is no work to d
1bd20 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  o (and therefore
1bd30 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a   no point in .**
1bd40 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
1bd50 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72  nction again), r
1bd60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
1bd70 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72  E. Or, if an err
1bd80 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72  or .** occurs, r
1bd90 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72  eturn some other
1bda0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
1bdb0 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
1bdc0 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
1bdd0 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
1bde0 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20  re-organize the 
1bdf0 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20  database so .** 
1be00 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
1be10 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  ge of the file c
1be20 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20  urrently in use 
1be30 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20  is no longer in 
1be40 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  use..**.** Param
1be50 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65  eter nFin is the
1be60 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1be70 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61 62   that this datab
1be80 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69  ase would contai
1be90 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66  n.** were this f
1bea0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75  unction called u
1beb0 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
1bec0 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
1bed0 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69  ** If the bCommi
1bee0 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  t parameter is n
1bef0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75  on-zero, this fu
1bf00 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
1bf10 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c  hat the .** call
1bf20 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c  er will keep cal
1bf30 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53  ling incrVacuumS
1bf40 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72  tep() until it r
1bf50 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1bf60 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72  NE .** or an err
1bf70 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70  or. bCommit is p
1bf80 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20 61  assed true for a
1bf90 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e  n auto-vacuum-on
1bfa0 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72  -commit .** oper
1bfb0 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20  ation, or false 
1bfc0 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  for an increment
1bfd0 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74  al vacuum..*/.st
1bfe0 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63  atic int incrVac
1bff0 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64  uumStep(BtShared
1c000 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e   *pBt, Pgno nFin
1c010 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20  , Pgno iLastPg, 
1c020 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20  int bCommit){.  
1c030 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20  Pgno nFreeList; 
1c040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1c050 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69  ber of pages sti
1c060 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ll on the free-l
1c070 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ist */.  int rc;
1c080 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1c090 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1c0a0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1c0b0 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e  assert( iLastPg>
1c0c0 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21  nFin );..  if( !
1c0d0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1c0e0 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69  t, iLastPg) && i
1c0f0 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f  LastPg!=PENDING_
1c100 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1c110 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  {.    u8 eType;.
1c120 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
1c130 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
1c140 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
1c150 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1c160 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
1c170 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  FreeList==0 ){. 
1c180 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1c190 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
1c1a0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1c1b0 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  et(pBt, iLastPg,
1c1c0 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
1c1d0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1c1e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c1f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c200 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79     }.    if( eTy
1c210 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
1c220 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74  AGE ){.      ret
1c230 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1c240 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
1c250 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1c260 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
1c270 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  {.      if( bCom
1c280 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
1c290 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
1c2a0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69  page from the fi
1c2b0 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  les free-list. T
1c2c0 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
1c2d0 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
1c2e0 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e  f bCommit is non
1c2f0 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
1c300 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
1c310 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
1c320 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
1c330 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
1c340 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1c350 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
1c360 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
1c370 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
1c380 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
1c390 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
1c3a0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1c3b0 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
1c3c0 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
1c3d0 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
1c3e0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
1c3f0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
1c400 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
1c410 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41  Pg, iLastPg, BTA
1c420 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20  LLOC_EXACT);.   
1c430 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1c440 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c450 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c470 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
1c480 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  ==iLastPg );.   
1c490 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1c4a0 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
1c4b0 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
1c4c0 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
1c4d0 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
1c4e0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65  /* Index of free
1c4f0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c   page to move pL
1c500 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20  astPg to */.    
1c510 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74    MemPage *pLast
1c520 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f  Pg;.      u8 eMo
1c530 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  de = BTALLOC_ANY
1c540 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61  ;   /* Mode para
1c550 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
1c560 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
1c570 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61  .      Pgno iNea
1c580 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
1c590 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d   /* nearby param
1c5a0 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74  eter for allocat
1c5b0 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a  eBtreePage() */.
1c5c0 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
1c5d0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
1c5e0 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c  astPg, &pLastPg,
1c5f0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1c600 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c610 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1c620 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
1c630 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20    /* If bCommit 
1c640 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f  is zero, this lo
1c650 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20  op runs exactly 
1c660 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c  once and page pL
1c670 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69  astPg.      ** i
1c680 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74  s swapped with t
1c690 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61  he first free pa
1c6a0 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68  ge pulled off th
1c6b0 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20  e free list..   
1c6c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
1c6d0 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
1c6e0 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  , if bCommit is 
1c6f0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
1c700 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
1c710 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
1c720 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
1c730 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
1c740 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
1c750 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
1c760 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
1c770 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
1c780 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1c790 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   ){.        eMod
1c7a0 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a  e = BTALLOC_LE;.
1c7b0 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20          iNear = 
1c7c0 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nFin;.      }.  
1c7d0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
1c7e0 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
1c7f0 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
1c800 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1c810 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
1c820 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72   &iFreePg, iNear
1c830 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20  , eMode);.      
1c840 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c850 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1c860 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
1c870 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  stPg);.         
1c880 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c890 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
1c8a0 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
1c8b0 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  g);.      }while
1c8c0 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72  ( bCommit && iFr
1c8d0 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20  eePg>nFin );.   
1c8e0 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
1c8f0 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  Pg<iLastPg );.  
1c900 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20      .      rc = 
1c910 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
1c920 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65  , pLastPg, eType
1c930 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65  , iPtrPage, iFre
1c940 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20  ePg, bCommit);. 
1c950 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1c960 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
1c970 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c980 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1c990 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1c9a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1c9b0 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1c9c0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69      do {.      i
1c9d0 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77  LastPg--;.    }w
1c9e0 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50  hile( iLastPg==P
1c9f0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1ca00 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f  (pBt) || PTRMAP_
1ca10 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
1ca20 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d  tPg) );.    pBt-
1ca30 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
1ca40 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
1ca50 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a   = iLastPg;.  }.
1ca60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ca70 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
1ca80 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
1ca90 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72   by the first ar
1caa0 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74  gument is an aut
1cab0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1cac0 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73  e.** nOrig pages
1cad0 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e   in size contain
1cae0 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20 70  ing nFree free p
1caf0 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65  ages. Return the
1cb00 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69   expected .** si
1cb10 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1cb20 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c  se in pages foll
1cb30 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61  owing an auto-va
1cb40 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  cuum operation..
1cb50 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66  */.static Pgno f
1cb60 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61  inalDbSize(BtSha
1cb70 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
1cb80 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65  Orig, Pgno nFree
1cb90 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b  ){.  int nEntry;
1cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbb0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1cbc0 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65  f entries on one
1cbd0 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a   ptrmap page */.
1cbe0 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20    Pgno nPtrmap; 
1cbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
1cc10 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62  trMap pages to b
1cc20 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e  e freed */.  Pgn
1cc30 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cc50 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
1cc60 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d  .  nEntry = pBt-
1cc70 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20  >usableSize/5;. 
1cc80 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
1cc90 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
1cca0 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
1ccb0 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79  )+nEntry)/nEntry
1ccc0 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67  ;.  nFin = nOrig
1ccd0 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d   - nFree - nPtrm
1cce0 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e  ap;.  if( nOrig>
1ccf0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1cd00 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50  E(pBt) && nFin<P
1cd10 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1cd20 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69  (pBt) ){.    nFi
1cd30 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  n--;.  }.  while
1cd40 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
1cd50 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46  pBt, nFin) || nF
1cd60 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  in==PENDING_BYTE
1cd70 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1cd80 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20    nFin--;.  }.. 
1cd90 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a   return nFin;.}.
1cda0 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
1cdb0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
1cdc0 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
1cdd0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
1cde0 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
1cdf0 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
1ce00 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
1ce10 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
1ce20 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
1ce30 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
1ce40 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
1ce50 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
1ce60 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
1ce70 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
1ce80 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
1ce90 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
1cea0 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
1ceb0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a  rror occurred,.*
1cec0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1ced0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1cee0 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  se an SQLite err
1cef0 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74  or code. .*/.int
1cf00 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
1cf10 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  rVacuum(Btree *p
1cf20 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1cf30 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1cf40 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
1cf50 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1cf60 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1cf70 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1cf80 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e  ANS_WRITE && p->
1cf90 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1cfa0 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70  RITE );.  if( !p
1cfb0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1cfc0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1cfd0 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  E_DONE;.  }else{
1cfe0 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20  .    Pgno nOrig 
1cff0 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
1d000 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20  (pBt);.    Pgno 
1d010 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
1d020 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1d030 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50  Data[36]);.    P
1d040 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c  gno nFin = final
1d050 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
1d060 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20  g, nFree);..    
1d070 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29  if( nOrig<nFin )
1d080 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1d090 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1d0a0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1d0b0 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
1d0c0 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
1d0d0 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1d0e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1d0f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d100 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
1d110 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
1d120 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  Bt);.        rc 
1d130 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
1d140 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69  (pBt, nFin, nOri
1d150 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  g, 0);.      }. 
1d160 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1d170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d180 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1d190 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
1d1a0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1d1b0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1d1c0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1d1d0 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
1d1e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
1d1f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d200 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1d210 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1d220 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1d230 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1d240 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1d250 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1d260 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
1d270 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
1d280 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
1d290 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  ** is committed 
1d2a0 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1d2b0 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  um database..**.
1d2c0 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
1d2d0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
1d2e0 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65  n *pnTrunc is se
1d2f0 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
1d300 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20  of pages.** the 
1d310 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
1d320 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
1d330 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  d to during the 
1d340 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20  commit process. 
1d350 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74  .** i.e. the dat
1d360 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72  abase has been r
1d370 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68  eorganized so th
1d380 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  at only the firs
1d390 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61  t *pnTrunc.** pa
1d3a0 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a  ges are in use..
1d3b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
1d3c0 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42  toVacuumCommit(B
1d3d0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
1d3e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1d3f0 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
1d400 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
1d410 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20  er;.  VVA_ONLY( 
1d420 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74  int nRef = sqlit
1d430 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
1d440 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73  pPager) );..  as
1d450 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1d460 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1d470 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69  tex) );.  invali
1d480 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
1d490 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73  ache(pBt);.  ass
1d4a0 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  ert(pBt->autoVac
1d4b0 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74  uum);.  if( !pBt
1d4c0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a  ->incrVacuum ){.
1d4d0 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20      Pgno nFin;  
1d4e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d4f0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
1d500 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f  abase after auto
1d510 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20  vacuuming */.   
1d520 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20   Pgno nFree;    
1d530 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d540 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1d550 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  eelist initially
1d560 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72   */.    Pgno iFr
1d570 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ee;        /* Th
1d580 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62  e next page to b
1d590 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50  e freed */.    P
1d5a0 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20  gno nOrig;      
1d5b0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69    /* Database si
1d5c0 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  ze before freein
1d5d0 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20  g */..    nOrig 
1d5e0 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
1d5f0 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50  (pBt);.    if( P
1d600 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1d610 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69  , nOrig) || nOri
1d620 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
1d630 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1d640 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20     /* It is not 
1d650 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61  possible to crea
1d660 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f  te a database fo
1d670 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61  r which the fina
1d680 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  l page.      ** 
1d690 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e  is either a poin
1d6a0 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20  ter-map page or 
1d6b0 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65  the pending-byte
1d6c0 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20   page. If one.  
1d6d0 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e      ** is encoun
1d6e0 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69  tered, this indi
1d6f0 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e  cates corruption
1d700 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1d710 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1d720 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1d730 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20   }..    nFree = 
1d740 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
1d750 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1d760 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69  );.    nFin = fi
1d770 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
1d780 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20  Orig, nFree);.  
1d790 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67    if( nFin>nOrig
1d7a0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1d7b0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1d7c0 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69     if( nFin<nOri
1d7d0 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  g ){.      rc = 
1d7e0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
1d7f0 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Bt, 0, 0);.    }
1d800 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e  .    for(iFree=n
1d810 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e  Orig; iFree>nFin
1d820 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1d830 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20  K; iFree--){.   
1d840 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
1d850 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
1d860 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20  , iFree, 1);.   
1d870 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d   }.    if( (rc==
1d880 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72  SQLITE_DONE || r
1d890 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
1d8a0 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
1d8b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1d8c0 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
1d8d0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1d8e0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1d8f0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1d900 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[32], 0);.    
1d910 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1d920 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1d930 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  6], 0);.      pu
1d940 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1d950 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
1d960 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74  nFin);.      pBt
1d970 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
1d980 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  1;.      pBt->nP
1d990 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  age = nFin;.    
1d9a0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
1d9b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d9c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1d9d0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
1d9e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
1d9f0 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65  rt( nRef>=sqlite
1da00 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1da10 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
1da20 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20  rn rc;.}..#else 
1da30 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /* ifndef SQLITE
1da40 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1da50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74   */.# define set
1da60 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20  ChildPtrmaps(x) 
1da70 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
1da80 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1da90 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
1daa0 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74  rst phase of a t
1dab0 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e  wo-phase commit.
1dac0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1dad0 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62  * causes a rollb
1dae0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  ack journal to b
1daf0 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74  e created (if it
1db00 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
1db10 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20  y exist).** and 
1db20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65  populated with e
1db30 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f  nough informatio
1db40 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70  n so that if a p
1db50 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73  ower loss occurs
1db60 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1db70 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
1db80 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
1db90 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e   state by playin
1dba0 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f  g back.** the jo
1dbb0 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65  urnal.  Then the
1dbc0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1dbd0 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75   journal are flu
1dbe0 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74  shed out to.** t
1dbf0 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20  he disk.  After 
1dc00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
1dc10 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20  afely on oxide, 
1dc20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  the changes to t
1dc30 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61  he.** database a
1dc40 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
1dc50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1dc60 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f  e and flushed to
1dc70 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68   oxide..** At th
1dc80 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61  e end of this ca
1dc90 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ll, the rollback
1dca0 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65   journal still e
1dcb0 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  xists on the.** 
1dcc0 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20  disk and we are 
1dcd0 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c  still holding al
1dce0 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20  l locks, so the 
1dcf0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1dd00 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  not.** committed
1dd10 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74  .  See sqlite3Bt
1dd20 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1dd30 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f  o() for the seco
1dd40 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a  nd phase of the.
1dd50 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  ** commit proces
1dd60 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  s..**.** This ca
1dd70 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ll is a no-op if
1dd80 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
1dd90 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74  ction is current
1dda0 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74  ly active on pBt
1ddb0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1ddc0 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  e, sync the data
1ddd0 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
1dde0 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61  e btree pBt. zMa
1ddf0 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  ster points to.*
1de00 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  * the name of a 
1de10 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1de20 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
1de30 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
1de40 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
1de50 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  l journal file, 
1de60 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69  or is NULL, indi
1de70 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72  cating no master
1de80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
1de90 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61  * (single databa
1dea0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
1deb0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
1dec0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1ded0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73  master journal s
1dee0 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61  hould already ha
1def0 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74  ve been.** creat
1df00 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69  ed, populated wi
1df10 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  th this journal 
1df20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63  pointer and sync
1df30 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
1df40 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72  * Once this is r
1df50 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72  outine has retur
1df60 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68  ned, the only th
1df70 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20  ing required to 
1df80 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72  commit.** the wr
1df90 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1dfa0 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
1dfb0 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c  e file is to del
1dfc0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
1dfd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1dfe0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
1dff0 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e  ne(Btree *p, con
1e000 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
1e010 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1e020 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
1e030 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1e040 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
1e050 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1e060 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
1e070 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1e080 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e090 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1e0a0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
1e0b0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
1e0c0 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43  rc = autoVacuumC
1e0d0 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20  ommit(pBt);.    
1e0e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e0f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
1e100 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1e110 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
1e120 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1e130 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
1e140 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29  t->bDoTruncate )
1e150 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1e160 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
1e170 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
1e180 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1e190 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  }.#endif.    rc 
1e1a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
1e1b0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
1e1c0 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  ->pPager, zMaste
1e1d0 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
1e1e0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1e1f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1e200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1e210 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1e220 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72  ed from both Btr
1e230 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1e240 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c  () and BtreeRoll
1e250 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65  back().** at the
1e260 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61   conclusion of a
1e270 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
1e280 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
1e290 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
1e2a0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
1e2b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1e2c0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  >pBt;.  sqlite3 
1e2d0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61  *db = p->db;.  a
1e2e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1e2f0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
1e300 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
1e310 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1e320 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72  UUM.  pBt->bDoTr
1e330 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64  uncate = 0;.#end
1e340 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  if.  if( p->inTr
1e350 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  ans>TRANS_NONE &
1e360 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e  & db->nVdbeRead>
1e370 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  1 ){.    /* If t
1e380 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61  here are other a
1e390 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
1e3a0 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
1e3b0 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20  this database.  
1e3c0 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77    ** handle, dow
1e3d0 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64  ngrade to a read
1e3e0 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
1e3f0 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61  n. The other sta
1e400 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d  tements.    ** m
1e410 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ay still be read
1e420 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ing from the dat
1e430 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64  abase.  */.    d
1e440 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
1e450 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
1e460 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72  (p);.    p->inTr
1e470 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ans = TRANS_READ
1e480 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1e490 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
1e4a0 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20  had any kind of 
1e4b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
1e4c0 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20  , decrement the 
1e4d0 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
1e4e0 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  ion count of the
1e4f0 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49   shared btree. I
1e500 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1e510 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20  n count .    ** 
1e520 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74  reaches 0, set t
1e530 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
1e540 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54  to TRANS_NONE. T
1e550 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  he unlockBtreeIf
1e560 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20  Unused().    ** 
1e570 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20  call below will 
1e580 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
1e590 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  .  */.    if( p-
1e5a0 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
1e5b0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c  NONE ){.      cl
1e5c0 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
1e5d0 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
1e5e0 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
1e5f0 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20  saction--;.     
1e600 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
1e610 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
1e620 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
1e630 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
1e640 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NONE;.      }.  
1e650 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
1e660 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
1e670 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f  saction state to
1e680 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20   TRANS_NONE and 
1e690 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20  unlock the .    
1e6a0 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73  ** pager if this
1e6b0 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
1e6c0 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
1e6d0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
1e6e0 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72    */.    p->inTr
1e6f0 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
1e700 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  ;.    unlockBtre
1e710 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1e720 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
1e730 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  grity(p);.}../*.
1e740 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72  ** Commit the tr
1e750 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e  ansaction curren
1e760 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  tly in progress.
1e770 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1e780 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ine implements t
1e790 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
1e7a0 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d  of a 2-phase com
1e7b0 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c  mit.  The.** sql
1e7c0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1e7d0 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e  haseOne() routin
1e7e0 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
1e7f0 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c   phase and shoul
1e800 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20  d.** be invoked 
1e810 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
1e820 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
1e830 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  The sqlite3Btree
1e840 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
1e850 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20  .** routine did 
1e860 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  all the work of 
1e870 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74  writing informat
1e880 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20  ion out to disk 
1e890 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65  and flushing the
1e8a0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20  .** contents so 
1e8b0 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72  that they are wr
1e8c0 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64  itten onto the d
1e8d0 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c  isk platter.  Al
1e8e0 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  l this.** routin
1e8f0 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64  e has to do is d
1e900 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74  elete or truncat
1e910 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65  e or zero the he
1e920 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74  ader in the.** t
1e930 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1e940 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65  nal (which cause
1e950 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
1e960 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64  n to commit) and
1e970 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a  .** drop locks..
1e980 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
1e990 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
1e9a0 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  rs while the pag
1e9b0 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74 65  er layer is atte
1e9c0 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69  mpting to .** fi
1e9d0 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72  nalize the under
1e9e0 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69  lying journal fi
1e9f0 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  le, this functio
1ea00 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  n returns an err
1ea10 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70  or and.** the up
1ea20 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61  per layer will a
1ea30 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
1ea40 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  k. However, if t
1ea50 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1ea60 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  nt.** is non-zer
1ea70 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72  o then this b-tr
1ea80 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ee transaction i
1ea90 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  s part of a mult
1eaa0 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73  i-file .** trans
1eab0 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
1eac0 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61  case, the transa
1ead0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
1eae0 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64  y been committed
1eaf0 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e   .** (by deletin
1eb00 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  g a master journ
1eb10 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65  al file) and the
1eb20 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e   caller will ign
1eb30 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  ore this .** fun
1eb40 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f  ctions return co
1eb50 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20  de. So, even if 
1eb60 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1eb70 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  in the pager lay
1eb80 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65  er,.** reset the
1eb90 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20   b-tree objects 
1eba0 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74  internal state t
1ebb0 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
1ebc0 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61  the write.** tra
1ebd0 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65  nsaction has bee
1ebe0 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69  n closed. This i
1ebf0 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 73  s quite safe, as
1ec00 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20   the pager will 
1ec10 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69  have.** transiti
1ec20 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f  oned to the erro
1ec30 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54  r state..**.** T
1ec40 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
1ec50 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
1ec60 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1ec70 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
1ec80 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
1ec90 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
1eca0 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
1ecb0 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
1ecc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1ecd0 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65  mitPhaseTwo(Btre
1ece0 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e  e *p, int bClean
1ecf0 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  up){..  if( p->i
1ed00 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
1ed10 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  NE ) return SQLI
1ed20 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33  TE_OK;.  sqlite3
1ed30 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1ed40 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1ed50 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
1ed60 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72   handle has a wr
1ed70 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1ed80 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65  open, commit the
1ed90 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a   shared-btrees .
1eda0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1edb0 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61   and set the sha
1edc0 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
1edd0 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20  NS_READ..  */.  
1ede0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1edf0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
1ee00 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42     int rc;.    B
1ee10 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1ee20 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
1ee30 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
1ee40 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
1ee50 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TE );.    assert
1ee60 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pBt->nTransact
1ee70 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  ion>0 );.    rc 
1ee80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
1ee90 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
1eea0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
1eeb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1eec0 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20   && bCleanup==0 
1eed0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1eee0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1eef0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ef00 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61      }.    p->iDa
1ef10 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a  taVersion--;  /*
1ef20 20 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20   Compensate for 
1ef30 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
1ef40 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70  sion++; */.    p
1ef50 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1ef60 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
1ef70 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61      btreeClearHa
1ef80 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
1ef90 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
1efa0 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
1efb0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1efc0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
1efd0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1efe0 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65  ** Do both phase
1eff0 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a  s of a commit..*
1f000 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1f010 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a  eeCommit(Btree *
1f020 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
1f030 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1f040 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r(p);.  rc = sql
1f050 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1f060 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20  haseOne(p, 0);. 
1f070 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f080 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1f090 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1f0a0 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b  tPhaseTwo(p, 0);
1f0b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
1f0c0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1f0d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f0e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f0f0 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74  sets the state t
1f100 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61  o CURSOR_FAULT a
1f110 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  nd the error.** 
1f120 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20  code to errCode 
1f130 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72  for every cursor
1f140 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64   on any BtShared
1f150 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
1f160 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20  references.  Or 
1f170 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  if the writeOnly
1f180 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
1f190 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20  1, then only.** 
1f1a0 74 72 69 70 20 77 72 69 74 65 20 63 75 72 73 6f  trip write curso
1f1b0 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61  rs and leave rea
1f1c0 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e  d cursors unchan
1f1d0 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ged..**.** Every
1f1e0 20 63 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e   cursor is a can
1f1f0 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 72 69  didate to be tri
1f200 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pped, including 
1f210 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20  cursors.** that 
1f220 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20  belong to other 
1f230 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1f240 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e  ions that happen
1f250 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e   to be.** sharin
1f260 67 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68  g the cache with
1f270 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54   pBtree..**.** T
1f280 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73  his routine gets
1f290 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
1f2a0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20  ollback occurs. 
1f2b0 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  If the writeOnly
1f2c0 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
1f2d0 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
1f2e0 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62  e-cursors need b
1f2f0 65 20 74 72 69 70 70 65 64 20 2d 20 72 65 61 64  e tripped - read
1f300 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73  -only.** cursors
1f310 20 73 61 76 65 20 74 68 65 69 72 20 63 75 72 72   save their curr
1f320 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f  ent positions so
1f330 20 74 68 61 74 20 74 68 65 79 20 6d 61 79 20 63   that they may c
1f340 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c  ontinue .** foll
1f350 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  owing the rollba
1f360 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65  ck. Or, if write
1f370 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61  Only is false, a
1f380 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a  ll cursors are .
1f390 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67  ** tripped. In g
1f3a0 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c  eneral, writeOnl
1f3b0 79 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  y is false if th
1f3c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
1f3d0 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  ing.** rolled ba
1f3e0 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20  ck modified the 
1f3f0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
1f400 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d   In this case b-
1f410 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67  tree root.** pag
1f420 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20  es may be moved 
1f430 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  or deleted from 
1f440 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 74  the database alt
1f450 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a  ogether, making.
1f460 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72  ** it unsafe for
1f470 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f   read cursors to
1f480 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a   continue..**.**
1f490 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   If the writeOnl
1f4a0 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 61  y flag is true a
1f4b0 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  nd an error is e
1f4c0 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65  ncountered while
1f4d0 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20   .** saving the 
1f4e0 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
1f4f0 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   of a read-only 
1f500 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73  cursor, all curs
1f510 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69  ors, .** includi
1f520 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73  ng all read-curs
1f530 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64 2e  ors are tripped.
1f540 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1f550 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1f560 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69  successful, or i
1f570 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1f580 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e  s while.** savin
1f590 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74  g a cursor posit
1f5a0 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ion, an SQLite e
1f5b0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e  rror code..*/.in
1f5c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  t sqlite3BtreeTr
1f5d0 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72  ipAllCursors(Btr
1f5e0 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20  ee *pBtree, int 
1f5f0 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69  errCode, int wri
1f600 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  teOnly){.  BtCur
1f610 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63  sor *p;.  int rc
1f620 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1f630 20 61 73 73 65 72 74 28 20 28 77 72 69 74 65 4f   assert( (writeO
1f640 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f  nly==0 || writeO
1f650 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f  nly==1) && BTCF_
1f660 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a  WriteFlag==1 );.
1f670 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
1f680 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1f690 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
1f6a0 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d     for(p=pBtree-
1f6b0 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
1f6c0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
1f6d0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1f6e0 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20    if( writeOnly 
1f6f0 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  && (p->curFlags 
1f700 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
1f710 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1f720 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
1f730 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
1f740 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1f750 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
1f760 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65         rc = save
1f770 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
1f780 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1f790 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f7a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76  {.            (v
1f7b0 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72 65 65  oid)sqlite3Btree
1f7c0 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
1f7d0 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20  Btree, rc, 0);. 
1f7e0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1f7f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1f800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1f810 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1f820 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
1f830 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20  rsor(p);.       
1f840 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
1f850 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20  SOR_FAULT;.     
1f860 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d     p->skipNext =
1f870 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20   errCode;.      
1f880 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
1f890 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b   i<=p->iPage; i+
1f8a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  +){.        rele
1f8b0 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67  asePage(p->apPag
1f8c0 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  e[i]);.        p
1f8d0 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
1f8e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f8f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1f900 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
1f910 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1f920 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
1f930 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f940 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
1f950 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20  .** If tripCode 
1f960 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
1f970 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69   then cursors wi
1f980 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ll be invalidate
1f990 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20  d (tripped)..** 
1f9a0 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f  Only write curso
1f9b0 72 73 20 61 72 65 20 74 72 69 70 70 65 64 20 69  rs are tripped i
1f9c0 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74  f writeOnly is t
1f9d0 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73  rue but all curs
1f9e0 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70  ors are.** tripp
1f9f0 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  ed if writeOnly 
1fa00 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61  is false.  Any a
1fa10 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a  ttempt to use.**
1fa20 20 61 20 74 72 69 70 70 65 64 20 63 75 72 73 6f   a tripped curso
1fa30 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  r will result in
1fa40 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
1fa50 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
1fa60 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
1fa70 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1fa80 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
1fa90 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
1faa0 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
1fab0 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
1fac0 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
1fad0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
1fae0 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
1faf0 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20  , int tripCode, 
1fb00 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a  int writeOnly){.
1fb10 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
1fb20 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1fb30 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
1fb40 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74  Page1;..  assert
1fb50 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c  ( writeOnly==1 |
1fb60 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29  | writeOnly==0 )
1fb70 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 69 70  ;.  assert( trip
1fb80 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f  Code==SQLITE_ABO
1fb90 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74  RT_ROLLBACK || t
1fba0 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  ripCode==SQLITE_
1fbb0 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  OK );.  sqlite3B
1fbc0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1fbd0 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51  if( tripCode==SQ
1fbe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1fbf0 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73  c = tripCode = s
1fc00 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
1fc10 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, 0, 0);.    if
1fc20 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79  ( rc ) writeOnly
1fc30 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1fc40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1fc50 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69  K;.  }.  if( tri
1fc60 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  pCode ){.    int
1fc70 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
1fc80 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
1fc90 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77  s(p, tripCode, w
1fca0 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61  riteOnly);.    a
1fcb0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
1fcc0 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e  E_OK || (writeOn
1fcd0 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51  ly==0 && rc2==SQ
1fce0 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20  LITE_OK) );.    
1fcf0 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
1fd00 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
1fd10 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72   }.  btreeIntegr
1fd20 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ity(p);..  if( p
1fd30 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1fd40 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
1fd50 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65  t rc2;..    asse
1fd60 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d  rt( TRANS_WRITE=
1fd70 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  =pBt->inTransact
1fd80 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d  ion );.    rc2 =
1fd90 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1fda0 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
1fdb0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  r);.    if( rc2!
1fdc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fdd0 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
1fde0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
1fdf0 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
1fe00 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20  e destroyed the 
1fe10 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61  pPage1->aData va
1fe20 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  lue.  So.    ** 
1fe30 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67  call btreeGetPag
1fe40 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
1fe50 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20  ain to make.    
1fe60 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e  ** sure pPage1->
1fe70 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72  aData is set cor
1fe80 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
1fe90 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28  f( btreeGetPage(
1fea0 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
1feb0 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
1fec0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
1fed0 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  e = get4byte(28+
1fee0 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
1fef0 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ta);.      testc
1ff00 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b  ase( nPage==0 );
1ff10 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65  .      if( nPage
1ff20 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67  ==0 ) sqlite3Pag
1ff30 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
1ff40 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
1ff50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ff60 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50  ( pBt->nPage!=nP
1ff70 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74  age );.      pBt
1ff80 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
1ff90 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1ffa0 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
1ffb0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f  }.    assert( co
1ffc0 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
1ffd0 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20  pBt, 1)==0 );.  
1ffe0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1fff0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
20000 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61  D;.    btreeClea
20010 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29  rHasContent(pBt)
20020 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
20030 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
20040 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
20050 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
20060 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
20070 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  tart a statement
20080 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
20090 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
200a0 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  ion can be rolle
200b0 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65  d.** back indepe
200c0 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d  ndently of the m
200d0 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ain transaction.
200e0 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20   You must start 
200f0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  a transaction .*
20100 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e  * before startin
20110 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69  g a subtransacti
20120 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
20130 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20  action is ended 
20140 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
20150 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72  * if the main tr
20160 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74  ansaction commit
20170 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e  s or rolls back.
20180 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74  .**.** Statement
20190 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73   subtransactions
201a0 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64   are used around
201b0 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20   individual SQL 
201c0 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68  statements.** th
201d0 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  at are contained
201e0 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e   within a BEGIN.
201f0 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20  ..COMMIT block. 
20200 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   If a constraint
20210 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
20220 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
20230 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63  ement, the effec
20240 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74  t of that one st
20250 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62  atement.** can b
20260 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69  e rolled back wi
20270 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
20280 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74  rollback the ent
20290 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ire transaction.
202a0 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65  .**.** A stateme
202b0 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69  nt sub-transacti
202c0 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
202d0 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75  d as an anonymou
202e0 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65  s savepoint. The
202f0 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64  .** value passed
20300 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
20310 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
20320 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
20330 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69  savepoints,.** i
20340 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77  ncluding the new
20350 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
20360 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68  oint, open on th
20370 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69  e B-Tree. i.e. i
20380 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
20390 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  o active savepoi
203a0 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  nts and no other
203b0 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
203c0 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a  actions open,.**
203d0 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31   iStatement is 1
203e0 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73  . This anonymous
203f0 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62   savepoint can b
20400 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f  e released or ro
20410 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69  lled back.** usi
20420 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  ng the sqlite3Bt
20430 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66  reeSavepoint() f
20440 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
20450 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
20460 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20  nStmt(Btree *p, 
20470 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b  int iStatement){
20480 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
20490 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
204a0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
204b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
204c0 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
204d0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
204e0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74  ;.  assert( (pBt
204f0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
20500 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29  _READ_ONLY)==0 )
20510 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
20520 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73  tement>0 );.  as
20530 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
20540 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69  >p->db->nSavepoi
20550 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nt );.  assert( 
20560 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
20570 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
20580 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70  );.  /* At the p
20590 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74  ager level, a st
205a0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
205b0 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69  ion is a savepoi
205c0 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20  nt with.  ** an 
205d0 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68  index greater th
205e0 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74  an all savepoint
205f0 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63  s created explic
20600 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20  itly using.  ** 
20610 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  SQL statements. 
20620 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
20630 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f   open, release o
20640 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20  r rollback any. 
20650 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69   ** such savepoi
20660 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73 74  nts while the st
20670 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
20680 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
20690 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20   active..  */.  
206a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
206b0 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70  rOpenSavepoint(p
206c0 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61  Bt->pPager, iSta
206d0 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74  tement);.  sqlit
206e0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
206f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20700 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ./*.** The secon
20710 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
20720 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c  is function, op,
20730 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50   is always SAVEP
20740 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a  OINT_ROLLBACK.**
20750 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   or SAVEPOINT_RE
20760 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63  LEASE. This func
20770 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65  tion either rele
20780 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  ases or rolls ba
20790 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f  ck the.** savepo
207a0 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62  int identified b
207b0 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76  y parameter iSav
207c0 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e  epoint, dependin
207d0 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a  g on the value .
207e0 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20  ** of op..**.** 
207f0 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70  Normally, iSavep
20800 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  oint is greater 
20810 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
20820 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20   zero. However, 
20830 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45  if op is.** SAVE
20840 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
20850 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20  then iSavepoint 
20860 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20  may also be -1. 
20870 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
20880 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
20890 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
208a0 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c  saction are roll
208b0 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73  ed back. This is
208c0 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72   different.** fr
208d0 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e  om a normal tran
208e0 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
208f0 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72  , as no locks ar
20900 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74  e released and t
20910 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  he.** transactio
20920 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a  n remains open..
20930 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
20940 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72  reeSavepoint(Btr
20950 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  ee *p, int op, i
20960 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a  nt iSavepoint){.
20970 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20980 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26  E_OK;.  if( p &&
20990 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
209a0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
209b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
209c0 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
209d0 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
209e0 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d  T_RELEASE || op=
209f0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
20a00 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ACK );.    asser
20a10 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30  t( iSavepoint>=0
20a20 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d   || (iSavepoint=
20a30 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50  =-1 && op==SAVEP
20a40 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29  OINT_ROLLBACK) )
20a50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
20a60 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
20a70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20a80 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  rSavepoint(pBt->
20a90 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76  pPager, op, iSav
20aa0 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28  epoint);.    if(
20ab0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20ac0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61 76  {.      if( iSav
20ad0 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74  epoint<0 && (pBt
20ae0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
20af0 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
20b00 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
20b10 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  pBt->nPage = 0;.
20b20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
20b30 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
20b40 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  Bt);.      pBt->
20b50 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
20b60 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65  (28 + pBt->pPage
20b70 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20  1->aData);..    
20b80 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
20b90 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 74 74  e size was writt
20ba0 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73  en into the offs
20bb0 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 65 61  et 28 of the hea
20bc0 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  der.      ** whe
20bd0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
20be0 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65  n started, so we
20bf0 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76   know that the v
20c00 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20  alue at offset. 
20c10 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f       ** 28 is no
20c20 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20  nzero. */.      
20c30 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
20c40 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  ge>0 );.    }.  
20c50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
20c60 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
20c70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20c80 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
20c90 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
20ca0 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
20cb0 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
20cc0 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65   iTable. If a re
20cd0 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69  ad-only cursor i
20ce0 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
20cf0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
20d00 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c  ** the caller al
20d10 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61  ready has at lea
20d20 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  st a read-only t
20d30 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a  ransaction open.
20d40 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
20d50 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61  se already. If a
20d60 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
20d70 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e   requested, then
20d80 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
20d90 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76  s assumed to hav
20da0 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  e an open write 
20db0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
20dc0 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c  ** If wrFlag==0,
20dd0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
20de0 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65   can only be use
20df0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a  d for reading..*
20e00 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20  * If wrFlag==1, 
20e10 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
20e20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
20e30 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a  reading or for.*
20e40 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68  * writing if oth
20e50 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f  er conditions fo
20e60 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c  r writing are al
20e70 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a  so met.  These.*
20e80 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74  * are the condit
20e90 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62  ions that must b
20ea0 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66  e met in order f
20eb0 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a  or writing to.**
20ec0 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a   be allowed:.**.
20ed0 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f  ** 1:  The curso
20ee0 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  r must have been
20ef0 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
20f00 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20  lag==1.**.** 2: 
20f10 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
20f20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
20f30 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
20f40 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
20f50 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
20f60 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
20f70 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
20f80 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
20f90 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
20fa0 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
20fb0 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
20fc0 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
20fd0 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
20fe0 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
20ff0 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
21000 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
21010 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
21020 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
21030 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
21040 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
21050 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
21060 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
21070 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
21080 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
21090 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
210a0 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
210b0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
210c0 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73  * No checking is
210d0 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75   done to make su
210e0 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61  re that page iTa
210f0 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
21100 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f  e.** root page o
21110 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20  f a b-tree.  If 
21120 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  it is not, then 
21130 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69  the cursor acqui
21140 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  red.** will not 
21150 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a  work correctly..
21160 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  **.** It is assu
21170 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c  med that the sql
21180 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
21190 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63  ero() has been c
211a0 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72  alled.** on pCur
211b0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
211c0 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  he memory space 
211d0 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e  prior to invokin
211e0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
211f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
21200 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
21210 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
21220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21230 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
21240 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
21250 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21270 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
21280 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
21290 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
212a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212b0 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
212c0 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
212d0 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
212e0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21300 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f   First arg to co
21310 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
21320 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  n */.  BtCursor 
21330 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
21340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21350 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63   Space for new c
21360 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74  ursor */.){.  Bt
21370 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
21380 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
21390 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62       /* Shared b
213a0 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  -tree handle */.
213b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
213c0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
213d0 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
213e0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77  ( wrFlag==0 || w
213f0 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f  rFlag==1 );..  /
21400 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
21410 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
21420 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66  s verify that if
21430 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72 61   this is a shara
21440 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65  ble .  ** b-tree
21450 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
21460 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
21470 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65  ding the require
21480 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a  d table locks, .
21490 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f    ** and that no
214a0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
214b0 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63  n has any open c
214c0 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c  ursor that confl
214d0 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20  icts with .  ** 
214e0 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20  this lock.  */. 
214f0 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
21500 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
21510 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79  (p, iTable, pKey
21520 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b  Info!=0, wrFlag+
21530 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  1) );.  assert( 
21540 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61  wrFlag==0 || !ha
21550 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
21560 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20  , iTable) );..  
21570 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
21580 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70  he caller has op
21590 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65  ened the require
215a0 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a  d transaction. *
215b0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  /.  assert( p->i
215c0 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
215d0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  E );.  assert( w
215e0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69  rFlag==0 || p->i
215f0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
21600 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
21610 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20   pBt->pPage1 && 
21620 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
21630 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56  ta );..  if( NEV
21640 45 52 28 77 72 46 6c 61 67 20 26 26 20 28 70 42  ER(wrFlag && (pB
21650 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
21660 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 29  S_READ_ONLY)!=0)
21670 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
21680 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
21690 20 20 7d 0a 20 20 69 66 28 20 77 72 46 6c 61 67    }.  if( wrFlag
216a0 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65   ){.    allocate
216b0 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
216c0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d      if( pBt->pTm
216d0 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
216e0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
216f0 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
21700 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67  e==1 && btreePag
21710 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
21720 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 72  {.    assert( wr
21730 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Flag==0 );.    i
21740 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Table = 0;.  }..
21750 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
21760 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
21770 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
21780 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
21790 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
217a0 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
217b0 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
217c0 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
217d0 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
217e0 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
217f0 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
21800 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
21810 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
21820 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
21830 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
21840 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
21850 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
21860 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42  ==0 || wrFlag==B
21870 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20 29 3b  TCF_WriteFlag );
21880 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
21890 73 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43  s = wrFlag;.  pC
218a0 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ur->pNext = pBt-
218b0 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20  >pCursor;.  if( 
218c0 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  pCur->pNext ){. 
218d0 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e     pCur->pNext->
218e0 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20  pPrev = pCur;.  
218f0 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  }.  pBt->pCursor
21900 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d   = pCur;.  pCur-
21910 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
21920 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75  _INVALID;.  retu
21930 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
21940 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
21950 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
21960 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
21970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21980 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
21990 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
219a0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
219b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219c0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
219d0 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
219e0 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
219f0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
21a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a10 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
21a20 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
21a30 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
21a40 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
21a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21a60 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
21a70 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
21a80 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
21ab0 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
21ac0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
21ad0 72 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65  rc;.  if( iTable
21ae0 3c 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  <1 ){.    rc = S
21af0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
21b00 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
21b10 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
21b20 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  er(p);.    rc = 
21b30 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69  btreeCursor(p, i
21b40 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70  Table, wrFlag, p
21b50 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a  KeyInfo, pCur);.
21b60 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
21b70 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
21b80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21b90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
21ba0 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f  ize of a BtCurso
21bb0 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65  r object in byte
21bc0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  s..**.** This in
21bd0 74 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64  terfaces is need
21be0 65 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73  ed so that users
21bf0 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20   of cursors can 
21c00 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73  preallocate.** s
21c10 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67  ufficient storag
21c20 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73  e to hold a curs
21c30 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f  or.  The BtCurso
21c40 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71  r object is opaq
21c50 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73  ue.** to users s
21c60 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f  o they cannot do
21c70 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68   the sizeof() th
21c80 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20  emselves - they 
21c90 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69  must call.** thi
21ca0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e  s routine..*/.in
21cb0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
21cc0 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a  rsorSize(void){.
21cd0 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28    return ROUND8(
21ce0 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29  sizeof(BtCursor)
21cf0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
21d00 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68  ialize memory th
21d10 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  at will be conve
21d20 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75  rted into a BtCu
21d30 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  rsor object..**.
21d40 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70  ** The simple ap
21d50 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c  proach here woul
21d60 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29  d be to memset()
21d70 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65   the entire obje
21d80 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20  ct.** to zero.  
21d90 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74  But it turns out
21da0 20 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65   that the apPage
21db0 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61  [] and aiIdx[] a
21dc0 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  rrays.** do not 
21dd0 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65  need to be zeroe
21de0 64 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c  d and they are l
21df0 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20  arge, so we can 
21e00 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66  save a lot.** of
21e10 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69   run-time by ski
21e20 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
21e30 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73  lization of thos
21e40 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76  e elements..*/.v
21e50 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
21e60 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72  CursorZero(BtCur
21e70 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65  sor *p){.  memse
21e80 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66  t(p, 0, offsetof
21e90 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65  (BtCursor, iPage
21ea0 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ));.}../*.** Clo
21eb0 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
21ec0 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
21ed0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21ee0 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
21ef0 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
21f00 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
21f10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
21f20 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
21f30 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
21f40 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
21f50 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
21f60 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
21f70 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
21f80 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
21f90 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  Cur->pBt;.    sq
21fa0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
21fb0 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c  pBtree);.    sql
21fc0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
21fd0 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20  rsor(pCur);.    
21fe0 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20  if( pCur->pPrev 
21ff0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ){.      pCur->p
22000 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43  Prev->pNext = pC
22010 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ur->pNext;.    }
22020 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d  else{.      pBt-
22030 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d  >pCursor = pCur-
22040 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
22050 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78    if( pCur->pNex
22060 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
22070 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
22080 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20  pCur->pPrev;.   
22090 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
220a0 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
220b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
220c0 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
220d0 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Page[i]);.    }.
220e0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
220f0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
22100 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
22110 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b  Cur->aOverflow);
22120 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
22130 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20  free(pCur); */. 
22140 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
22150 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
22160 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
22170 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
22180 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
22190 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
221a0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
221b0 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
221c0 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
221d0 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
221e0 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
221f0 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50  , call.** btreeP
22200 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69  arseCell() to fi
22210 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ll it in..**.** 
22220 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73  BtCursor.info is
22230 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20   a cache of the 
22240 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
22250 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e  he current cell.
22260 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63  .** Using this c
22270 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65  ache reduces the
22280 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73   number of calls
22290 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
222a0 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ll()..*/.#ifndef
222b0 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63   NDEBUG.  static
222c0 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
222d0 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
222e0 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
222f0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  fo info;.    int
22300 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
22310 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Page;.    memset
22320 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
22330 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74  f(info));.    bt
22340 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
22350 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
22360 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  , pCur->aiIdx[iP
22370 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  age], &info);.  
22380 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
22390 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26  T_DB || memcmp(&
223a0 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66  info, &pCur->inf
223b0 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  o, sizeof(info))
223c0 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  ==0 );.  }.#else
223d0 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72  .  #define asser
223e0 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e  tCellInfo(x).#en
223f0 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c 49 54  dif.static SQLIT
22400 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
22410 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  getCellInfo(BtCu
22420 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
22430 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
22440 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ize==0 ){.    in
22450 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
22460 69 50 61 67 65 3b 0a 20 20 20 20 70 43 75 72 2d  iPage;.    pCur-
22470 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
22480 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
22490 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
224a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
224b0 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
224c0 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
224d0 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fo);.  }else{.  
224e0 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
224f0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  (pCur);.  }.}..#
22500 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f  ifndef NDEBUG  /
22510 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69  * The next routi
22520 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  ne used only wit
22530 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
22540 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a  tements */./*.**
22550 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
22560 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73  the given BtCurs
22570 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20  or is valid.  A 
22580 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20  valid cursor is 
22590 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63  one.** that is c
225a0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
225b0 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20  g to a row in a 
225c0 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c  (non-empty) tabl
225d0 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  e..** This is a 
225e0 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75  verification rou
225f0 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  tine is used onl
22600 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
22610 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
22620 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
22630 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42  eCursorIsValid(B
22640 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
22650 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26    return pCur &&
22660 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
22670 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23  URSOR_VALID;.}.#
22680 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20  endif /* NDEBUG 
22690 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  */../*.** Set *p
226a0 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
226b0 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
226c0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
226d0 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
226e0 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
226f0 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
22700 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
22710 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
22720 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
22730 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
22740 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
22750 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
22760 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
22770 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
22780 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
22790 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
227a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
227b0 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  s in the key..**
227c0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
227d0 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65  ust position the
227e0 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f   cursor prior to
227f0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
22800 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54  outine..** .** T
22810 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
22820 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77  ot fail.  It alw
22830 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
22840 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20  TE_OK.  .*/.int 
22850 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
22860 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
22870 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  ur, i64 *pSize){
22880 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
22890 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
228a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
228b0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
228c0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67  SOR_VALID );.  g
228d0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
228e0 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75  ;.  *pSize = pCu
228f0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
22900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a  ;.}../*.** Set *
22920 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d  pSize to the num
22930 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
22940 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72  data in the entr
22950 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  y the.** cursor 
22960 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
22970 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   to..**.** The c
22980 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61  aller must guara
22990 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75  ntee that the cu
229a0 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
229b0 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a   to a non-NULL.*
229c0 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20  * valid entry.  
229d0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
229e0 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
229f0 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61  edure must guara
22a00 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  ntee.** that the
22a10 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73   cursor has Curs
22a20 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  or.eState==CURSO
22a30 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46  R_VALID..**.** F
22a40 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
22a50 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75  ssible.  This fu
22a60 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65  nction always re
22a70 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
22a80 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73  .** It might jus
22a90 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70  t as well be a p
22aa0 72 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e  rocedure (return
22ab0 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65  ing void) but we
22ac0 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20   continue.** to 
22ad0 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  return an intege
22ae0 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  r result code fo
22af0 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61  r historical rea
22b00 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sons..*/.int sql
22b10 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
22b20 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
22b30 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
22b40 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
22b50 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
22b60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
22b70 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
22b80 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
22b90 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
22ba0 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
22bb0 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
22bc0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
22bd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
22be0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22bf0 69 50 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65  iPage]->intKeyLe
22c00 61 66 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43 65  af==1 );.  getCe
22c10 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
22c20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
22c30 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  nfo.nPayload;.  
22c40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22c50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
22c60 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
22c70 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
22c80 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
22c90 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
22ca0 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
22cb0 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
22cc0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
22cd0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
22ce0 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
22cf0 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
22d00 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
22d10 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
22d20 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
22d30 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
22d40 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
22d50 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
22d60 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
22d70 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
22d80 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
22d90 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
22da0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
22db0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
22dc0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75  *.** The page nu
22dd0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
22de0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
22df0 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
22e00 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  t is .** written
22e10 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20   to *pPgnoNext. 
22e20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20  If page ovfl is 
22e30 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
22e40 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20   its linked .** 
22e50 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74  list, *pPgnoNext
22e60 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
22e70 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67   .**.** If ppPag
22e80 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61  e is not NULL, a
22e90 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  nd a reference t
22ea0 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
22eb0 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69  ject correspondi
22ec0 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75  ng.** to page nu
22ed0 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f  mber pOvfl was o
22ee0 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70  btained, then *p
22ef0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
22f00 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a  point to that.**
22f10 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69   reference. It i
22f20 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
22f30 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
22f40 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61  er to call relea
22f50 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a  sePage().** on *
22f60 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74  ppPage to free t
22f70 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e  he reference. In
22f80 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
22f90 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61  s obtained (beca
22fa0 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  use.** the point
22fb0 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20  er-map was used 
22fc0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61  to obtain the va
22fd0 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65  lue for *pPgnoNe
22fe0 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70  xt), then.** *pp
22ff0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a  Page is set to z
23000 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
23010 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  nt getOverflowPa
23020 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
23030 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
23040 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
23050 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
23060 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20  o ovfl,         
23070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
23080 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  rent overflow pa
23090 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d  ge number */.  M
230a0 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
230b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
230c0 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
230d0 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
230e0 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
230f0 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
23100 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
23110 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
23120 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
23130 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
23140 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
23150 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
23160 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
23170 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
23180 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
23190 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
231a0 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
231b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
231c0 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
231d0 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
231e0 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
231f0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
23200 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
23210 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
23220 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
23230 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
23240 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
23250 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
23260 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
23270 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
23280 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
23290 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
232a0 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
232b0 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
232c0 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
232d0 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
232e0 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
232f0 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
23300 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
23310 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
23320 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
23330 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
23340 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
23350 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
23360 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
23370 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
23380 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
23390 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
233a0 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
233b0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
233c0 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63  uess<=btreePagec
233d0 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
233e0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
233f0 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
23400 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
23410 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
23420 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
23430 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
23440 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
23450 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
23460 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
23470 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
23480 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
23490 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
234a0 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20  assert( next==0 
234b0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  || rc==SQLITE_DO
234c0 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  NE );.  if( rc==
234d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
234e0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
234f0 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70  ge(pBt, ovfl, &p
23500 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30  Page, (ppPage==0
23510 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  ) ? PAGER_GET_RE
23520 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20  ADONLY : 0);.   
23530 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
23540 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
23550 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  =0 );.    if( rc
23560 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23570 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34       next = get4
23580 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
23590 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  a);.    }.  }.. 
235a0 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65   *pPgnoNext = ne
235b0 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65  xt;.  if( ppPage
235c0 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
235d0 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  = pPage;.  }else
235e0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
235f0 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
23600 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
23610 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45  TE_DONE ? SQLITE
23620 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  _OK : rc);.}../*
23630 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
23640 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
23650 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
23660 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
23670 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
23680 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
23690 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
236a0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
236b0 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
236c0 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
236d0 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
236e0 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
236f0 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
23700 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
23710 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
23720 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
23730 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
23740 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
23750 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
23760 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
23770 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
23780 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
23790 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
237a0 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
237b0 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
237c0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
237d0 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
237e0 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
237f0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
23800 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
23810 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
23820 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
23830 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
23840 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
23850 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
23860 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
23870 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
23880 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
23890 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
238a0 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
238b0 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
238c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238d0 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
238e0 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
238f0 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
23900 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
23910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
23920 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
23930 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
23940 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
23950 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
23960 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
23970 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
23980 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
23990 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
239a0 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
239b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
239c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
239d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
239e0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
239f0 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
23a00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
23a10 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
23a20 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
23a30 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
23a40 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
23a50 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
23a60 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
23a70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23a80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
23a90 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
23aa0 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
23ab0 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
23ac0 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
23ad0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
23ae0 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
23af0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54  s pointing to. T
23b00 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65  he eOp.** argume
23b10 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  nt is interprete
23b20 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
23b30 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65  .**   0: The ope
23b40 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64  ration is a read
23b50 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
23b60 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
23b70 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61  *   1: The opera
23b80 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e  tion is a write.
23b90 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
23ba0 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
23bb0 20 20 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74     2: The operat
23bc0 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44  ion is a read. D
23bd0 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74  o not populate t
23be0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
23bf0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  e..**.** A total
23c00 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
23c10 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
23c20 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
23c30 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
23c40 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
23c50 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
23c60 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
23c70 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
23c80 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
23c90 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
23ca0 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
23cb0 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
23cc0 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
23cd0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
23ce0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
23cf0 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72  rent cursor entr
23d00 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
23d10 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
23d20 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70  s and the.** eOp
23d30 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
23d40 20 32 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f   2, this functio
23d50 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73  n may allocate s
23d60 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a  pace for and laz
23d70 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65  ily .** populate
23d80 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  s the overflow p
23d90 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61  age-list cache a
23da0 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61  rray (BtCursor.a
23db0 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53  Overflow). .** S
23dc0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
23dd0 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74  use this cache t
23de0 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
23df0 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
23e00 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65  ffset .** more e
23e10 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
23e20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
23e30 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
23e40 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
23e50 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a  ted, it may be.*
23e60 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
23e70 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
23e80 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
23e90 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
23ea0 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
23eb0 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
23ec0 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
23ed0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
23ee0 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
23ef0 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
23f00 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
23f10 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
23f20 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
23f30 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
23f40 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
23f50 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
23f60 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
23f70 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
23f80 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
23f90 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
23fa0 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
23fb0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
23fc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
23fd0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
23fe0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
23ff0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
24000 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
24010 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
24020 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20  .  u32 offset,  
24030 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
24040 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
24050 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
24060 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
24070 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
24080 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
24090 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
240a0 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
240b0 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
240c0 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
240d0 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  / .  int eOp    
240e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
240f0 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
24100 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
24110 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
24120 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
24130 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24140 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  _OK;.  int iIdx 
24150 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
24160 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
24170 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
24180 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
24190 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
241a0 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
241b0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
241c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
241d0 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
241e0 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
241f0 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  to */.#ifdef SQL
24200 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
24210 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67  LOW_READ.  unsig
24220 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  ned char * const
24230 20 70 42 75 66 53 74 61 72 74 20 3d 20 70 42 75   pBufStart = pBu
24240 66 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20  f;.  int bEnd;  
24250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24270 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e  * True if readin
24280 67 20 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61  g to end of data
24290 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
242a0 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
242b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
242c0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
242d0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
242e0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
242f0 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
24300 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
24310 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
24320 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
24330 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c  assert( eOp!=2 |
24340 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  | offset==0 );  
24350 20 20 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72    /* Always star
24360 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67  t from beginning
24370 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a   for eOp==2 */..
24380 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
24390 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
243a0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  = pCur->info.pPa
243b0 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20 53 51  yload;.#ifdef SQ
243c0 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
243d0 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64  FLOW_READ.  bEnd
243e0 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70   = offset+amt==p
243f0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
24400 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  ad;.#endif.  ass
24410 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20  ert( offset+amt 
24420 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  <= pCur->info.nP
24430 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 69 66 28  ayload );..  if(
24440 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d   &aPayload[pCur-
24450 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20  >info.nLocal] > 
24460 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
24470 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29  t->usableSize] )
24480 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20  {.    /* Trying 
24490 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
244a0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
244b0 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20   the data is an 
244c0 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74  error */.    ret
244d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
244e0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
244f0 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61  /* Check if data
24500 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72   must be read/wr
24510 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68  itten to/from th
24520 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73  e btree page its
24530 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66  elf. */.  if( of
24540 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset<pCur->info.
24550 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  nLocal ){.    in
24560 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69  t a = amt;.    i
24570 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72  f( a+offset>pCur
24580 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
24590 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d  .      a = pCur-
245a0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f  >info.nLocal - o
245b0 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ffset;.    }.   
245c0 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
245d0 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
245e0 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65  et], pBuf, a, (e
245f0 4f 70 20 26 20 30 78 30 31 29 2c 20 70 50 61 67  Op & 0x01), pPag
24600 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
24610 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
24620 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
24630 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
24640 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
24650 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
24660 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20  al;.  }...  if( 
24670 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
24680 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f   amt>0 ){.    co
24690 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65  nst u32 ovflSize
246a0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
246b0 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65  ze - 4;  /* Byte
246c0 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76  s content per ov
246d0 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50  fl page */.    P
246e0 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20  gno nextPage;.. 
246f0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
24700 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64  t4byte(&aPayload
24710 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
24720 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  al]);..    /* If
24730 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f   the BtCursor.aO
24740 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f  verflow[] has no
24750 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
24760 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
24770 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74  w..    ** Except
24780 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74  , do not allocat
24790 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f  e aOverflow[] fo
247a0 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a  r eOp==2..    **
247b0 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65  .    ** The aOve
247c0 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73  rflow[] array is
247d0 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e   sized at one en
247e0 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
247f0 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a  rflow page.    *
24800 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  * in the overflo
24810 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
24820 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
24830 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
24840 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74  age is.    ** st
24850 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
24860 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c  w[0], etc. A val
24870 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
24880 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
24890 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e  .    ** means "n
248a0 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74  ot yet known" (t
248b0 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
248c0 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
248d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f     */.    if( eO
248e0 70 21 3d 32 20 26 26 20 28 70 43 75 72 2d 3e 63  p!=2 && (pCur->c
248f0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
24900 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a  alidOvfl)==0 ){.
24910 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20        int nOvfl 
24920 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  = (pCur->info.nP
24930 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66  ayload-pCur->inf
24940 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a  o.nLocal+ovflSiz
24950 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20  e-1)/ovflSize;. 
24960 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70       if( nOvfl>p
24970 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20  Cur->nOvflAlloc 
24980 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
24990 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73  *aNew = (Pgno*)s
249a0 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20  qlite3Realloc(. 
249b0 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
249c0 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66  >aOverflow, nOvf
249d0 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29  l*2*sizeof(Pgno)
249e0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
249f0 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
24a00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
24a10 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
24a20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
24a30 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e           pCur->n
24a40 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66  OvflAlloc = nOvf
24a50 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70  l*2;.          p
24a60 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
24a70 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   aNew;.        }
24a80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
24a90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   ){.        mems
24ab0 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  et(pCur->aOverfl
24ac0 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a  ow, 0, nOvfl*siz
24ad0 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20  eof(Pgno));.    
24ae0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
24af0 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
24b00 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Ovfl;.      }.  
24b10 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
24b20 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
24b30 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
24b40 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
24b50 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
24b60 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
24b70 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
24b80 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
24b90 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
24ba0 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
24bb0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
24bc0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
24bd0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21  BTCF_ValidOvfl)!
24be0 3d 30 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d  =0.     && pCur-
24bf0 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
24c00 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20 20  t/ovflSize].    
24c10 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  ){.      iIdx = 
24c20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  (offset/ovflSize
24c30 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67  );.      nextPag
24c40 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
24c50 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
24c60 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65   offset = (offse
24c70 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t%ovflSize);.   
24c80 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72   }..    for( ; r
24c90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
24ca0 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67  amt>0 && nextPag
24cb0 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20 20  e; iIdx++){..   
24cc0 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
24cd0 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
24ce0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
24cf0 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  st cache. */.   
24d00 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
24d10 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
24d20 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a 20  lidOvfl)!=0 ){. 
24d30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70         assert(!p
24d40 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
24d50 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f  Idx] || pCur->aO
24d60 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e  verflow[iIdx]==n
24d70 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
24d80 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
24d90 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61  w[iIdx] = nextPa
24da0 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ge;.      }..   
24db0 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f     if( offset>=o
24dc0 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
24dd0 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72     /* The only r
24de0 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68  eason to read th
24df0 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62  is page is to ob
24e00 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20  tain the page.  
24e10 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
24e20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67  for the next pag
24e30 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
24e40 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
24e50 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
24e60 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  a is not require
24e70 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20  d. So first try 
24e80 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76  to lookup the ov
24e90 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a  erflow.        *
24ea0 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  * page-list cach
24eb0 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20  e, if any, then 
24ec0 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
24ed0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
24ee0 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  ().        ** fu
24ef0 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  nction..        
24f00 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f  **.        ** No
24f10 74 65 20 74 68 61 74 20 74 68 65 20 61 4f 76 65  te that the aOve
24f20 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 75  rflow[] array mu
24f30 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  st be allocated 
24f40 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32 0a 20  because eOp!=2. 
24f50 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65 2e 20         ** here. 
24f60 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68 65 6e   If eOp==2, then
24f70 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64 20 74   offset==0 and t
24f80 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 6e 65  his branch is ne
24f90 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20 20 20  ver taken..     
24fa0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
24fb0 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29 3b 0a  sert( eOp!=2 );.
24fc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
24fd0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
24fe0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20   BTCF_ValidOvfl 
24ff0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
25000 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  t( pCur->pBtree-
25010 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a  >db==pBt->db );.
25020 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
25030 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
25040 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1] ){.         
25050 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
25060 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
25070 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  +1];.        }el
25080 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
25090 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
250a0 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65  ge(pBt, nextPage
250b0 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b  , 0, &nextPage);
250c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
250d0 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66     offset -= ovf
250e0 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c  lSize;.      }el
250f0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  se{.        /* N
25100 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73  eed to read this
25110 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20   page properly. 
25120 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  It contains some
25130 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
25140 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61  ** range of data
25150 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72   that is being r
25160 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20  ead (eOp==0) or 
25170 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29  written (eOp!=0)
25180 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
25190 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
251a0 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
251b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
251c0 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66  file *fd;.#endif
251d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
251e0 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66   amt;.        if
251f0 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
25200 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
25210 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
25220 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
25230 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
25240 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
25250 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
25260 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20    /* If all the 
25270 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
25280 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ue:.        **. 
25290 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74         **   1) t
252a0 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70  his is a read op
252b0 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20  eration, and .  
252c0 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61        **   2) da
252d0 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ta is required f
252e0 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
252f0 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70   this overflow p
25300 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  age, and.       
25310 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61 74   **   3) the dat
25320 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61  abase is file-ba
25330 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20  cked, and.      
25340 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72 65 20    **   4) there 
25350 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65  is no open write
25360 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e  -transaction, an
25370 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35  d.        **   5
25380 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
25390 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61 74 61  s not a WAL data
253a0 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  base,.        **
253b0 20 20 20 36 29 20 61 6c 6c 20 64 61 74 61 20 66     6) all data f
253c0 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 73 20  rom the page is 
253d0 62 65 69 6e 67 20 72 65 61 64 2e 0a 20 20 20 20  being read..    
253e0 20 20 20 20 2a 2a 20 20 20 37 29 20 61 74 20 6c      **   7) at l
253f0 65 61 73 74 20 34 20 62 79 74 65 73 20 68 61 76  east 4 bytes hav
25400 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  e already been r
25410 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ead into the out
25420 70 75 74 20 62 75 66 66 65 72 20 0a 20 20 20 20  put buffer .    
25430 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
25440 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20  * then data can 
25450 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79  be read directly
25460 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
25470 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65  se file into the
25480 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70  .        ** outp
25490 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73  ut buffer, bypas
254a0 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61  sing the page-ca
254b0 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20  che altogether. 
254c0 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20  This speeds.    
254d0 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e      ** up loadin
254e0 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20  g large records 
254f0 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f  that span many o
25500 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20  verflow pages.. 
25510 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
25520 20 20 69 66 28 20 28 65 4f 70 26 30 78 30 31 29    if( (eOp&0x01)
25530 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
25540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25550 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20           /* (1) 
25560 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f  */.         && o
25570 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20  ffset==0        
25580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255a0 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20    /* (2) */.    
255b0 20 20 20 20 20 26 26 20 28 62 45 6e 64 20 7c 7c       && (bEnd ||
255c0 20 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20 20 20   a==ovflSize)   
255d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36             /* (6
255f0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
25600 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
25610 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ion==TRANS_READ 
25620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25630 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20      /* (4) */.  
25640 20 20 20 20 20 20 20 26 26 20 28 66 64 20 3d 20         && (fd = 
25650 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
25660 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e  (pBt->pPager))->
25670 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20  pMethods     /* 
25680 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (3) */.         
25690 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  && pBt->pPage1->
256a0 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20  aData[19]==0x01 
256b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256c0 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a        /* (5) */.
256d0 20 20 20 20 20 20 20 20 20 26 26 20 26 70 42 75           && &pBu
256e0 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74  f[-4]>=pBufStart
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25710 2a 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (7) */.       
25720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
25730 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20   aSave[4];.     
25740 20 20 20 20 20 75 38 20 2a 61 57 72 69 74 65 20       u8 *aWrite 
25750 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20  = &pBuf[-4];.   
25760 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61         assert( a
25770 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74  Write>=pBufStart
25780 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
25790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 68              /* h
257a0 65 6e 63 65 20 28 37 29 20 2a 2f 0a 20 20 20 20  ence (7) */.    
257b0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61        memcpy(aSa
257c0 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a  ve, aWrite, 4);.
257d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
257e0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
257f0 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69   aWrite, a+4, (i
25800 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  64)pBt->pageSize
25810 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a  *(nextPage-1));.
25820 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
25830 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 57  ge = get4byte(aW
25840 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20  rite);.         
25850 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20   memcpy(aWrite, 
25860 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20  aSave, 4);.     
25870 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
25880 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
25890 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62       DbPage *pDb
258a0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
258b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
258c0 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
258d0 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20  ager, nextPage, 
258e0 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20  &pDbPage,.      
258f0 20 20 20 20 20 20 20 20 28 28 65 4f 70 26 30 78          ((eOp&0x
25900 30 31 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47  01)==0 ? PAGER_G
25910 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
25920 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
25930 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
25940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25950 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61           aPayloa
25960 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
25970 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
25980 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  ;.            ne
25990 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
259a0 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  e(aPayload);.   
259b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
259c0 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
259d0 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70  oad[offset+4], p
259e0 42 75 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30  Buf, a, (eOp&0x0
259f0 31 29 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  1), pDbPage);.  
25a00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25a10 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
25a20 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
25a30 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
25a40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25a50 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20    }.        amt 
25a60 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42  -= a;.        pB
25a70 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d  uf += a;.      }
25a80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
25a90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25aa0 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
25ab0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
25ac0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
25ad0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25ae0 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
25af0 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
25b00 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
25b10 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
25b20 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
25b30 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
25b40 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
25b50 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
25b60 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
25b70 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  set"..**.** The 
25b80 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
25b90 72 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20  re that pCur is 
25ba0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61  pointing to a va
25bb0 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68  lid row.** in th
25bc0 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52  e table..**.** R
25bd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
25be0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
25bf0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
25c00 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
25c10 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
25c20 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
25c30 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
25c40 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
25c50 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
25c60 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
25c70 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
25c80 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
25c90 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
25ca0 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
25cb0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
25cc0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
25cd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
25ce0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
25cf0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
25d00 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
25d10 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
25d20 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
25d30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25d40 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
25d50 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
25d60 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
25d70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74  ->nCell );.  ret
25d80 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
25d90 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
25da0 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
25db0 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d  har*)pBuf, 0);.}
25dc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
25dd0 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73  t of the data as
25de0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
25df0 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
25e00 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
25e10 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
25e20 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
25e30 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
25e40 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
25e50 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65  ffset"..**.** Re
25e60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
25e70 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
25e80 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
25e90 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
25ea0 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
25eb0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
25ec0 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
25ed0 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
25ee0 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
25ef0 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
25f00 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43  te3BtreeData(BtC
25f10 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
25f20 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
25f30 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
25f40 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65   int rc;..#ifnde
25f50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
25f60 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43  CRBLOB.  if ( pC
25f70 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
25f80 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
25f90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25fa0 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  ABORT;.  }.#endi
25fb0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  f..  assert( cur
25fc0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
25fd0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
25fe0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
25ff0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
26000 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26010 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
26020 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
26030 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
26040 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
26050 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
26060 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26070 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge] );.    asser
26080 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
26090 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
260a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
260b0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
260c0 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
260d0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
260e0 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
260f0 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
26100 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
26110 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
26120 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
26130 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
26140 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
26150 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
26160 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
26170 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
26180 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
26190 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
261a0 69 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50  index btrees (pP
261b0 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20  age->intKey==0) 
261c0 61 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20  and is the data 
261d0 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72  for.** table btr
261e0 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
261f0 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62  ey==1). The numb
26200 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61  er of bytes of a
26210 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f  vailable.** key/
26220 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
26230 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20  into *pAmt.  If 
26240 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74  *pAmt==0, then t
26250 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75  he value.** retu
26260 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rned will not be
26270 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
26280 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
26290 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d  tine is an optim
262a0 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20  ization.  It is 
262b0 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65  common for the e
262c0 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64  ntire key.** and
262d0 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20   data to fit on 
262e0 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61  the local page a
262f0 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  nd for there to 
26300 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a  be no overflow.*
26310 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74  * pages.  When t
26320 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20  hat is so, this 
26330 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75  routine can be u
26340 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  sed to access th
26350 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
26360 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67  a without making
26370 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65   a copy.  If the
26380 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61   key and/or data
26390 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20   spills.** onto 
263a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
263b0 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  then accessPaylo
263c0 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65  ad() must be use
263d0 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a  d to reassemble.
263e0 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20  ** the key/data 
263f0 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f  and copy it into
26400 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
26410 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  buffer..**.** Th
26420 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
26430 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
26440 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c  ne looks directl
26450 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  y into the cache
26460 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65  d.** page of the
26470 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
26480 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67  data might chang
26490 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65  e or move the ne
264a0 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62  xt time.** any b
264b0 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20  tree routine is 
264c0 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
264d0 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65  c const void *fe
264e0 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
264f0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
26500 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
26510 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
26520 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
26530 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20   u32 *pAmt      
26540 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
26550 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
26560 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
26570 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 61 6d  e */.){.  u32 am
26580 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  t;.  assert( pCu
26590 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50  r!=0 && pCur->iP
265a0 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
265b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
265c0 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge]);.  assert( 
265d0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
265e0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
265f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
26600 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
26610 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
26620 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
26630 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
26640 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
26650 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
26660 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
26670 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26680 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
26690 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
266a0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29  ->info.nSize>0 )
266b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
266c0 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e  ->info.pPayload>
266d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
266e0 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61  r->iPage]->aData
266f0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
26700 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
26710 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c  ->info.pPayload<
26720 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26730 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61  r->iPage]->aData
26740 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42  End ||CORRUPT_DB
26750 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e 74 29  );.  amt = (int)
26760 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
26770 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74  ur->iPage]->aDat
26780 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66  aEnd - pCur->inf
26790 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a 20 20 69  o.pPayload);.  i
267a0 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  f( pCur->info.nL
267b0 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d 74 20 3d  ocal<amt ) amt =
267c0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
267d0 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 61 6d  al;.  *pAmt = am
267e0 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  t;.  return (voi
267f0 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  d*)pCur->info.pP
26800 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ayload;.}.../*.*
26810 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * For the entry 
26820 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72  that cursor pCur
26830 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65   is point to, re
26840 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20  turn as.** many 
26850 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79  bytes of the key
26860 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20   or data as are 
26870 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65  available on the
26880 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65   local.** b-tree
26890 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68   page.  Write th
268a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
268b0 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f  lable bytes into
268c0 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   *pAmt..**.** Th
268d0 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
268e0 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e  ed is ephemeral.
268f0 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d    The key/data m
26900 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65  ay move.** or be
26910 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68   destroyed on th
26920 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61  e next call to a
26930 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65  ny Btree routine
26940 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63  ,.** including c
26950 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20  alls from other 
26960 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20  threads against 
26970 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a  the same cache..
26980 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65  ** Hence, a mute
26990 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65  x on the BtShare
269a0 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  d should be held
269b0 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
269c0 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  g.** this routin
269d0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  e..**.** These r
269e0 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20  outines is used 
269f0 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63  to get quick acc
26a00 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64  ess to key and d
26a10 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  ata.** in the co
26a20 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
26a30 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  no overflow page
26a40 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63  s are used..*/.c
26a50 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
26a60 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28  e3BtreeKeyFetch(
26a70 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
26a80 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65  u32 *pAmt){.  re
26a90 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61  turn fetchPayloa
26aa0 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d  d(pCur, pAmt);.}
26ab0 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
26ac0 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
26ad0 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
26ae0 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20  r, u32 *pAmt){. 
26af0 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79   return fetchPay
26b00 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29  load(pCur, pAmt)
26b10 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
26b20 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
26b30 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
26b40 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
26b50 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
26b60 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
26b70 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
26b80 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
26b90 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
26ba0 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
26bb0 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68  TE_CORRUPT if th
26bc0 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  e page-header fl
26bd0 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20  ags field of.** 
26be0 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
26bf0 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ge does not matc
26c00 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c  h the flags fiel
26c10 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  d of the parent 
26c20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69  (i.e..** if an i
26c30 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61  ntkey page appea
26c40 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72  rs to be the par
26c50 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74  ent of a non-int
26c60 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20  key page, or.** 
26c70 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a  vice-versa)..*/.
26c80 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
26c90 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20  oChild(BtCursor 
26ca0 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67  *pCur, u32 newPg
26cb0 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  no){.  int rc;. 
26cc0 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69   int i = pCur->i
26cd0 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Page;.  MemPage 
26ce0 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53  *pNewPage;.  BtS
26cf0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
26d00 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  r->pBt;..  asser
26d10 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
26d20 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
26d30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
26d40 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
26d50 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
26d60 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52  Cur->iPage<BTCUR
26d70 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b  SOR_MAX_DEPTH );
26d80 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
26d90 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69  >iPage>=0 );.  i
26da0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
26db0 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  (BTCURSOR_MAX_DE
26dc0 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  PTH-1) ){.    re
26dd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
26de0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
26df0 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
26e00 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f  age(pBt, newPgno
26e10 2c 20 26 70 4e 65 77 50 61 67 65 2c 0a 20 20 20  , &pNewPage,.   
26e20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43 75              (pCu
26e30 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
26e40 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30  CF_WriteFlag)==0
26e50 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
26e60 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 69 66  DONLY : 0);.  if
26e70 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
26e80 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ;.  pCur->apPage
26e90 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65  [i+1] = pNewPage
26ea0 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
26eb0 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  i+1] = 0;.  pCur
26ec0 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43  ->iPage++;..  pC
26ed0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
26ee0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
26ef0 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
26f00 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
26f10 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20  lidOvfl);.  if( 
26f20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  pNewPage->nCell<
26f30 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69  1 || pNewPage->i
26f40 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70 50  ntKey!=pCur->apP
26f50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[i]->intKey )
26f60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
26f70 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
26f80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
26f90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
26fa0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
26fb0 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74  .** Page pParent
26fc0 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
26fd0 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20  (non-leaf) tree 
26fe0 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
26ff0 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20  ion .** asserts 
27000 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
27010 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c   iChild is the l
27020 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65  eft-child if the
27030 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c   iIdx'th.** cell
27040 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74   in page pParent
27050 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73  . Or, if iIdx is
27060 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f   equal to the to
27070 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  tal number of.**
27080 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
27090 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  t, that page num
270a0 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
270b0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
270c0 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  .** the page..*/
270d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
270e0 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d  ertParentIndex(M
270f0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
27100 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20   int iIdx, Pgno 
27110 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43  iChild){.  if( C
27120 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
27130 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64  rn;  /* The cond
27140 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65  itions tested be
27150 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  low might not be
27160 20 74 72 75 65 0a 20 20 20 20 20 20 20 20 20 20   true.          
27170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27180 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70    ** in a corrup
27190 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  t database */.  
271a0 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50  assert( iIdx<=pP
271b0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  arent->nCell );.
271c0 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72    if( iIdx==pPar
271d0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
271e0 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
271f0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
27200 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
27210 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c  ffset+8])==iChil
27220 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
27230 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
27240 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
27250 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68  ent, iIdx))==iCh
27260 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ild );.  }.}.#el
27270 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  se.#  define ass
27280 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78  ertParentIndex(x
27290 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f  ,y,z) .#endif../
272a0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
272b0 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
272c0 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
272d0 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
272e0 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
272f0 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
27300 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
27310 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
27320 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
27330 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
27340 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
27350 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
27360 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
27370 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
27380 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
27390 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
273a0 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
273b0 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72  c void moveToPar
273c0 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
273d0 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
273e0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
273f0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
27400 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
27410 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
27420 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
27430 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73  >iPage>0 );.  as
27440 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
27450 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
27460 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e  );.  assertParen
27470 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72  tIndex(.    pCur
27480 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27490 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
274a0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
274b0 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
274c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
274d0 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20  ->iPage]->pgno. 
274e0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
274f0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27500 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75  ->iPage-1] > pCu
27510 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
27520 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20  iPage-1]->nCell 
27530 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  );..  releasePag
27540 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  e(pCur->apPage[p
27550 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
27560 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20  pCur->iPage--;. 
27570 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
27580 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
27590 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
275a0 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
275b0 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 7d 0a 0a  _ValidOvfl);.}..
275c0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
275d0 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
275e0 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
275f0 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74  of its b-tree st
27600 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
27610 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  f the table has 
27620 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
27630 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75  age, then the cu
27640 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
27650 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65   point.** to the
27660 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
27670 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ge instead of th
27680 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
27690 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20  ge. A table has 
276a0 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f  a.** virtual roo
276b0 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20  t page when the 
276c0 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
276d0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
276e0 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e  ls and a .** sin
276f0 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20  gle child page. 
27700 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  This can only ha
27710 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61  ppen with the ta
27720 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ble rooted at pa
27730 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ge 1..**.** If t
27740 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  he b-tree struct
27750 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  ure is empty, th
27760 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69  e cursor state i
27770 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52  s set to .** CUR
27780 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68  SOR_INVALID. Oth
27790 65 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73  erwise, the curs
277a0 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  or is set to poi
277b0 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a  nt to the first.
277c0 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20  ** cell located 
277d0 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20  on the root (or 
277e0 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61  virtual root) pa
277f0 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ge and the curso
27800 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65  r state.** is se
27810 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49  t to CURSOR_VALI
27820 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  D..**.** If this
27830 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
27840 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
27850 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65  it may be assume
27860 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  d that the.** pa
27870 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
27880 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
27890 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74  e [virtual] root
278a0 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70  -page is the exp
278b0 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f  ected .** kind o
278c0 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69  f b-tree page (i
278d0 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e  .e. if when open
278e0 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
278f0 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f  he caller did no
27900 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b  t.** specify a K
27910 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
27920 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
27930 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f  is set to 0x05 o
27940 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63  r 0x0D,.** indic
27950 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d  ating a table b-
27960 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20  tree, or if the 
27970 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69  caller did speci
27980 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a  fy a KeyInfo .**
27990 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
279a0 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
279b0 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41   to 0x02 or 0x0A
279c0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
279d0 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29  index.** b-tree)
279e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
279f0 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
27a00 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
27a10 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
27a20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
27a30 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  OK;..  assert( c
27a40 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
27a50 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
27a60 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  t( CURSOR_INVALI
27a70 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  D < CURSOR_REQUI
27a80 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
27a90 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
27aa0 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55     < CURSOR_REQU
27ab0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
27ac0 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c  ert( CURSOR_FAUL
27ad0 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51  T   > CURSOR_REQ
27ae0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
27af0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
27b00 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
27b10 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  EK ){.    if( pC
27b20 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
27b30 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
27b40 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27b50 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45  skipNext!=SQLITE
27b60 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74  _OK );.      ret
27b70 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
27b80 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  xt;.    }.    sq
27b90 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
27ba0 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d  ursor(pCur);.  }
27bb0 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ..  if( pCur->iP
27bc0 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 77 68  age>=0 ){.    wh
27bd0 69 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ile( pCur->iPage
27be0 20 29 20 72 65 6c 65 61 73 65 50 61 67 65 28 70   ) releasePage(p
27bf0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27c00 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 7d  ->iPage--]);.  }
27c10 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70  else if( pCur->p
27c20 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20  gnoRoot==0 ){.  
27c30 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
27c40 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
27c50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
27c60 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
27c70 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
27c80 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42  nitPage(pCur->pB
27c90 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d  tree->pBt, pCur-
27ca0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72  >pgnoRoot, &pCur
27cb0 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20  ->apPage[0],.   
27cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
27cd0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
27ce0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d  BTCF_WriteFlag)=
27cf0 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  =0 ? PAGER_GET_R
27d00 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20  EADONLY : 0);.  
27d10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27d20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75  _OK ){.      pCu
27d30 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
27d40 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
27d50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
27d60 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
27d70 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 52  ge = 0;.  }.  pR
27d80 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  oot = pCur->apPa
27d90 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28  ge[0];.  assert(
27da0 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43   pRoot->pgno==pC
27db0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a  ur->pgnoRoot );.
27dc0 0a 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70  .  /* If pCur->p
27dd0 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e  KeyInfo is not N
27de0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ULL, then the ca
27df0 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64  ller that opened
27e00 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a   this cursor.  *
27e10 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70  * expected to op
27e20 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65  en it on an inde
27e30 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77  x b-tree. Otherw
27e40 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f  ise, if pKeyInfo
27e50 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74   is.  ** NULL, t
27e60 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74  he caller expect
27e70 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  s a table b-tree
27e80 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
27e90 20 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20   the case,.  ** 
27ea0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45  return an SQLITE
27eb0 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20  _CORRUPT error. 
27ec0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69  .  **.  ** Earli
27ed0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
27ee0 51 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74 68  QLite assumed th
27ef0 61 74 20 74 68 69 73 20 74 65 73 74 20 63 6f 75  at this test cou
27f00 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a  ld not fail.  **
27f10 20 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67   if the root pag
27f20 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f  e was already lo
27f30 61 64 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  aded when this f
27f40 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
27f50 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66  ed (i.e..  ** if
27f60 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29   pCur->iPage>=0)
27f70 2e 20 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f  . But this is no
27f80 74 20 73 6f 20 69 66 20 74 68 65 20 64 61 74 61  t so if the data
27f90 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 65  base is corrupte
27fa0 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20  d .  ** in such 
27fb0 61 20 77 61 79 20 74 68 61 74 20 70 61 67 65 20  a way that page 
27fc0 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20  pRoot is linked 
27fd0 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d  into a second b-
27fe0 74 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a  tree table .  **
27ff0 20 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73   (or the freelis
28000 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t).  */.  assert
28010 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d  ( pRoot->intKey=
28020 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74  =1 || pRoot->int
28030 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Key==0 );.  if( 
28040 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30  pRoot->isInit==0
28050 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49   || (pCur->pKeyI
28060 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e  nfo==0)!=pRoot->
28070 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65  intKey ){.    re
28080 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
28090 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
280a0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20   pCur->aiIdx[0] 
280b0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
280c0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
280d0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
280e0 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42   ~(BTCF_AtLast|B
280f0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
28100 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a  CF_ValidOvfl);..
28110 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
28120 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72  ll>0 ){.    pCur
28130 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
28140 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65  R_VALID;.  }else
28150 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61   if( !pRoot->lea
28160 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75  f ){.    Pgno su
28170 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  bpage;.    if( p
28180 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20  Root->pgno!=1 ) 
28190 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
281a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
281b0 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79  subpage = get4by
281c0 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
281d0 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
281e0 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
281f0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
28200 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d  _VALID;.    rc =
28210 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
28220 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d  r, subpage);.  }
28230 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e  else{.    pCur->
28240 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
28250 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72  INVALID;.  }.  r
28260 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
28270 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
28280 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c  or down to the l
28290 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  eft-most leaf en
282a0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
282b0 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  ** entry to whic
282c0 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
282d0 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  y pointing..**.*
282e0 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
282f0 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20  leaf is the one 
28300 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
28310 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73  t key - the firs
28320 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  t.** in ascendin
28330 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
28340 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66  ic int moveToLef
28350 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
28360 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
28370 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
28380 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
28390 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
283a0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
283b0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
283c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
283d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
283e0 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
283f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28400 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
28410 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
28420 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
28430 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
28440 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
28450 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
28460 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  ll );.    pgno =
28470 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
28480 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
28490 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
284a0 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  e]));.    rc = m
284b0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
284c0 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
284d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
284e0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
284f0 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69  r down to the ri
28500 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  ght-most leaf en
28510 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
28520 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68  ** page to which
28530 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
28540 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69   pointing.  Noti
28550 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ce the differenc
28560 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76  e.** between mov
28570 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e  eToLeftmost() an
28580 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  d moveToRightmos
28590 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74  t().  moveToLeft
285a0 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
285b0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e  the left-most en
285c0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
285d0 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20  *entry* whereas 
285e0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
285f0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72  ).** finds the r
28600 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
28610 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67  beneath the *pag
28620 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69  e*..**.** The ri
28630 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
28640 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
28650 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d  he largest key -
28660 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79   the last.** key
28670 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
28680 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
28690 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nt moveToRightmo
286a0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
286b0 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
286c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
286d0 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
286e0 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20   *pPage = 0;..  
286f0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
28700 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
28710 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28720 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
28730 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
28740 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  e( !(pPage = pCu
28750 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
28760 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
28770 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
28780 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
28790 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
287a0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
287b0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
287c0 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
287d0 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
287e0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
287f0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
28800 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
28810 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64    }.  pCur->aiId
28820 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
28830 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
28840 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28850 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
28860 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
28870 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
28880 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30  CF_ValidNKey)==0
28890 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
288a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  ITE_OK;.}../* Mo
288b0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
288c0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
288d0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
288e0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
288f0 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
28900 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
28910 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
28920 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
28930 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
28940 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
28950 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
28960 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
28970 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
28980 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
28990 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
289a0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
289b0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
289c0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
289d0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
289e0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
289f0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
28a00 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   );.  rc = moveT
28a10 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
28a20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28a30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
28a40 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
28a50 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
28a60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28a70 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
28a80 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28a90 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
28aa0 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
28ab0 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
28ac0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
28ad0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
28ae0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
28af0 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  >0 );.      *pRe
28b00 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
28b10 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
28b20 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
28b30 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
28b40 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
28b50 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74  rsor to the last
28b60 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
28b70 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
28b80 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
28b90 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
28ba0 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
28bb0 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
28bc0 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
28bd0 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
28be0 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
28bf0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
28c00 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
28c10 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Last(BtCursor *p
28c20 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
28c30 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61  .  int rc;. .  a
28c40 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
28c50 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
28c60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
28c70 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
28c80 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
28c90 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
28ca0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c  If the cursor al
28cb0 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20  ready points to 
28cc0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20  the last entry, 
28cd0 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
28ce0 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52   */.  if( CURSOR
28cf0 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
28d00 74 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63  tate && (pCur->c
28d10 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41  urFlags & BTCF_A
28d20 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66  tLast)!=0 ){.#if
28d30 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
28d40 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  .    /* This blo
28d50 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73  ck serves to ass
28d60 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63  ert() that the c
28d70 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65  ursor really doe
28d80 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20  s point .    ** 
28d90 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
28da0 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e  y in the b-tree.
28db0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   */.    int ii;.
28dc0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
28dd0 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69  <pCur->iPage; ii
28de0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
28df0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  t( pCur->aiIdx[i
28e00 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  i]==pCur->apPage
28e10 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  [ii]->nCell );. 
28e20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
28e30 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
28e40 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d  r->iPage]==pCur-
28e50 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28e60 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b  age]->nCell-1 );
28e70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
28e80 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
28e90 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a  iPage]->leaf );.
28ea0 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
28eb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
28ec0 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
28ed0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
28ee0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28ef0 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  {.    if( CURSOR
28f00 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
28f10 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
28f20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
28f30 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
28f40 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
28f50 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
28f60 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
28f70 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
28f80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
28f90 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
28fa0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
28fb0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
28fc0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
28fd0 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
28fe0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
28ff0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29000 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
29010 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b   |= BTCF_AtLast;
29020 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29030 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
29040 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74  lags &= ~BTCF_At
29050 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Last;.      }.  
29060 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65   .    }.  }.  re
29070 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
29080 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73  ove the cursor s
29090 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
290a0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61   to an entry nea
290b0 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70  r the key .** sp
290c0 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b  ecified by pIdxK
290d0 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20  ey or intKey.   
290e0 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73  Return a success
290f0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   code..**.** For
29100 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20   INTKEY tables, 
29110 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d  the intKey param
29120 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70  eter is used.  p
29130 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20  IdxKey .** must 
29140 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e  be NULL.  For in
29150 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78  dex tables, pIdx
29160 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20  Key is used and 
29170 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e  intKey.** is ign
29180 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ored..**.** If a
29190 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73  n exact match is
291a0 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e   not found, then
291b0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
291c0 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f  lways.** left po
291d0 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66  inting at a leaf
291e0 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c   page which woul
291f0 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79  d hold the entry
29200 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70   if it.** were p
29210 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72  resent.  The cur
29220 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  sor might point 
29230 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  to an entry that
29240 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65   comes.** before
29250 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65   or after the ke
29260 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65  y..**.** An inte
29270 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  ger is written i
29280 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20  nto *pRes which 
29290 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  is the result of
292a0 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68  .** comparing th
292b0 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65  e key with the e
292c0 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68  ntry to which th
292d0 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20  e cursor is .** 
292e0 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d  pointing.  The m
292f0 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  eaning of the in
29300 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e  teger written in
29310 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61  to.** *pRes is a
29320 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
29330 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20       *pRes<0    
29340 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
29350 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
29360 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
29370 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
29380 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68     is smaller th
29390 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
293a0 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c  y or if the tabl
293b0 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20  e is empty.**   
293c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
293d0 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  nd the cursor is
293e0 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20   therefore left 
293f0 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67  point to nothing
29400 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
29410 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72  s==0     The cur
29420 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
29430 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
29440 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
29450 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c            exactl
29460 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79  y matches intKey
29470 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  /pIdxKey..**.** 
29480 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20      *pRes>0     
29490 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
294a0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
294b0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
294c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294d0 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e    is larger than
294e0 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
294f0 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .**.*/.int sqlit
29500 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
29510 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f  acked(.  BtCurso
29520 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
29530 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
29540 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
29550 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
29560 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70  *pIdxKey, /* Unp
29570 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
29580 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c  */.  i64 intKey,
29590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
295a0 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a   The table key *
295b0 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68  /.  int biasRigh
295c0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
295d0 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
295e0 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
295f0 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
29600 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
29610 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
29620 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
29630 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
29640 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70  rc;.  RecordComp
29650 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  are xRecordCompa
29660 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  re;..  assert( c
29670 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
29680 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
29690 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
296a0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
296b0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
296c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
296d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
296e0 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75  IdxKey==0)==(pCu
296f0 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20  r->pKeyInfo==0) 
29700 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
29710 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
29720 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20  y positioned at 
29730 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65  the point we are
29740 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20   trying.  ** to 
29750 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75  move to, then ju
29760 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  st return withou
29770 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b  t doing any work
29780 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   */.  if( pCur->
29790 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
297a0 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63  ALID && (pCur->c
297b0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
297c0 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 20  alidNKey)!=0.   
297d0 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
297e0 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b  0]->intKey .  ){
297f0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
29800 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
29810 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
29820 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
29830 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
29840 20 7d 0a 20 20 20 20 69 66 28 20 28 70 43 75 72   }.    if( (pCur
29850 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
29860 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 26 26 20  F_AtLast)!=0 && 
29870 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c  pCur->info.nKey<
29880 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
29890 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
298a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
298b0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
298c0 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a   if( pIdxKey ){.
298d0 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61      xRecordCompa
298e0 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  re = sqlite3Vdbe
298f0 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78  FindCompare(pIdx
29900 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65  Key);.    pIdxKe
29910 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a  y->errCode = 0;.
29920 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
29930 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
29940 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =1 .         || 
29950 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
29960 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  _rc==0 .        
29970 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66   || pIdxKey->def
29980 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20  ault_rc==-1.    
29990 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
299a0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d  xRecordCompare =
299b0 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20   0; /* All keys 
299c0 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a  are integers */.
299d0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
299e0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
299f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
29a00 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
29a10 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
29a20 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
29a30 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29a40 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
29a50 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
29a60 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
29a70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
29a80 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  ]->isInit );.  a
29a90 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
29aa0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
29ab0 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  LID || pCur->apP
29ac0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
29ad0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69  ->nCell>0 );.  i
29ae0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
29af0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
29b00 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  ){.    *pRes = -
29b10 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
29b20 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
29b30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
29b40 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
29b50 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Cell==0 );.    r
29b60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29b70 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
29b80 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
29b90 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65  intKey || pIdxKe
29ba0 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  y );.  for(;;){.
29bb0 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72      int lwr, upr
29bc0 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67  , idx, c;.    Pg
29bd0 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
29be0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
29bf0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29c00 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 75  r->iPage];.    u
29c10 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  8 *pCell;       
29c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c30 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
29c40 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e   current cell in
29c50 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f   pPage */..    /
29c60 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d  * pPage->nCell m
29c70 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ust be greater t
29c80 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69  han zero. If thi
29c90 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61  s is the root-pa
29ca0 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  ge.    ** the cu
29cb0 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20  rsor would have 
29cc0 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f  been INVALID abo
29cd0 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28  ve and this for(
29ce0 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20  ;;) loop.    ** 
29cf0 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73  not run. If this
29d00 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74   is not the root
29d10 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20  -page, then the 
29d20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f  moveToChild() ro
29d30 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75  utine.    ** wou
29d40 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
29d50 64 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72  detected db corr
29d60 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c  uption. Similarl
29d70 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20  y, pPage must.  
29d80 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68    ** be the righ
29d90 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72  t kind (index or
29da0 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65   table) of b-tre
29db0 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73  e page. Otherwis
29dc0 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54  e.    ** a moveT
29dd0 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65  oChild() or move
29de0 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f  ToRoot() call wo
29df0 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65  uld have detecte
29e00 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  d corruption.  *
29e10 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
29e20 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
29e30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
29e40 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78  e->intKey==(pIdx
29e50 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c  Key==0) );.    l
29e60 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20  wr = 0;.    upr 
29e70 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
29e80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69  ;.    assert( bi
29e90 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69  asRight==0 || bi
29ea0 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20  asRight==1 );.  
29eb0 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d    idx = upr>>(1-
29ec0 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69  biasRight); /* i
29ed0 64 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f  dx = biasRight ?
29ee0 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29   upr : (lwr+upr)
29ef0 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d  /2; */.    pCur-
29f00 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29f10 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
29f20 20 20 20 20 69 66 28 20 78 52 65 63 6f 72 64 43      if( xRecordC
29f30 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20  ompare==0 ){.   
29f40 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
29f50 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
29f60 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
29f70 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
29f80 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e  , idx) + pPage->
29f90 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
29fa0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
29fb0 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20  >intKeyLeaf ){. 
29fc0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
29fd0 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b  0x80 <= *(pCell+
29fe0 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +) ){.          
29ff0 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61    if( pCell>=pPa
2a000 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72  ge->aDataEnd ) r
2a010 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2a020 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2a030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2a040 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69  .        getVari
2a050 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29  nt(pCell, (u64*)
2a060 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  &nCellKey);.    
2a070 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79      if( nCellKey
2a080 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
2a090 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
2a0a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2a0b0 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d  lwr>upr ){ c = -
2a0c0 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  1; break; }.    
2a0d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
2a0e0 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b  ellKey>intKey ){
2a0f0 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
2a100 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
2a110 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
2a120 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20   c = +1; break; 
2a130 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
2a140 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2a150 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74  t( nCellKey==int
2a160 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
2a170 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2a180 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  |= BTCF_ValidNKe
2a190 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  y;.          pCu
2a1a0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
2a1b0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
2a1c0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2a1d0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2a1e0 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
2a1f0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2a200 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
2a210 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20    lwr = idx;.   
2a220 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2a230 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b  veto_next_layer;
2a240 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2a250 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
2a260 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2a270 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2a280 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _OK;.           
2a290 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2a2a0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
2a2b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a2c0 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75     assert( lwr+u
2a2d0 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr>=0 );.       
2a2e0 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2a2f0 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28  >>1;  /* idx = (
2a300 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20  lwr+upr)/2; */. 
2a310 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2a320 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
2a330 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65  .        int nCe
2a340 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  ll;  /* Size of 
2a350 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69  the pCell cell i
2a360 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  n bytes */.     
2a370 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2a380 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20  ell(pPage, idx) 
2a390 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
2a3a0 72 53 69 7a 65 3b 0a 0a 20 20 20 20 20 20 20 20  rSize;..        
2a3b0 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73  /* The maximum s
2a3c0 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69  upported page-si
2a3d0 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65  ze is 65536 byte
2a3e0 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  s. This means th
2a3f0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  at.        ** th
2a400 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
2a410 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73   of record bytes
2a420 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e   stored on an in
2a430 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20  dex B-Tree.     
2a440 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65     ** page is le
2a450 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79  ss than 16384 by
2a460 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73  tes and may be s
2a470 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74  tored as a 2-byt
2a480 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72  e.        ** var
2a490 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d  int. This inform
2a4a0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
2a4b0 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69   attempt to avoi
2a4c0 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20  d parsing .     
2a4d0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
2a4e0 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e   cell by checkin
2a4f0 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20  g for the cases 
2a500 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64  where the record
2a510 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
2a520 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20  stored entirely 
2a530 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65  within the b-tre
2a540 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63  e page by inspec
2a550 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a  ting the first .
2a560 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74          ** 2 byt
2a570 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  es of the cell..
2a580 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2a590 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c     nCell = pCell
2a5a0 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [0];.        if(
2a5b0 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d   nCell<=pPage->m
2a5c0 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29  ax1bytePayload )
2a5d0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2a5e0 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20  his branch runs 
2a5f0 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69  if the record-si
2a600 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ze field of the 
2a610 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20  cell is a.      
2a620 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79      ** single by
2a630 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
2a640 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e  e record fits en
2a650 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
2a660 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
2a670 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
2a680 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2a690 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c  ase( pCell+nCell
2a6a0 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +1==pPage->aData
2a6b0 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  End );.         
2a6c0 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
2a6d0 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
2a6e0 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64  *)&pCell[1], pId
2a6f0 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
2a700 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c  else if( !(pCell
2a710 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20  [1] & 0x80) .   
2a720 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c         && (nCell
2a730 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29   = ((nCell&0x7f)
2a740 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29  <<7) + pCell[1])
2a750 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
2a760 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  l.        ){.   
2a770 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
2a780 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
2a790 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69  is a 2 byte vari
2a7a0 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
2a7b0 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  d .          ** 
2a7c0 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
2a7d0 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65   the main b-tree
2a7e0 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
2a7f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2a800 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50  Cell+nCell+2==pP
2a810 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
2a820 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
2a830 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
2a840 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
2a850 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[2], pIdxKey);
2a860 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2a870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2a880 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76   record flows ov
2a890 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d  er onto one or m
2a8a0 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
2a8b0 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20  es. In.         
2a8c0 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68   ** this case th
2a8d0 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65  e whole cell nee
2a8e0 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c  ds to be parsed,
2a8f0 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61   a buffer alloca
2a900 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ted.          **
2a910 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f   and accessPaylo
2a920 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74  ad() used to ret
2a930 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64  rieve the record
2a940 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
2a950 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65      ** buffer be
2a960 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43  fore VdbeRecordC
2a970 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20  ompare() can be 
2a980 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20 20  called. .       
2a990 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
2a9a0 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64  ** If the record
2a9b0 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68 65   is corrupt, the
2a9c0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
2a9d0 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61 64  routine may read
2a9e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 70  .          ** up
2a9f0 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20   to two varints 
2aa00 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
2aa10 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20 65  the buffer. An e
2aa20 78 74 72 61 20 31 38 20 0a 20 20 20 20 20 20 20  xtra 18 .       
2aa30 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70     ** bytes of p
2aa40 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61  adding is alloca
2aa50 74 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ted at the end o
2aa60 66 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 0a  f the buffer in.
2aa70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73            ** cas
2aa80 65 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20  e this happens. 
2aa90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f   */.          vo
2aaa0 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
2aab0 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e          u8 * con
2aac0 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70  st pCellBody = p
2aad0 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68  Cell - pPage->ch
2aae0 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
2aaf0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
2ab00 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
2ab10 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d  CellBody, &pCur-
2ab20 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  >info);.        
2ab30 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70    nCell = (int)p
2ab40 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
2ab50 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2ab60 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20  se( nCell<0 );  
2ab70 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79 20   /* True if key 
2ab80 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72 20  size is 2^32 or 
2ab90 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  more */.        
2aba0 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2abb0 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61  l==0 );  /* Inva
2abc0 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30  lid key size:  0
2abd0 78 38 30 20 30 78 38 30 20 30 78 30 30 20 2a 2f  x80 0x80 0x00 */
2abe0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2abf0 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b  ase( nCell==1 );
2ac00 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79    /* Invalid key
2ac10 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38   size:  0x80 0x8
2ac20 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20 20  0 0x01 */.      
2ac30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2ac40 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69  ell==2 );  /* Mi
2ac50 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65  nimum legal inde
2ac60 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20  x key size */.  
2ac70 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
2ac80 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<2 ){.         
2ac90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2aca0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2acb0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2acc0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2acd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ace0 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71     pCellKey = sq
2acf0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65  lite3Malloc( nCe
2ad00 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20  ll+18 );.       
2ad10 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
2ad20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2ad30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2ad40 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
2ad50 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2ad60 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
2ad70 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2ad80 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2ad90 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
2ada0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61            rc = a
2adb0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
2adc0 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e  r, 0, nCell, (un
2add0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65  signed char*)pCe
2ade0 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20 20  llKey, 2);.     
2adf0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2ae00 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2ae10 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
2ae20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
2ae30 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2ae40 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2ae50 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
2ae60 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
2ae70 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64  l, pCellKey, pId
2ae80 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  xKey);.         
2ae90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2aea0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2aeb0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2aec0 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t( .            
2aed0 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
2aee0 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e!=SQLITE_CORRUP
2aef0 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20  T || c==0).     
2af00 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d      && (pIdxKey-
2af10 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2af20 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e  _NOMEM || pCur->
2af30 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pBtree->db->mall
2af40 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20  ocFailed).      
2af50 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
2af60 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
2af70 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
2af80 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2af90 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c>0 ){.        
2afa0 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
2afb0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2afc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2afd0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  c==0 );.        
2afe0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2aff0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2b000 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2b010 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2b020 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2b030 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2b040 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72  if( pIdxKey->err
2b050 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49  Code ) rc = SQLI
2b060 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
2b070 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2b080 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2b090 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2b0a0 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b  lwr>upr ) break;
2b0b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b0c0 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
2b0d0 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
2b0e0 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
2b0f0 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
2b100 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
2b110 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
2b120 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61  r==upr+1 || (pPa
2b130 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
2b140 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20  Page->leaf) );. 
2b150 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2b160 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
2b170 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2b180 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2b190 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2b1a0 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
2b1b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2b1c0 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
2b1d0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2b1e0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2b1f0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a  u16)idx;.      *
2b200 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
2b210 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b220 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2b230 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
2b240 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
2b250 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d  r:.    if( lwr>=
2b260 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2b270 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
2b280 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2b290 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2b2a0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2b2b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
2b2c0 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
2b2d0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
2b2e0 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
2b2f0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2b300 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2b310 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  lwr;.    rc = mo
2b320 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2b330 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
2b340 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d   rc ) break;.  }
2b350 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a  .moveto_finish:.
2b360 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2b370 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
2b380 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2b390 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2b3a0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
2b3b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
2b3c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
2b3d0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
2b3e0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
2b3f0 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
2b400 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
2b410 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
2b420 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
2b430 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
2b440 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
2b450 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
2b460 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
2b470 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
2b480 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
2b490 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
2b4a0 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
2b4b0 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
2b4c0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
2b4d0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
2b4e0 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
2b4f0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
2b500 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
2b510 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
2b520 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
2b530 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
2b540 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
2b550 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
2b560 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
2b570 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
2b580 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
2b590 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
2b5a0 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
2b5b0 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
2b5c0 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
2b5d0 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
2b5e0 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
2b5f0 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
2b600 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2b610 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
2b620 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
2b630 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
2b640 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
2b650 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
2b660 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
2b670 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
2b680 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2b690 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
2b6a0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
2b6b0 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
2b6c0 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a   set *pRes=1..**
2b6d0 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74  .** The main ent
2b6e0 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69  ry point is sqli
2b6f0 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20  te3BtreeNext(). 
2b700 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
2b710 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
2b720 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
2b730 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72  e of merely incr
2b740 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
2b750 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
2b760 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
2b770 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20  he next cell on 
2b780 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2b790 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20  .  The (slower) 
2b7a0 62 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70  btreeNext() help
2b7b0 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  er.** routine is
2b7c0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
2b7d0 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
2b7e0 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
2b7f0 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  ent page or.** t
2b800 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
2b810 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rsor..**.** The 
2b820 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2b830 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20   will set *pRes 
2b840 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20  to 0 or 1.  The 
2b850 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
2b860 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31  lue.** will be 1
2b870 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62   if the cursor b
2b880 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72  eing stepped cor
2b890 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53  responds to an S
2b8a0 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20  QL index and.** 
2b8b0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
2b8c0 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
2b8d0 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20  skipped if that 
2b8e0 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
2b8f0 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69  en.** a unique i
2b900 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65  ndex.  Otherwise
2b910 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
2b920 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20   have set *pRes 
2b930 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f  to zero..** Zero
2b940 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   is the common c
2b950 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69  ase. The btree i
2b960 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
2b970 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65   free to use the
2b980 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  .** initial *pRe
2b990 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e  s value as a hin
2b9a0 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72  t to improve per
2b9b0 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68  formance, but th
2b9c0 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c  e current.** SQL
2b9d0 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
2b9e0 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
2b9f0 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68  t. (Note that th
2ba00 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a  e comdb2 btree.*
2ba10 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
2ba20 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68   does use this h
2ba30 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a  int, however.).*
2ba40 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
2ba50 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72  NOINLINE int btr
2ba60 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
2ba70 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2ba80 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
2ba90 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
2baa0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
2bab0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2bac0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2bad0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2bae0 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2baf0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2bb00 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2bb10 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29  sert( *pRes==0 )
2bb20 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2bb30 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2bb40 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ID ){.    assert
2bb50 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2bb60 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
2bb70 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  fl)==0 );.    rc
2bb80 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
2bb90 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
2bba0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2bbb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2bbc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2bbd0 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
2bbe0 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
2bbf0 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70  tate ){.      *p
2bc00 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  Res = 1;.      r
2bc10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2bc20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2bc30 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b  Cur->skipNext ){
2bc40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2bc50 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2bc60 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
2bc70 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2bc80 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20  R_SKIPNEXT );.  
2bc90 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2bca0 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
2bcb0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2bcc0 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20  >skipNext>0 ){. 
2bcd0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69         pCur->ski
2bce0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20  pNext = 0;.     
2bcf0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2bd00 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
2bd10 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
2bd20 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
2bd30 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
2bd40 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2bd50 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b  Page];.  idx = +
2bd60 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  +pCur->aiIdx[pCu
2bd70 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
2bd80 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2bd90 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  it );..  /* If t
2bda0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2bdb0 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20   is corrupt, it 
2bdc0 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
2bdd0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78  the value of idx
2bde0 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76   .  ** to be inv
2bdf0 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20  alid here. This 
2be00 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  can only occur i
2be10 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f  f a second curso
2be20 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20  r modifies.  ** 
2be30 74 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63  the page while c
2be40 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f  ursor pCur is ho
2be50 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63  lding a referenc
2be60 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63  e to it. Which c
2be70 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70  an.  ** only hap
2be80 70 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62  pen if the datab
2be90 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69  ase is corrupt i
2bea0 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20  n such a way as 
2beb0 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a  to link the.  **
2bec0 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20   page into more 
2bed0 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20  than one b-tree 
2bee0 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
2bef0 74 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50  testcase( idx>pP
2bf00 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  age->nCell );.. 
2bf10 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d   if( idx>=pPage-
2bf20 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
2bf30 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2bf40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
2bf50 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
2bf60 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2bf70 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2bf80 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
2bf90 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2bfa0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74  rn rc;.      ret
2bfb0 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
2bfc0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
2bfd0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
2bfe0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
2bff0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
2c000 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  s = 1;.        p
2c010 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2c020 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2c030 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2c040 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2c050 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
2c060 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
2c070 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2c080 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2c090 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  ];.    }while( p
2c0a0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2c0b0 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e  >iPage]>=pPage->
2c0c0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28  nCell );.    if(
2c0d0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
2c0e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  {.      return s
2c0f0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2c100 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
2c110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
2c120 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c130 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2c140 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2c150 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c160 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
2c170 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c    return moveToL
2c180 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
2c190 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33   }.}.int sqlite3
2c1a0 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  BtreeNext(BtCurs
2c1b0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2c1c0 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Res){.  MemPage 
2c1d0 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  *pPage;.  assert
2c1e0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2c1f0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2c200 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2c210 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2c220 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20  ==0 || *pRes==1 
2c230 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2c240 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2c250 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2c260 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2c270 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2c280 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
2c290 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2c2a0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2c2b0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
2c2c0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  *pRes = 0;.  if(
2c2d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2c2e0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65  URSOR_VALID ) re
2c2f0 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70  turn btreeNext(p
2c300 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 70 50  Cur, pRes);.  pP
2c310 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2c320 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2c330 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e  .  if( (++pCur->
2c340 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2c350 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  e])>=pPage->nCel
2c360 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61  l ){.    pCur->a
2c370 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2c380 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]--;.    return 
2c390 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  btreeNext(pCur, 
2c3a0 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pRes);.  }.  if(
2c3b0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
2c3c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c3d0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
2c3e0 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
2c3f0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2c400 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65    }.}../*.** Ste
2c410 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
2c420 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
2c430 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
2c440 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2c450 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
2c460 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
2c470 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
2c480 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
2c490 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
2c4a0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
2c4b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
2c4c0 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
2c4d0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
2c4e0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
2c4f0 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  1..**.** The mai
2c500 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
2c510 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2c520 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72  vious().  That r
2c530 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
2c540 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
2c550 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
2c560 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e  rely decrementin
2c570 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
2c580 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
2c590 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76  x.** to the prev
2c5a0 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65  ious cell on the
2c5b0 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
2c5c0 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
2c5d0 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20  eePrevious().** 
2c5e0 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69  helper routine i
2c5f0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
2c600 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
2c610 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
2c620 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20  rent page.** or 
2c630 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
2c640 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
2c650 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2c660 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73  n will set *pRes
2c670 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65   to 0 or 1.  The
2c680 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2c690 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  alue.** will be 
2c6a0 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  1 if the cursor 
2c6b0 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f  being stepped co
2c6c0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
2c6d0 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a  SQL index and.**
2c6e0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2c6f0 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
2c700 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74   skipped if that
2c710 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62   SQL index had b
2c720 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20  een.** a unique 
2c730 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73  index.  Otherwis
2c740 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  e the caller wil
2c750 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73  l have set *pRes
2c760 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72   to zero..** Zer
2c770 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o is the common 
2c780 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20  case. The btree 
2c790 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
2c7a0 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68  s free to use th
2c7b0 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52  e.** initial *pR
2c7c0 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69  es value as a hi
2c7d0 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65  nt to improve pe
2c7e0 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74  rformance, but t
2c7f0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51  he current.** SQ
2c800 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2c810 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2c820 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74  ot. (Note that t
2c830 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a  he comdb2 btree.
2c840 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
2c850 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20  n does use this 
2c860 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a  hint, however.).
2c870 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
2c880 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
2c890 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
2c8a0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2c8b0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2c8c0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2c8d0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
2c8e0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2c8f0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2c900 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
2c910 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
2c920 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2c930 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2c940 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2c950 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2c960 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
2c970 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54  ->curFlags & (BT
2c980 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
2c990 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61  alidOvfl|BTCF_Va
2c9a0 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a  lidNKey))==0 );.
2c9b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c9c0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
2c9d0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2c9e0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2c9f0 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  D ){.    rc = re
2ca00 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
2ca10 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69  ion(pCur);.    i
2ca20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ca30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2ca40 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
2ca50 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
2ca60 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2ca70 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
2ca80 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
2ca90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2caa0 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
2cab0 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  skipNext ){.    
2cac0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2cad0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2cae0 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
2caf0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
2cb00 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70  PNEXT );.      p
2cb10 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2cb20 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
2cb30 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2cb40 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  Next<0 ){.      
2cb50 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2cb60 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
2cb70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2cb80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
2cb90 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2cba0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
2cbb0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2cbc0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2cbd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2cbe0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
2cbf0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2cc00 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d  ){.    int idx =
2cc10 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2cc20 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72  r->iPage];.    r
2cc30 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2cc40 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66  pCur, get4byte(f
2cc50 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
2cc60 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  dx)));.    if( r
2cc70 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2cc80 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
2cc90 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
2cca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
2ccb0 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
2ccc0 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29  Cur->iPage]==0 )
2ccd0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
2cce0 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
2ccf0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2cd00 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2cd10 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52  LID;.        *pR
2cd20 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
2cd30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2cd40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2cd50 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
2cd60 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  r);.    }.    as
2cd70 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
2cd80 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  .nSize==0 );.   
2cd90 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2cda0 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46  curFlags & (BTCF
2cdb0 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2cdc0 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29  ValidOvfl))==0 )
2cdd0 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ;..    pCur->aiI
2cde0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
2cdf0 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  -;.    pPage = p
2ce00 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2ce10 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66  ->iPage];.    if
2ce20 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2ce30 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
2ce40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2ce50 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
2ce60 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  us(pCur, pRes);.
2ce70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ce80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ce90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2cea0 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
2ceb0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
2cec0 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
2ced0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2cee0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2cef0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2cf00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2cf10 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
2cf20 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70  ( *pRes==0 || *p
2cf30 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  Res==1 );.  asse
2cf40 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2cf50 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
2cf60 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2cf70 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d  LID );.  *pRes =
2cf80 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2cf90 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41  lags &= ~(BTCF_A
2cfa0 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
2cfb0 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Ovfl|BTCF_ValidN
2cfc0 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  Key);.  pCur->in
2cfd0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2cfe0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2cff0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20  !=CURSOR_VALID. 
2d000 20 20 7c 7c 20 70 43 75 72 2d 3e 61 69 49 64 78    || pCur->aiIdx
2d010 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30  [pCur->iPage]==0
2d020 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  .   || pCur->apP
2d030 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2d040 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20  ->leaf==0.  ){. 
2d050 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
2d060 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
2d070 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  es);.  }.  pCur-
2d080 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2d090 67 65 5d 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20  ge]--;.  return 
2d0a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2d0b0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
2d0c0 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
2d0d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2d0e0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
2d0f0 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
2d100 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
2d110 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33  r words, sqlite3
2d120 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20  PagerWrite().** 
2d130 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2d140 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
2d150 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e  ew page.)  The n
2d160 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f  ew page has also
2d170 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e  .** been referen
2d180 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ced and the call
2d190 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72  ing routine is r
2d1a0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
2d1b0 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
2d1c0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
2d1d0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
2d1e0 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
2d1f0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
2d200 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
2d210 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
2d220 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
2d230 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
2d240 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69  rror.  *ppPage i
2d250 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e  s set to NULL in
2d260 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e   the event of an
2d270 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66   error..**.** If
2d280 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
2d290 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
2d2a0 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74  , then an effort
2d2b0 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
2d2c0 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
2d2d0 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
2d2e0 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
2d2f0 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
2d300 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
2d310 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
2d320 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
2d330 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
2d340 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d350 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
2d360 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
2d370 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
2d380 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
2d390 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74  he eMode paramet
2d3a0 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58  er is BTALLOC_EX
2d3b0 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72  ACT and the near
2d3c0 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a  by page exists.*
2d3d0 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  * anywhere on th
2d3e0 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
2d3f0 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  n it is guarante
2d400 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ed to be returne
2d410 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20  d.  If.** eMode 
2d420 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68  is BTALLOC_LT th
2d430 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75  en the page retu
2d440 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73  rned will be les
2d450 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
2d460 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20  ** to nearby if 
2d470 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78  any such page ex
2d480 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20  ists.  If eMode 
2d490 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74  is BTALLOC_ANY t
2d4a0 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65  hen there.** are
2d4b0 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73   no restrictions
2d4c0 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69   on which page i
2d4d0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
2d4e0 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
2d4f0 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42  teBtreePage(.  B
2d500 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
2d510 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
2d520 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
2d530 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f  **ppPage,      /
2d540 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20  * Store pointer 
2d550 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
2d560 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
2d570 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20  Pgno *pPgno,    
2d580 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
2d590 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2d5a0 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  here */.  Pgno n
2d5b0 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20  earby,          
2d5c0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
2d5d0 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20   page near this 
2d5e0 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64  one */.  u8 eMod
2d5f0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2d600 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  /* BTALLOC_EXACT
2d610 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72  , BTALLOC_LT, or
2d620 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a   BTALLOC_ANY */.
2d630 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
2d640 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
2d650 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20    u32 n;     /* 
2d660 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2d670 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
2d680 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20  */.  u32 k;     
2d690 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
2d6a0 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
2d6b0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
2d6c0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2d6d0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d  Trunk = 0;.  Mem
2d6e0 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b  Page *pPrevTrunk
2d6f0 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50   = 0;.  Pgno mxP
2d700 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61  age;     /* Tota
2d710 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
2d720 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
2d730 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2d740 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
2d750 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2d760 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41  sert( eMode==BTA
2d770 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61  LLOC_ANY || (nea
2d780 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d  rby>0 && IfNotOm
2d790 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61  itAV(pBt->autoVa
2d7a0 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67  cuum)) );.  pPag
2d7b0 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
2d7c0 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72  ;.  mxPage = btr
2d7d0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
2d7e0 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
2d7f0 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33  OF: R-05119-0263
2d800 37 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67  7 The 4-byte big
2d810 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
2d820 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a  at offset 36.  *
2d830 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20  * stores stores 
2d840 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
2d850 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
2d860 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20   freelist. */.  
2d870 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
2d880 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
2d890 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
2d8a0 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69  =mxPage-1 );.  i
2d8b0 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a  f( n>=mxPage ){.
2d8c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d8d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2d8e0 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b    }.  if( n>0 ){
2d8f0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
2d900 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
2d910 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
2d920 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
2d930 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
2d940 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
2d950 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
2d960 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
2d970 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
2d980 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
2d990 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   */.    .    /* 
2d9a0 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  If eMode==BTALLO
2d9b0 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75  C_EXACT and a qu
2d9c0 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
2d9d0 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
2d9e0 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
2d9f0 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
2da00 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
2da10 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
2da20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
2da30 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
2da40 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
2da50 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
2da60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2da70 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2da80 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
2da90 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20  OC_EXACT ){.    
2daa0 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78    if( nearby<=mx
2dab0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2dac0 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
2dad0 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
2dae0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
2daf0 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
2db00 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20  acuum );.       
2db10 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
2db20 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
2db30 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ype, 0);.       
2db40 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2db50 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28   rc;.        if(
2db60 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
2db70 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
2db80 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
2db90 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
2dba0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2dbb0 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
2dbc0 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
2dbd0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
2dbe0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
2dbf0 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
2dc00 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75  he free-list cou
2dc10 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72  nt by 1. Set iTr
2dc20 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78  unk to the index
2dc30 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
2dc40 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74  irst free-list t
2dc50 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76  runk page. iPrev
2dc60 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c  Trunk is initial
2dc70 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ly 1..    */.   
2dc80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2dc90 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
2dca0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2dcb0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2dcc0 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
2dcd0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
2dce0 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
2dcf0 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
2dd00 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
2dd10 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
2dd20 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
2dd30 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
2dd40 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
2dd50 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
2dd60 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
2dd70 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
2dd80 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
2dd90 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
2dda0 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
2ddb0 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
2ddc0 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a  LOC_EXACT).    *
2ddd0 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67  * or until a pag
2dde0 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61  e less than 'nea
2ddf0 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
2de00 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
2de10 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  LT).    */.    d
2de20 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
2de30 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
2de40 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
2de50 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  unk ){.        /
2de60 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
2de70 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54 68 65  -01506-11053 The
2de80 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f   first integer o
2de90 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75  n a freelist tru
2dea0 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  nk page.        
2deb0 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  ** is the page n
2dec0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
2ded0 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  t freelist trunk
2dee0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
2def0 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  t or.        ** 
2df00 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69 73 20  zero if this is 
2df10 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73  the last freelis
2df20 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f  t trunk page. */
2df30 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
2df40 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
2df50 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
2df60 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2df70 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
2df80 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d  NCE-OF: R-59841-
2df90 31 33 37 39 38 20 54 68 65 20 34 2d 62 79 74 65  13798 The 4-byte
2dfa0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
2dfb0 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 32  ger at offset 32
2dfc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
2dfd0 65 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  es the page numb
2dfe0 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
2dff0 70 61 67 65 20 6f 66 20 74 68 65 20 66 72 65 65  page of the free
2e000 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  list, or zero if
2e010 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2e020 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74  freelist is empt
2e030 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54  y. */.        iT
2e040 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2e050 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2e060 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
2e070 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72     testcase( iTr
2e080 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
2e090 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e       if( iTrunk>
2e0a0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
2e0b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2e0c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2e0d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e0e0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
2e0f0 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 54  usedPage(pBt, iT
2e100 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
2e110 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2e120 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2e130 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
2e140 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2e150 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2e160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
2e170 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29  ert( pTrunk!=0 )
2e180 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2e190 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30  pTrunk->aData!=0
2e1a0 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   );.      /* EVI
2e1b0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32  DENCE-OF: R-1352
2e1c0 33 2d 30 34 33 39 34 20 54 68 65 20 73 65 63 6f  3-04394 The seco
2e1d0 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20  nd integer on a 
2e1e0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
2e1f0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
2e200 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  the number of le
2e210 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73  af page pointers
2e220 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20   to follow. */. 
2e230 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74       k = get4byt
2e240 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2e250 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [4]);.      if( 
2e260 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c  k==0 && !searchL
2e270 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
2e280 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20  * The trunk has 
2e290 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68  no leaves and th
2e2a0 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65  e list is not be
2e2b0 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20  ing searched. . 
2e2c0 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74         ** So ext
2e2d0 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70  ract the trunk p
2e2e0 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75  age itself and u
2e2f0 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77  se it as the new
2e300 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ly .        ** a
2e310 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
2e320 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2e330 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29   pPrevTrunk==0 )
2e340 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2e350 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2e360 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
2e370 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2e380 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
2e390 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2e3a0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
2e3b0 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
2e3c0 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
2e3d0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
2e3e0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
2e3f0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2e400 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  4);.        *ppP
2e410 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
2e420 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
2e430 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
2e440 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
2e450 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
2e460 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
2e470 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  Pgno, n-1));.   
2e480 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28     }else if( k>(
2e490 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u32)(pBt->usable
2e4a0 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20  Size/4 - 2) ){. 
2e4b0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
2e4c0 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
2e4d0 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
2e4e0 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
2e4f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2e500 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2e510 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2e520 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2e530 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2e540 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2e550 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
2e560 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
2e570 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62         && (nearb
2e580 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54  y==iTrunk || (iT
2e590 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65  runk<nearby && e
2e5a0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2e5b0 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  )) .      ){.   
2e5c0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
2e5d0 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
2e5e0 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
2e5f0 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
2e600 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
2e610 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
2e620 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
2e630 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
2e640 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2e650 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
2e660 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  nk;.        *ppP
2e670 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
2e680 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
2e690 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
2e6a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2e6b0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
2e6c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
2e6d0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2e6e0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2e6f0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2e700 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2e710 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   k==0 ){.       
2e720 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
2e730 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
2e740 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
2e750 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
2e760 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2e770 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  4);.          }e
2e780 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2e790 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2e7a0 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
2e7b0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2e7c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2e7d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
2e7f0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2e800 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
2e810 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   }.            m
2e820 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
2e830 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
2e840 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2e850 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
2e860 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2e870 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2e880 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
2e890 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
2e8a0 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
2e8b0 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
2e8c0 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
2e8d0 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
2e8e0 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
2e8f0 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
2e900 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
2e910 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
2e920 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2e930 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
2e940 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
2e950 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
2e960 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2e970 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
2e980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2e990 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67   iNewTrunk>mxPag
2e9a0 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  e ){ .          
2e9b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2e9c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2e9d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2e9e0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2e9f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ea00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ea10 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  iNewTrunk==mxPag
2ea20 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
2ea30 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
2ea40 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77  edPage(pBt, iNew
2ea50 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e  Trunk, &pNewTrun
2ea60 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  k, 0);.         
2ea70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ea80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2ea90 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2eaa0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2eab0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2eac0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2ead0 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b  rWrite(pNewTrunk
2eae0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2eaf0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2eb00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2eb10 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2eb20 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
2eb30 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2eb40 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2eb50 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2eb60 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
2eb70 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
2eb80 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
2eb90 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2eba0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2ebb0 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
2ebc0 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
2ebd0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
2ebe0 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  ewTrunk->aData[8
2ebf0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
2ec00 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b  a[12], (k-1)*4);
2ec10 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
2ec20 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
2ec30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2ec40 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
2ec50 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
2ec60 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2ec70 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2ec80 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  e1->pDbPage) );.
2ec90 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
2eca0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2ecb0 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75  ata[32], iNewTru
2ecc0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
2ecd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2ece0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2ecf0 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
2ed00 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2ed10 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2ed20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
2ed30 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2ed40 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2ed50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ed60 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2ed70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
2ed80 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  [0], iNewTrunk);
2ed90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2eda0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
2edb0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
2edc0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2edd0 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
2ede0 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
2edf0 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
2ee00 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  -1));.#endif.   
2ee10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30     }else if( k>0
2ee20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
2ee30 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72  xtract a leaf fr
2ee40 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a  om the trunk */.
2ee50 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73          u32 clos
2ee60 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e  est;.        Pgn
2ee70 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  o iPage;.       
2ee80 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2ee90 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e  aData = pTrunk->
2eea0 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69  aData;.        i
2eeb0 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20  f( nearby>0 ){. 
2eec0 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a           u32 i;.
2eed0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
2eee0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2eef0 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
2ef00 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
2ef10 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2ef20 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
2ef30 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
2ef40 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
2ef50 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  8+i*4]);.       
2ef60 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65         if( iPage
2ef70 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  <=nearby ){.    
2ef80 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
2ef90 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
2efa0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2efc0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2efd0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2efe0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
2eff0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ist;.           
2f000 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41   dist = sqlite3A
2f010 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65  bsInt32(get4byte
2f020 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65  (&aData[8]) - ne
2f030 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20  arby);.         
2f040 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b     for(i=1; i<k;
2f050 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2f060 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
2f070 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65  lite3AbsInt32(ge
2f080 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
2f090 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b  i*4]) - nearby);
2f0a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2f0b0 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20  f( d2<dist ){.  
2f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
2f0d0 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
2f0e0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
2f0f0 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = d2;.          
2f100 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2f110 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2f120 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2f130 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
2f140 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
2f150 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d  .        iPage =
2f160 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
2f170 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a  [8+closest*4]);.
2f180 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2f190 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20  ( iPage==mxPage 
2f1a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
2f1b0 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20  Page>mxPage ){. 
2f1c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2f1d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2f1e0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
2f1f0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2f200 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
2f210 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2f220 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
2f230 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73  ;.        if( !s
2f240 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
2f250 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e      || (iPage==n
2f260 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c  earby || (iPage<
2f270 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
2f280 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
2f290 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2f2a0 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e      int noConten
2f2b0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  t;.          *pP
2f2c0 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
2f2d0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
2f2e0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20  LLOCATE: %d was 
2f2f0 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e  leaf %d of %d on
2f300 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20   trunk %d".     
2f310 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25              ": %
2f320 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65  d more free page
2f330 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
2f340 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63         *pPgno, c
2f350 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72  losest+1, k, pTr
2f360 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29  unk->pgno, n-1))
2f370 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2f380 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2f390 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
2f3a0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
2f3b0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
2f3c0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2f3d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c            if( cl
2f3e0 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20  osest<k-1 ){.   
2f3f0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
2f400 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
2f410 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a  *4], &aData[4+k*
2f420 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  4], 4);.        
2f430 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75    }.          pu
2f440 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d  t4byte(&aData[4]
2f450 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
2f460 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62    noContent = !b
2f470 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
2f480 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20  t(pBt, *pPgno)? 
2f490 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
2f4a0 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  ENT : 0;.       
2f4b0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
2f4c0 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
2f4d0 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
2f4e0 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  noContent);.    
2f4f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2f500 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f510 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2f520 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
2f530 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
2f540 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2f550 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f560 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f570 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
2f580 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2f590 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
2f5a0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
2f5b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f5c0 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
2f5d0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
2f5e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2f5f0 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
2f600 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50  Trunk);.      pP
2f610 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
2f620 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68    }while( search
2f630 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
2f640 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
2f650 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68  e no pages on th
2f660 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61  e freelist, so a
2f670 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65  ppend a new page
2f680 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
2f690 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
2f6a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72     **.    ** Nor
2f6b0 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73  mally, new pages
2f6c0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
2f6d0 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20  is block can be 
2f6e0 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
2f6f0 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  he.    ** pager 
2f700 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27  layer with the '
2f710 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67  no-content' flag
2f720 20 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65   set. This preve
2f730 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20  nts the pager.  
2f740 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67    ** from trying
2f750 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67   to read the pag
2f760 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  es content from 
2f770 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69  disk. However, i
2f780 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72  f the.    ** cur
2f790 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
2f7a0 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e   has already run
2f7b0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63   one or more inc
2f7c0 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a  remental-vacuum.
2f7d0 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68      ** steps, th
2f7e0 65 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61  en the page we a
2f7f0 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f  re about to allo
2f800 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cate may contain
2f810 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20   content.    ** 
2f820 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
2f830 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
2f840 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20   a rollback. In 
2f850 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20  this case, do.  
2f860 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65    ** not set the
2f870 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67   no-content flag
2f880 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68  . This causes th
2f890 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20  e pager to load 
2f8a0 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  and journal.    
2f8b0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ** the current p
2f8c0 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f  age content befo
2f8d0 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69  re overwriting i
2f8e0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
2f8f0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70   Note that the p
2f900 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63  ager will not ac
2f910 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74  tually attempt t
2f920 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61  o load or journa
2f930 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e  l .    ** conten
2f940 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74  t for any page t
2f950 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  hat really does 
2f960 6c 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  lie past the end
2f970 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2f980 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20  .    ** file on 
2f990 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66  disk. So the eff
2f9a0 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e  ects of disablin
2f9b0 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74  g the no-content
2f9c0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20   optimization.  
2f9d0 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f    ** here are co
2f9e0 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20  nfined to those 
2f9f0 70 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62  pages that lie b
2fa00 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f  etween the end o
2fa10 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  f the.    ** dat
2fa20 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20  abase image and 
2fa30 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
2fa40 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
2fa50 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f    */.    int bNo
2fa60 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66  Content = (0==If
2fa70 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62  NotOmitAV(pBt->b
2fa80 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41  DoTruncate))? PA
2fa90 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
2faa0 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  T:0;..    rc = s
2fab0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2fac0 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
2fad0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2fae0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2faf0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
2fb00 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  ;.    if( pBt->n
2fb10 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
2fb20 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70  TE_PAGE(pBt) ) p
2fb30 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69  Bt->nPage++;..#i
2fb40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2fb50 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2fb60 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
2fb70 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49  cuum && PTRMAP_I
2fb80 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e  SPAGE(pBt, pBt->
2fb90 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  nPage) ){.      
2fba0 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66  /* If *pPgno ref
2fbb0 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ers to a pointer
2fbc0 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63  -map page, alloc
2fbd0 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65  ate two new page
2fbe0 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68  s.      ** at th
2fbf0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
2fc00 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65  e instead of one
2fc10 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f  . The first allo
2fc20 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20  cated page.     
2fc30 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65   ** becomes a ne
2fc40 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  w pointer-map pa
2fc50 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ge, the second i
2fc60 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61  s used by the ca
2fc70 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ller..      */. 
2fc80 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
2fc90 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41  g = 0;.      TRA
2fca0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2fcb0 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
2fcc0 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20  le (pointer-map 
2fcd0 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e  page)\n", pBt->n
2fce0 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73  Page));.      as
2fcf0 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
2fd00 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
2fd10 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
2fd20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
2fd30 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70  nusedPage(pBt, p
2fd40 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c  Bt->nPage, &pPg,
2fd50 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
2fd60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2fd70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2fd80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2fd90 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
2fda0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
2fdb0 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
2fdc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2fdd0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2fde0 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  c;.      pBt->nP
2fdf0 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
2fe00 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
2fe10 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2fe20 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67  Bt) ){ pBt->nPag
2fe30 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e  e++; }.    }.#en
2fe40 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65  dif.    put4byte
2fe50 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e  (28 + (u8*)pBt->
2fe60 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70  pPage1->aData, p
2fe70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
2fe80 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50  *pPgno = pBt->nP
2fe90 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  age;..    assert
2fea0 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
2feb0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2fec0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   );.    rc = btr
2fed0 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
2fee0 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
2fef0 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29  age, bNoContent)
2ff00 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2ff10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
2ff20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2ff30 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
2ff40 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2ff50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ff60 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
2ff70 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
2ff80 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
2ff90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
2ffa0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
2ffb0 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
2ffc0 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  e\n", *pPgno));.
2ffd0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a    }..  assert( *
2ffe0 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
2fff0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
30000 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  ..end_allocate_p
30010 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  age:.  releasePa
30020 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
30030 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
30040 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28  runk);.  assert(
30050 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
30060 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  | sqlite3PagerPa
30070 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
30080 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d  age)->pDbPage)<=
30090 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  1 );.  assert( r
300a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
300b0 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
300c0 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  t==0 );.  return
300d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
300e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
300f0 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20  sed to add page 
30100 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  iPage to the dat
30110 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d  abase file free-
30120 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20  list. .** It is 
30130 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
30140 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
30150 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74  eady a part of t
30160 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
30170 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61  .** The value pa
30180 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
30190 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
301a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
301b0 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20  optional..** If 
301c0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65  the caller happe
301d0 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69  ns to have a poi
301e0 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
301f0 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  age object .** c
30200 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
30210 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79  page iPage handy
30220 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74  , it may pass it
30230 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76   as the second v
30240 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  alue. .** Otherw
30250 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ise, it may pass
30260 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
30270 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d  a pointer to a M
30280 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73  emPage object is
30290 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
302a0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
302b0 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  ** its reference
302c0 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c   count is not al
302d0 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
302e0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
302f0 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28  c int freePage2(
30300 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d  BtShared *pBt, M
30310 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65  emPage *pMemPage
30320 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20  , Pgno iPage){. 
30330 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
30340 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
30350 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73       /* Free-lis
30360 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  t trunk page */.
30370 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20    Pgno iTrunk = 
30380 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
30390 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
303a0 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73  mber of free-lis
303b0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20  t trunk page */ 
303c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
303d0 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
303e0 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
303f0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
30400 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  e 1 */.  MemPage
30410 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
30420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30430 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  Page being freed
30440 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a  . May be NULL. *
30450 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
30460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30470 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
30480 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
30490 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
304a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
304b0 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
304c0 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72  r of pages on fr
304d0 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
304e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
304f0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
30500 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
30510 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
30520 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73  iPage>1 );.  ass
30530 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c  ert( !pMemPage |
30540 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f  | pMemPage->pgno
30550 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66  ==iPage );..  if
30560 28 20 69 50 61 67 65 3c 32 20 29 20 72 65 74 75  ( iPage<2 ) retu
30570 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
30580 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d  T_BKPT;.  if( pM
30590 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50  emPage ){.    pP
305a0 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a  age = pMemPage;.
305b0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
305c0 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61  Ref(pPage->pDbPa
305d0 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
305e0 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50    pPage = btreeP
305f0 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69  ageLookup(pBt, i
30600 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Page);.  }..  /*
30610 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Increment the f
30620 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f  ree page count o
30630 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63  n pPage1 */.  rc
30640 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
30650 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
30660 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
30670 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
30680 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67  out;.  nFree = g
30690 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
306a0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70  >aData[36]);.  p
306b0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
306c0 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65  >aData[36], nFre
306d0 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74  e+1);..  if( pBt
306e0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
306f0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
30700 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
30710 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70  secure_delete op
30720 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
30730 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77   then.    ** alw
30740 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
30750 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
30760 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
30770 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  os..    */.    i
30780 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28  f( (!pPage && ((
30790 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
307a0 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
307b0 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a  Page, 0))!=0) ).
307c0 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20       ||         
307d0 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65     ((rc = sqlite
307e0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
307f0 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29  e->pDbPage))!=0)
30800 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
30810 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
30820 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
30830 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
30840 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  0, pPage->pBt->p
30850 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
30860 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
30870 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
30880 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20  o-vacuum, write 
30890 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
308a0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a  pointer-map.  **
308b0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
308c0 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72  t the page is fr
308d0 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ee..  */.  if( I
308e0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
308f0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
30900 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  , iPage, PTRMAP_
30910 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63  FREEPAGE, 0, &rc
30920 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
30930 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
30940 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  t;.  }..  /* Now
30950 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20   manipulate the 
30960 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  actual database 
30970 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74  free-list struct
30980 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74  ure. There are t
30990 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c  wo.  ** possibil
309a0 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72  ities. If the fr
309b0 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65  ee-list is curre
309c0 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69  ntly empty, or i
309d0 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  f the first.  **
309e0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
309f0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
30a00 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20  full, then this 
30a10 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
30a20 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65   a.  ** new free
30a30 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
30a40 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
30a50 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65  will become a le
30a60 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  af of the.  ** f
30a70 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
30a80 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  in the current f
30a90 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62  ree-list. This b
30aa0 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74  lock tests if it
30ab0 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
30ac0 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67  e to add the pag
30ad0 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d  e as a new free-
30ae0 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a  list leaf..  */.
30af0 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29    if( nFree!=0 )
30b00 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b  {.    u32 nLeaf;
30b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
30b30 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20  r of leaf cells 
30b40 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  on trunk page */
30b50 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67  ..    iTrunk = g
30b60 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
30b70 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
30b80 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
30b90 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
30ba0 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
30bb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30bc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
30bd0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
30be0 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20     }..    nLeaf 
30bf0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
30c00 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
30c10 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
30c20 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b  usableSize>32 );
30c30 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e  .    if( nLeaf >
30c40 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
30c50 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20  eSize/4 - 2 ){. 
30c60 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30c70 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
30c80 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
30c90 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
30ca0 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75    if( nLeaf < (u
30cb0 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
30cc0 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20  ze/4 - 8 ){.    
30cd0 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
30ce0 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20  e there is room 
30cf0 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  on the trunk pag
30d00 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  e to insert the 
30d10 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
30d20 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e  ing freed as a n
30d30 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a  ew leaf..      *
30d40 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20  *.      ** Note 
30d50 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70  that the trunk p
30d60 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  age is not reall
30d70 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20  y full until it 
30d80 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a  contains.      *
30d90 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
30da0 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20   2 entries, not 
30db0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
30dc0 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68   entries as we h
30dd0 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64  ave.      ** cod
30de0 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20  ed.  But due to 
30df0 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69  a coding error i
30e00 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  n versions of SQ
30e10 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20  Lite prior to.  
30e20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61      ** 3.6.0, da
30e30 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65  tabases with fre
30e40 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
30e50 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74  s holding more t
30e60 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  han.      ** usa
30e70 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
30e80 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65  tries will be re
30e90 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70  ported as corrup
30ea0 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20  t.  In order.   
30eb0 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69     ** to maintai
30ec0 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  n backwards comp
30ed0 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f  atibility with o
30ee0 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
30ef0 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a   SQLite,.      *
30f00 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  * we will contin
30f10 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74  ue to restrict t
30f20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
30f30 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69  ries to usableSi
30f40 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a  ze/4 - 8.      *
30f50 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73  * for now.  At s
30f60 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
30f70 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76   future (once ev
30f80 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61  eryone has upgra
30f90 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ded.      ** to 
30fa0 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20  3.6.0 or later) 
30fb0 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64  we should consid
30fc0 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f  er fixing the co
30fd0 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a  nditional above.
30fe0 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64        ** to read
30ff0 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32   "usableSize/4-2
31000 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73  " instead of "us
31010 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20  ableSize/4-8".. 
31020 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
31030 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
31040 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65  19920-11576 Howe
31050 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69  ver, newer versi
31060 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74  ons of SQLite st
31070 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f  ill.      ** avo
31080 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73  id using the las
31090 74 20 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e  t six entries in
310a0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 74 72   the freelist tr
310b0 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20 69  unk page array i
310c0 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
310d0 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20 66   that database f
310e0 69 6c 65 73 20 63 72 65 61 74 65 64 20 62 79 20  iles created by 
310f0 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
31100 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a  f SQLite can be.
31110 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79        ** read by
31120 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
31130 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20  of SQLite..     
31140 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
31150 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31160 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
31170 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
31180 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31190 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
311a0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
311b0 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20  , nLeaf+1);.    
311c0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
311d0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c  runk->aData[8+nL
311e0 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a  eaf*4], iPage);.
311f0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
31200 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  e && (pBt->btsFl
31210 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
31220 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20  _DELETE)==0 ){. 
31230 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31240 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70  PagerDontWrite(p
31250 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
31260 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31270 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48    rc = btreeSetH
31280 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69  asContent(pBt, i
31290 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
312a0 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
312b0 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20  E-PAGE: %d leaf 
312c0 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64  on trunk page %d
312d0 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  \n",pPage->pgno,
312e0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
312f0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
31300 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
31310 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74   }..  /* If cont
31320 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69  rol flows to thi
31330 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74  s point, then it
31340 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c   was not possibl
31350 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a  e to add the.  *
31360 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  * the page being
31370 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66   freed as a leaf
31380 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72   page of the fir
31390 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20  st trunk in the 
313a0 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20  free-list..  ** 
313b0 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  Possibly because
313c0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
313d0 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73  s empty, or poss
313e0 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
313f0 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75   .  ** first tru
31400 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
31410 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74  ist is full. Eit
31420 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67  her way, the pag
31430 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20  e being freed.  
31440 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ** will become t
31450 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75  he new first tru
31460 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
31470 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  ree-list..  */. 
31480 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26   if( pPage==0 &&
31490 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
314a0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
314b0 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
314c0 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f  e, 0)) ){.    go
314d0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
314e0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
314f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
31500 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
31510 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31520 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  OK ){.    goto f
31530 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
31540 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67  .  put4byte(pPag
31550 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b  e->aData, iTrunk
31560 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
31570 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  Page->aData[4], 
31580 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  0);.  put4byte(&
31590 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
315a0 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41  ], iPage);.  TRA
315b0 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
315c0 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67  %d new trunk pag
315d0 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e  e replacing %d\n
315e0 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
315f0 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70  iTrunk));..freep
31600 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
31610 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
31620 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
31630 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
31640 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61  (pPage);.  relea
31650 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
31660 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
31670 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50  tatic void freeP
31680 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
31690 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ge, int *pRC){. 
316a0 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c   if( (*pRC)==SQL
316b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
316c0 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  RC = freePage2(p
316d0 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65  Page->pBt, pPage
316e0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
316f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
31700 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  e any overflow p
31710 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ages associated 
31720 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43  with the given C
31730 65 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65 0a  ell.  Write the.
31740 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69  ** local Cell si
31750 7a 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f  ze (the number o
31760 66 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6f  f bytes on the o
31770 72 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d  riginal page, om
31780 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c  itting.** overfl
31790 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65  ow) into *pnSize
317a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
317b0 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d  clearCell(.  Mem
317c0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
317d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
317e0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
317f0 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the Cell */.  un
31800 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
31810 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ll,    /* First 
31820 62 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c  byte of the Cell
31830 20 2a 2f 0a 20 20 75 31 36 20 2a 70 6e 53 69 7a   */.  u16 *pnSiz
31840 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e              /
31850 2a 20 57 72 69 74 65 20 74 68 65 20 73 69 7a 65  * Write the size
31860 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 68 65 72   of the Cell her
31870 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  e */.){.  BtShar
31880 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
31890 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  >pBt;.  CellInfo
318a0 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76   info;.  Pgno ov
318b0 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  flPgno;.  int rc
318c0 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20  ;.  int nOvfl;. 
318d0 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a   u32 ovflPageSiz
318e0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
318f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
31900 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
31910 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ex) );.  pPage->
31920 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
31930 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
31940 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66  .  *pnSize = inf
31950 6f 2e 6e 53 69 7a 65 3b 0a 20 20 69 66 28 20 69  o.nSize;.  if( i
31960 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30  nfo.iOverflow==0
31970 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
31980 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f  QLITE_OK;  /* No
31990 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
319a0 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
319b0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a  doing anything *
319c0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c  /.  }.  if( pCel
319d0 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l+info.iOverflow
319e0 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74  +3 > pPage->aDat
319f0 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67  a+pPage->maskPag
31a00 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
31a10 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
31a20 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78  KPT;  /* Cell ex
31a30 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f  tends past end o
31a40 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20  f page */.  }.  
31a50 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62  ovflPgno = get4b
31a60 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
31a70 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61  iOverflow]);.  a
31a80 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
31a90 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20  leSize > 4 );.  
31aa0 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70  ovflPageSize = p
31ab0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
31ac0 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69   4;.  nOvfl = (i
31ad0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69  nfo.nPayload - i
31ae0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66  nfo.nLocal + ovf
31af0 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f  lPageSize - 1)/o
31b00 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61  vflPageSize;.  a
31b10 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c  ssert( nOvfl>0 |
31b20 7c 20 0a 20 20 20 20 28 43 4f 52 52 55 50 54 5f  | .    (CORRUPT_
31b30 44 42 20 26 26 20 28 69 6e 66 6f 2e 6e 50 61 79  DB && (info.nPay
31b40 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67 65 53  load + ovflPageS
31b50 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a  ize)<ovflPageSiz
31b60 65 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28  e).  );.  while(
31b70 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20   nOvfl-- ){.    
31b80 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a  Pgno iNext = 0;.
31b90 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
31ba0 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  fl = 0;.    if( 
31bb0 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76  ovflPgno<2 || ov
31bc0 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  flPgno>btreePage
31bd0 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
31be0 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20      /* 0 is not 
31bf0 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  a legal page num
31c00 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63  ber and page 1 c
31c10 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20  annot be an .   
31c20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
31c30 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69  age. Therefore i
31c40 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20  f ovflPgno<2 or 
31c50 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
31c60 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  the .      ** fi
31c70 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  le the database 
31c80 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
31c90 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
31ca0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
31cb0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
31cc0 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20  if( nOvfl ){.   
31cd0 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
31ce0 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66  lowPage(pBt, ovf
31cf0 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26  lPgno, &pOvfl, &
31d00 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66  iNext);.      if
31d10 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
31d20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
31d30 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f   ( pOvfl || ((pO
31d40 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c  vfl = btreePageL
31d50 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50  ookup(pBt, ovflP
31d60 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20  gno))!=0) ).    
31d70 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
31d80 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76  PageRefcount(pOv
31d90 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a  fl->pDbPage)!=1.
31da0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
31db0 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73  There is no reas
31dc0 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68  on any cursor sh
31dd0 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74  ould have an out
31de0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
31df0 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ce .      ** to 
31e00 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
31e10 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20   belonging to a 
31e20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69  cell that is bei
31e30 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74  ng deleted/updat
31e40 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20  ed..      ** So 
31e50 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
31e60 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65  more than one re
31e70 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20  ference to this 
31e80 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20  page, then it . 
31e90 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74       ** must not
31ea0 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76   really be an ov
31eb0 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20  erflow page and 
31ec0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
31ed0 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20  t be corrupt. . 
31ee0 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65       ** It is he
31ef0 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20  lpful to detect 
31f00 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c  this before call
31f10 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c  ing freePage2(),
31f20 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72   as .      ** fr
31f30 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65  eePage2() may ze
31f40 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  ro the page cont
31f50 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64  ents if secure-d
31f60 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20  elete mode is.  
31f70 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20      ** enabled. 
31f80 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f  If this 'overflo
31f90 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  w' page happens 
31fa0 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61  to be a page tha
31fb0 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  t the.      ** c
31fc0 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69  aller is iterati
31fd0 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73  ng through or us
31fe0 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  ing in some othe
31ff0 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20  r way, this.    
32000 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62    ** can be prob
32010 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a  lematic..      *
32020 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
32030 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
32040 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
32050 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
32060 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76  2(pBt, pOvfl, ov
32070 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a  flPgno);.    }..
32080 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b      if( pOvfl ){
32090 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
320a0 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e  gerUnref(pOvfl->
320b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
320c0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
320d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c  urn rc;.    ovfl
320e0 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20  Pgno = iNext;.  
320f0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
32100 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
32110 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73  reate the byte s
32120 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20  equence used to 
32130 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c  represent a cell
32140 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a   on page pPage.*
32150 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  * and write that
32160 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69   byte sequence i
32170 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76  nto pCell[].  Ov
32180 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
32190 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  .** allocated an
321a0 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e  d filled in as n
321b0 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63  ecessary.  The c
321c0 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
321d0 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
321e0 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
321f0 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  re sufficient sp
32200 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  ace has been all
32210 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43  ocated.** for pC
32220 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ell[]..**.** Not
32230 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65  e that pCell doe
32240 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
32250 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  need to point to
32260 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
32270 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c  a.** area.  pCel
32280 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  l might point to
32290 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20   some temporary 
322a0 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65  storage.  The ce
322b0 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f  ll will.** be co
322c0 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69  nstructed in thi
322d0 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61  s temporary area
322e0 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74   then copied int
322f0 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  o pPage->aData.*
32300 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  * later..*/.stat
32310 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c  ic int fillInCel
32320 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
32330 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
32340 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
32350 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
32360 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e cell */.  unsi
32370 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
32380 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
32390 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
323a0 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e  he cell */.  con
323b0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  st void *pKey, i
323c0 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54  64 nKey,    /* T
323d0 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73  he key */.  cons
323e0 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e  t void *pData,in
323f0 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68  t nData,   /* Th
32400 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
32410 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20  nZero,          
32420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
32430 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74  tra zero bytes t
32440 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74  o append to pDat
32450 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69  a */.  int *pnSi
32460 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
32470 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
32480 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f  ell size here */
32490 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f  .){.  int nPaylo
324a0 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ad;.  const u8 *
324b0 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63  pSrc;.  int nSrc
324c0 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73  , n, rc;.  int s
324d0 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50  paceLeft;.  MemP
324e0 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
324f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65    MemPage *pToRe
32500 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73  lease = 0;.  uns
32510 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69  igned char *pPri
32520 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  or;.  unsigned c
32530 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20  har *pPayload;. 
32540 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
32550 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
32560 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30  gno pgnoOvfl = 0
32570 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b  ;.  int nHeader;
32580 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
32590 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
325a0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
325b0 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  ) );..  /* pPage
325c0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
325d0 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69  ily writeable si
325e0 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  nce pCell might 
325f0 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  be auxiliary.  *
32600 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74  * buffer space t
32610 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20  hat is separate 
32620 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62  from the pPage b
32630 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  uffer area */.  
32640 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50  assert( pCell<pP
32650 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43  age->aData || pC
32660 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ell>=&pPage->aDa
32670 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
32680 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
32690 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
326a0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
326b0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
326c0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65  * Fill in the he
326d0 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64  ader. */.  nHead
326e0 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c  er = pPage->chil
326f0 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79  dPtrSize;.  nPay
32700 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e  load = nData + n
32710 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67  Zero;.  if( pPag
32720 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b  e->intKeyLeaf ){
32730 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
32740 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  putVarint32(&pCe
32750 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61  ll[nHeader], nPa
32760 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  yload);.  }else{
32770 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 61  .    assert( nDa
32780 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ta==0 );.    ass
32790 65 72 74 28 20 6e 5a 65 72 6f 3d 3d 30 20 29 3b  ert( nZero==0 );
327a0 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b  .  }.  nHeader +
327b0 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
327c0 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75  ll[nHeader], *(u
327d0 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 0a 20  64*)&nKey);.  . 
327e0 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
327f0 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 2a 2f 0a  payload size */.
32800 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
32810 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20  Key ){.    pSrc 
32820 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72  = pData;.    nSr
32830 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e  c = nData;.    n
32840 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Data = 0;.  }els
32850 65 7b 20 0a 20 20 20 20 69 66 28 20 4e 45 56 45  e{ .    if( NEVE
32860 52 28 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66  R(nKey>0x7ffffff
32870 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20 29 7b  f || pKey==0) ){
32880 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
32890 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
328a0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  T;.    }.    nPa
328b0 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 6e 4b 65  yload = (int)nKe
328c0 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b  y;.    pSrc = pK
328d0 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28  ey;.    nSrc = (
328e0 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  int)nKey;.  }.  
328f0 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  if( nPayload<=pP
32900 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
32910 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72  .    n = nHeader
32920 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   + nPayload;.   
32930 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20   testcase( n==3 
32940 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
32950 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28   n==4 );.    if(
32960 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20   n<4 ) n = 4;.  
32970 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20    *pnSize = n;. 
32980 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e     spaceLeft = n
32990 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50 72  Payload;.    pPr
329a0 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d  ior = pCell;.  }
329b0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6e  else{.    int mn
329c0 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
329d0 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20 2b  al;.    n = mn +
329e0 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29   (nPayload - mn)
329f0 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
32a00 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
32a10 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
32a20 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
32a30 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
32a40 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  e( n==pPage->max
32a50 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
32a60 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61  f( n > pPage->ma
32a70 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b  xLocal ) n = mn;
32a80 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d  .    spaceLeft =
32a90 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20   n;.    *pnSize 
32aa0 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20  = n + nHeader + 
32ab0 34 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  4;.    pPrior = 
32ac0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e  &pCell[nHeader+n
32ad0 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f 61  ];.  }.  pPayloa
32ae0 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
32af0 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  er];..  /* At th
32b00 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c  is point variabl
32b10 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74  es should be set
32b20 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
32b30 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61  *.  **   nPayloa
32b40 64 20 20 20 20 20 20 20 20 20 20 20 54 6f 74 61  d           Tota
32b50 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69  l payload size i
32b60 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70  n bytes.  **   p
32b70 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20  Payload         
32b80 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20    Begin writing 
32b90 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a  payload here.  *
32ba0 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20 20 20  *   spaceLeft   
32bb0 20 20 20 20 20 20 20 53 70 61 63 65 20 61 76 61         Space ava
32bc0 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f  ilable at pPaylo
32bd0 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64  ad.  If nPayload
32be0 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a  >spaceLeft,.  **
32bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c00 20 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73        that means
32c10 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70   content must sp
32c20 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f  ill into overflo
32c30 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20  w pages..  **   
32c40 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
32c50 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c     Size of the l
32c60 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63  ocal cell (not c
32c70 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77  ounting overflow
32c80 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70   pages).  **   p
32c90 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20  Prior           
32ca0 20 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65    Where to write
32cb0 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65   the pgno of the
32cc0 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
32cd0 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55  page.  **.  ** U
32ce0 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72  se a call to btr
32cf0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
32d00 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
32d10 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65  the values above
32d20 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75  .  ** were compu
32d30 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ted correctly.. 
32d40 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44   */.#if SQLITE_D
32d50 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c  EBUG.  {.    Cel
32d60 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
32d70 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
32d80 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
32d90 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
32da0 72 74 28 20 6e 48 65 61 64 65 72 3d 28 69 6e 74  rt( nHeader=(int
32db0 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20  )(info.pPayload 
32dc0 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20  - pCell) );.    
32dd0 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
32de0 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61  y==nKey );.    a
32df0 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d  ssert( *pnSize =
32e00 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a  = info.nSize );.
32e10 20 20 20 20 61 73 73 65 72 74 28 20 73 70 61 63      assert( spac
32e20 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c  eLeft == info.nL
32e30 6f 63 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65  ocal );.    asse
32e40 72 74 28 20 70 50 72 69 6f 72 20 3d 3d 20 26 70  rt( pPrior == &p
32e50 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
32e60 6c 6f 77 5d 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  low] );.  }.#end
32e70 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  if..  /* Write t
32e80 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20  he payload into 
32e90 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61  the local Cell a
32ea0 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e 74  nd any extra int
32eb0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
32ec0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50 61   */.  while( nPa
32ed0 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69  yload>0 ){.    i
32ee0 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20  f( spaceLeft==0 
32ef0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
32f00 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
32f10 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  M.      Pgno pgn
32f20 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76  oPtrmap = pgnoOv
32f30 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  fl; /* Overflow 
32f40 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70  page pointer-map
32f50 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20   entry page */. 
32f60 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
32f70 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
32f80 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
32f90 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20    pgnoOvfl++;.  
32fa0 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a        } while( .
32fb0 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50            PTRMAP
32fc0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e  _ISPAGE(pBt, pgn
32fd0 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76  oOvfl) || pgnoOv
32fe0 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  fl==PENDING_BYTE
32ff0 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20  _PAGE(pBt) .    
33000 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23      );.      }.#
33010 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
33020 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
33030 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20  ge(pBt, &pOvfl, 
33040 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f  &pgnoOvfl, pgnoO
33050 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  vfl, 0);.#ifndef
33060 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
33070 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
33080 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
33090 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
330a0 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73  acuum, and the s
330b0 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75  econd or subsequ
330c0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ent.      ** ove
330d0 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65  rflow page is be
330e0 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  ing allocated, a
330f0 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
33100 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
33110 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74       ** for that
33120 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20   page now. .    
33130 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
33140 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
33150 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
33160 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70  , then write a p
33170 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20  artial entry .  
33180 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f      ** to the po
33190 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65  inter-map. If we
331a0 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74   write nothing t
331b0 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d  o this pointer-m
331c0 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a  ap slot,.      *
331d0 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d  * then the optim
331e0 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63  istic overflow c
331f0 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  hain processing 
33200 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20  in clearCell(). 
33210 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69       ** may misi
33220 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69  nterpret the uni
33230 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  nitialized value
33240 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  s and delete the
33250 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20  .      ** wrong 
33260 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64  pages from the d
33270 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
33280 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
33290 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72  >autoVacuum && r
332a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
332b0 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
332c0 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50   = (pgnoPtrmap?P
332d0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
332e0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
332f0 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
33300 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
33310 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
33320 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20  trmap, &rc);.   
33330 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
33340 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
33350 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
33360 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
33370 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
33380 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
33390 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
333a0 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  ease);.        r
333b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
333c0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
333d0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
333e0 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f   zero than pPrio
333f0 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  r points into th
33400 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
33410 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
33420 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
33430 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
33440 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
33450 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
33460 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
33470 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
33480 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
33490 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
334a0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72  .      /* If pPr
334b0 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 74  ior is part of t
334c0 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
334d0 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
334e0 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
334f0 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
33500 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  iteable */.     
33510 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c   assert( pPrior<
33520 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
33530 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e  pPrior>=&pPage->
33540 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
33550 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
33560 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
33570 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
33580 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
33590 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
335a0 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29  Prior, pgnoOvfl)
335b0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
335c0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
335d0 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73  .      pToReleas
335e0 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20  e = pOvfl;.     
335f0 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d   pPrior = pOvfl-
33600 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75  >aData;.      pu
33610 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30  t4byte(pPrior, 0
33620 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61  );.      pPayloa
33630 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74  d = &pOvfl->aDat
33640 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63  a[4];.      spac
33650 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61  eLeft = pBt->usa
33660 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
33670 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c   }.    n = nPayl
33680 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73  oad;.    if( n>s
33690 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73  paceLeft ) n = s
336a0 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f  paceLeft;..    /
336b0 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
336c0 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
336d0 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73   pPayload points
336e0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
336f0 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54  rea.    ** of pT
33700 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
33710 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
33720 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
33730 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
33740 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
33750 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
33760 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
33770 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
33780 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   );..    /* If p
33790 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20  Payload is part 
337a0 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
337b0 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
337c0 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
337d0 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
337e0 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
337f0 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61   assert( pPayloa
33800 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  d<pPage->aData |
33810 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61  | pPayload>=&pPa
33820 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
33830 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
33840 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
33850 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
33860 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
33870 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63  );..    if( nSrc
33880 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
33890 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72  n>nSrc ) n = nSr
338a0 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  c;.      assert(
338b0 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d   pSrc );.      m
338c0 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
338d0 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  pSrc, n);.    }e
338e0 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
338f0 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e  t(pPayload, 0, n
33900 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  );.    }.    nPa
33910 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20  yload -= n;.    
33920 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20  pPayload += n;. 
33930 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20     pSrc += n;.  
33940 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20    nSrc -= n;.   
33950 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b   spaceLeft -= n;
33960 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30  .    if( nSrc==0
33970 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d   ){.      nSrc =
33980 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53   nData;.      pS
33990 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
339a0 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  }.  }.  releaseP
339b0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
339c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
339d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
339e0 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65  move the i-th ce
339f0 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20  ll from pPage.  
33a00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66  This routine eff
33a10 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e  ects pPage only.
33a20 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e  .** The cell con
33a30 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65  tent is not free
33a40 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64  d or deallocated
33a50 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  .  It is assumed
33a60 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c   that.** the cel
33a70 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
33a80 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c  en copied somepl
33a90 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20  ace else.  This 
33aa0 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20  routine just.** 
33ab0 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65  removes the refe
33ac0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c  rence to the cel
33ad0 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a  l from pPage..**
33ae0 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65  .** "sz" must be
33af0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
33b00 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  ytes in the cell
33b10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
33b20 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67   dropCell(MemPag
33b30 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64  e *pPage, int id
33b40 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a  x, int sz, int *
33b50 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20  pRC){.  u32 pc; 
33b60 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
33b70 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
33b80 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20  t of cell being 
33b90 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20  deleted */.  u8 
33ba0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
33bb0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
33bc0 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
33bd0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76    /* Used to mov
33be0 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77  e bytes around w
33bf0 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ithin data[] */.
33c00 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
33c10 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
33c20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64  code */.  int hd
33c30 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67  r;        /* Beg
33c40 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65  inning of the he
33c50 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61  ader.  0 most pa
33c60 67 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31  ges.  100 page 1
33c70 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
33c80 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
33c90 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
33ca0 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
33cb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
33cc0 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63  RUPT_DB || sz==c
33cd0 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
33ce0 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
33cf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
33d00 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
33d10 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
33d20 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
33d30 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
33d40 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
33d50 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
33d60 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70  Data;.  ptr = &p
33d70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  Page->aCellIdx[2
33d80 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65  *idx];.  pc = ge
33d90 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68  t2byte(ptr);.  h
33da0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
33db0 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73  ffset;.  testcas
33dc0 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28  e( pc==get2byte(
33dd0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b  &data[hdr+5]) );
33de0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b  .  testcase( pc+
33df0 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  sz==pPage->pBt->
33e00 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
33e10 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67 65  if( pc < (u32)ge
33e20 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
33e30 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20  +5]) || pc+sz > 
33e40 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
33e50 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70  leSize ){.    *p
33e60 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
33e70 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
33e80 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  turn;.  }.  rc =
33e90 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
33ea0 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28  , pc, sz);.  if(
33eb0 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20   rc ){.    *pRC 
33ec0 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
33ed0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
33ee0 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50  Cell--;.  if( pP
33ef0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b  age->nCell==0 ){
33f00 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
33f10 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
33f20 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
33f30 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32 62 79   = 0;.    put2by
33f40 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
33f50 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
33f60 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50  bleSize);.    pP
33f70 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61  age->nFree = pPa
33f80 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
33f90 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68 64 72  ize - pPage->hdr
33fa0 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20 20 20  Offset.         
33fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 20                - 
33fc0 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
33fd0 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65  ize - 8;.  }else
33fe0 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74  {.    memmove(pt
33ff0 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61  r, ptr+2, 2*(pPa
34000 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29  ge->nCell - idx)
34010 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
34020 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
34030 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20  age->nCell);.   
34040 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
34050 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   2;.  }.}../*.**
34060 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
34070 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
34080 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
34090 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
340a0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
340b0 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
340c0 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
340d0 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
340e0 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
340f0 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
34100 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If it.** will no
34110 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65  t fit, then make
34120 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
34130 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ell content into
34140 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65   pTemp if.** pTe
34150 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20  mp is not null. 
34160 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70   Regardless of p
34170 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Temp, allocate a
34180 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e   new entry.** in
34190 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d   pPage->apOvfl[]
341a0 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69   and make it poi
341b0 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  nt to the cell c
341c0 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a  ontent (either.*
341d0 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68  * in pTemp or th
341e0 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c  e original pCell
341f0 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72  ) and also recor
34200 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a  d its index. .**
34210 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   Allocating a ne
34220 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65  w entry in pPage
34230 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65  ->aCell[] implie
34240 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65  s that .** pPage
34250 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69  ->nOverflow is i
34260 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 73  ncremented..*/.s
34270 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72  tatic void inser
34280 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
34290 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
342a0 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
342b0 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
342c0 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
342d0 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
342e0 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
342f0 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
34300 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
34310 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
34320 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
34330 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
34340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
34350 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
34360 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
34370 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
34380 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
34390 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
343a0 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50  if needed */.  P
343b0 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
343c0 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c   /* If non-zero,
343d0 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34   replace first 4
343e0 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73   bytes with this
343f0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
34400 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a  *pRC          /*
34410 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   Read and write 
34420 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  return code from
34430 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
34440 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20  t idx = 0;      
34450 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
34460 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
34470 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
34480 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
34490 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
344a0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64  ter */.  int end
344b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
344c0 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
344d0 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e  e last cell poin
344e0 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
344f0 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20  .  int ins;     
34500 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
34510 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65   data[] where ne
34520 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  w cell pointer i
34530 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20  s inserted */.  
34540 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
34550 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
34560 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
34570 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
34580 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
34590 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
345a0 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
345b0 70 61 67 65 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  page */..  if( *
345c0 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
345d0 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
345e0 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
345f0 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
34600 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  w );.  assert( M
34610 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
34620 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61  t)<=10921 );.  a
34630 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
34640 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
34650 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52  ge->pBt) || CORR
34660 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
34670 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
34680 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28  flow<=ArraySize(
34690 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29  pPage->apOvfl) )
346a0 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61  ;.  assert( Arra
346b0 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
346c0 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28  vfl)==ArraySize(
346d0 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29  pPage->aiOvfl) )
346e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
346f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
34700 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
34710 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65  ) );.  /* The ce
34720 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  ll should normal
34730 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72  ly be sized corr
34740 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c  ectly.  However,
34750 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20   when moving a. 
34760 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65   ** malformed ce
34770 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70  ll from a leaf p
34780 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69  age to an interi
34790 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20  or page, if the 
347a0 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77  cell size.  ** w
347b0 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73  anted to be less
347c0 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20   than 4 but got 
347d0 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
347e0 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65  on the leaf, the
347f0 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68  n size.  ** migh
34800 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38  t be less than 8
34810 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f   (leaf-size + po
34820 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e  inter) on the in
34830 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65  terior node.  He
34840 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72  nce.  ** the ter
34850 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69  m after the || i
34860 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
34870 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61  assert(). */.  a
34880 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61 67 65  ssert( sz==pPage
34890 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
348a0 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a  e, pCell) || (sz
348b0 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29  ==8 && iChild>0)
348c0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
348d0 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
348e0 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
348f0 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
34900 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
34910 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73  (pTemp, pCell, s
34920 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  z);.      pCell 
34930 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
34940 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
34950 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
34960 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a  pCell, iChild);.
34970 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
34980 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
34990 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
349a0 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61  (int)(sizeof(pPa
349b0 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69 7a 65  ge->apOvfl)/size
349c0 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  of(pPage->apOvfl
349d0 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61  [0])) );.    pPa
349e0 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20  ge->apOvfl[j] = 
349f0 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
34a00 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75  ->aiOvfl[j] = (u
34a10 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  16)i;..    /* Wh
34a20 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  en multiple over
34a30 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68 65  flows occur, the
34a40 79 20 61 72 65 20 61 6c 77 61 79 73 20 73 65 71  y are always seq
34a50 75 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a 20  uential and in. 
34a60 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72 64     ** sorted ord
34a70 65 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72 69  er.  This invari
34a80 61 6e 74 73 20 61 72 69 73 65 20 62 65 63 61 75  ants arise becau
34a90 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  se multiple over
34aa0 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a 2a  flows can.    **
34ab0 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65 6e   only occur when
34ac0 20 69 6e 73 65 72 74 69 6e 67 20 64 69 76 69 64   inserting divid
34ad0 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68  er cells into th
34ae0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 64 75  e parent page du
34af0 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61 6c 61  ring.    ** bala
34b00 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68 65 20 64  ncing, and the d
34b10 69 76 69 64 65 72 73 20 61 72 65 20 61 64 6a 61  ividers are adja
34b20 63 65 6e 74 20 61 6e 64 20 73 6f 72 74 65 64 2e  cent and sorted.
34b30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
34b40 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50 61 67  rt( j==0 || pPag
34b50 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c 28  e->aiOvfl[j-1]<(
34b60 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76 65 72  u16)i ); /* Over
34b70 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65 64 20  flows in sorted 
34b80 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 61 73 73  order */.    ass
34b90 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d 3d  ert( j==0 || i==
34ba0 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d  pPage->aiOvfl[j-
34bb0 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f 76 65  1]+1 );   /* Ove
34bc0 72 66 6c 6f 77 73 20 61 72 65 20 73 65 71 75 65  rflows are seque
34bd0 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65  ntial */.  }else
34be0 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
34bf0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
34c00 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
34c10 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
34c20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34c30 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
34c40 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
34c50 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
34c60 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
34c70 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
34c80 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
34c90 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
34ca0 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d      cellOffset =
34cb0 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
34cc0 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65  et;.    end = ce
34cd0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
34ce0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
34cf0 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  ns = cellOffset 
34d00 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20  + 2*i;.    rc = 
34d10 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50  allocateSpace(pP
34d20 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a  age, sz, &idx);.
34d30 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70      if( rc ){ *p
34d40 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b  RC = rc; return;
34d50 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c   }.    /* The al
34d60 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72 6f  locateSpace() ro
34d70 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73  utine guarantees
34d80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   the following p
34d90 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a 2a  roperties.    **
34da0 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20 73   if it returns s
34db0 75 63 63 65 73 73 66 75 6c 6c 79 20 2a 2f 0a 20  uccessfully */. 
34dc0 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e     assert( idx >
34dd0 3d 20 30 20 26 26 20 28 69 64 78 20 3e 3d 20 65  = 0 && (idx >= e
34de0 6e 64 2b 32 20 7c 7c 20 43 4f 52 52 55 50 54 5f  nd+2 || CORRUPT_
34df0 44 42 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  DB) );.    asser
34e00 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e  t( idx+sz <= (in
34e10 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
34e20 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
34e30 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a  pPage->nCell++;.
34e40 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
34e50 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a   -= (u16)(2 + sz
34e60 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
34e70 61 74 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c  ata[idx], pCell,
34e80 20 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 69 43   sz);.    if( iC
34e90 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
34ea0 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78  t4byte(&data[idx
34eb0 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  ], iChild);.    
34ec0 7d 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64  }.    memmove(&d
34ed0 61 74 61 5b 69 6e 73 2b 32 5d 2c 20 26 64 61 74  ata[ins+2], &dat
34ee0 61 5b 69 6e 73 5d 2c 20 65 6e 64 2d 69 6e 73 29  a[ins], end-ins)
34ef0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
34f00 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b  data[ins], idx);
34f10 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
34f20 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
34f30 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  fset+3], pPage->
34f40 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20  nCell);.#ifndef 
34f50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
34f60 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
34f70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  Page->pBt->autoV
34f80 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f  acuum ){.      /
34f90 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63  * The cell may c
34fa0 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  ontain a pointer
34fb0 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
34fc0 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69  page. If so, wri
34fd0 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
34fe0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76  entry for the ov
34ff0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f  erflow page into
35000 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
35010 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
35020 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
35030 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
35040 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pRC);.    }.#end
35050 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
35060 41 20 43 65 6c 6c 41 72 72 61 79 20 6f 62 6a 65  A CellArray obje
35070 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 61  ct contains a ca
35080 63 68 65 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  che of pointers 
35090 61 6e 64 20 73 69 7a 65 73 20 66 6f 72 20 61 0a  and sizes for a.
350a0 2a 2a 20 63 6f 6e 73 65 63 75 74 69 76 65 20 73  ** consecutive s
350b0 65 71 75 65 6e 63 65 20 6f 66 20 63 65 6c 6c 73  equence of cells
350c0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 68   that might be h
350d0 65 6c 64 20 6d 75 6c 74 69 70 6c 65 20 70 61 67  eld multiple pag
350e0 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  es..*/.typedef s
350f0 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79 20  truct CellArray 
35100 43 65 6c 6c 41 72 72 61 79 3b 0a 73 74 72 75 63  CellArray;.struc
35110 74 20 43 65 6c 6c 41 72 72 61 79 20 7b 0a 20 20  t CellArray {.  
35120 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
35130 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
35140 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
35150 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50  Cell[] */.  MemP
35160 61 67 65 20 2a 70 52 65 66 3b 20 20 20 20 20 20  age *pRef;      
35170 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65      /* Reference
35180 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
35190 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  apCell;         
351a0 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
351b0 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a  begin balanced *
351c0 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b  /.  u16 *szCell;
351d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
351e0 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  ocal size of all
351f0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
35200 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  [] */.};../*.** 
35210 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 65  Make sure the ce
35220 6c 6c 20 73 69 7a 65 73 20 61 74 20 69 64 78 2c  ll sizes at idx,
35230 20 69 64 78 2b 31 2c 20 2e 2e 2e 2c 20 69 64 78   idx+1, ..., idx
35240 2b 4e 2d 31 20 68 61 76 65 20 62 65 65 6e 0a 2a  +N-1 have been.*
35250 2a 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73  * computed..*/.s
35260 74 61 74 69 63 20 76 6f 69 64 20 70 6f 70 75 6c  tatic void popul
35270 61 74 65 43 65 6c 6c 43 61 63 68 65 28 43 65 6c  ateCellCache(Cel
35280 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 69  lArray *p, int i
35290 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73  dx, int N){.  as
352a0 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
352b0 69 64 78 2b 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c 20  idx+N<=p->nCell 
352c0 29 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 30 20  );.  while( N>0 
352d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
352e0 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 21 3d 30  ->apCell[idx]!=0
352f0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   );.    if( p->s
35300 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 30 20 29 7b  zCell[idx]==0 ){
35310 0a 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c  .      p->szCell
35320 5b 69 64 78 5d 20 3d 20 70 2d 3e 70 52 65 66 2d  [idx] = p->pRef-
35330 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52  >xCellSize(p->pR
35340 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64  ef, p->apCell[id
35350 78 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  x]);.    }else{.
35360 20 20 20 20 20 20 61 73 73 65 72 74 28 20 43 4f        assert( CO
35370 52 52 55 50 54 5f 44 42 20 7c 7c 0a 20 20 20 20  RRUPT_DB ||.    
35380 20 20 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 43            p->szC
35390 65 6c 6c 5b 69 64 78 5d 3d 3d 70 2d 3e 70 52 65  ell[idx]==p->pRe
353a0 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e  f->xCellSize(p->
353b0 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b  pRef, p->apCell[
353c0 69 64 78 5d 29 20 29 3b 0a 20 20 20 20 7d 0a 20  idx]) );.    }. 
353d0 20 20 20 69 64 78 2b 2b 3b 0a 20 20 20 20 4e 2d     idx++;.    N-
353e0 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  -;.  }.}../*.** 
353f0 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
35400 6f 66 20 74 68 65 20 4e 74 68 20 65 6c 65 6d 65  of the Nth eleme
35410 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61  nt of the cell a
35420 72 72 61 79 0a 2a 2f 0a 73 74 61 74 69 63 20 53  rray.*/.static S
35430 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 75  QLITE_NOINLINE u
35440 31 36 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69  16 computeCellSi
35450 7a 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c  ze(CellArray *p,
35460 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72   int N){.  asser
35470 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e  t( N>=0 && N<p->
35480 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
35490 74 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3d  t( p->szCell[N]=
354a0 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 7a 43 65 6c  =0 );.  p->szCel
354b0 6c 5b 4e 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e  l[N] = p->pRef->
354c0 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65  xCellSize(p->pRe
354d0 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 4e 5d 29  f, p->apCell[N])
354e0 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a  ;.  return p->sz
354f0 43 65 6c 6c 5b 4e 5d 3b 0a 7d 0a 73 74 61 74 69  Cell[N];.}.stati
35500 63 20 75 31 36 20 63 61 63 68 65 64 43 65 6c 6c  c u16 cachedCell
35510 53 69 7a 65 28 43 65 6c 6c 41 72 72 61 79 20 2a  Size(CellArray *
35520 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73  p, int N){.  ass
35530 65 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70  ert( N>=0 && N<p
35540 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
35550 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 29 20   p->szCell[N] ) 
35560 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c  return p->szCell
35570 5b 4e 5d 3b 0a 20 20 72 65 74 75 72 6e 20 63 6f  [N];.  return co
35580 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 70 2c  mputeCellSize(p,
35590 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72   N);.}../*.** Ar
355a0 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e  ray apCell[] con
355b0 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74  tains pointers t
355c0 6f 20 6e 43 65 6c 6c 20 62 2d 74 72 65 65 20 70  o nCell b-tree p
355d0 61 67 65 20 63 65 6c 6c 73 2e 20 54 68 65 20 0a  age cells. The .
355e0 2a 2a 20 73 7a 43 65 6c 6c 5b 5d 20 61 72 72 61  ** szCell[] arra
355f0 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  y contains the s
35600 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
35610 65 61 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20  each cell. This 
35620 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c  function.** repl
35630 61 63 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  aces the current
35640 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67   contents of pag
35650 65 20 70 50 67 20 77 69 74 68 20 74 68 65 20 63  e pPg with the c
35660 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
35670 65 6c 6c 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a  ell.** array..**
35680 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20 74 68 65 20  .** Some of the 
35690 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
356a0 5d 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20  ] may currently 
356b0 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 67  be stored in pPg
356c0 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
356d0 6f 6e 20 77 6f 72 6b 73 20 61 72 6f 75 6e 64 20  on works around 
356e0 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20  problems caused 
356f0 62 79 20 74 68 69 73 20 62 79 20 6d 61 6b 69 6e  by this by makin
35700 67 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 79 20  g a copy of any 
35710 0a 2a 2a 20 73 75 63 68 20 63 65 6c 6c 73 20 62  .** such cells b
35720 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e  efore overwritin
35730 67 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  g the page data.
35740 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4d 65 6d 50 61  .**.** The MemPa
35750 67 65 2e 6e 46 72 65 65 20 66 69 65 6c 64 20 69  ge.nFree field i
35760 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79  s invalidated by
35770 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
35780 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
35790 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
357a0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65  the caller to se
357b0 74 20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a  t it correctly..
357c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
357d0 62 75 69 6c 64 50 61 67 65 28 0a 20 20 4d 65 6d  buildPage(.  Mem
357e0 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20  Page *pPg,      
357f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35800 45 64 69 74 20 74 68 69 73 20 70 61 67 65 20 2a  Edit this page *
35810 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
35820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35830 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d      /* Final num
35840 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
35850 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
35860 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
35870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
35880 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20  ay of cells */. 
35890 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20   u16 *szCell    
358a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358b0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
358c0 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20  l sizes */.){.  
358d0 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
358e0 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  pPg->hdrOffset; 
358f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
35900 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20  et of header on 
35910 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  pPg */.  u8 * co
35920 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d  nst aData = pPg-
35930 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  >aData;         
35940 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
35950 64 61 74 61 20 66 6f 72 20 70 50 67 20 2a 2f 0a  data for pPg */.
35960 20 20 63 6f 6e 73 74 20 69 6e 74 20 75 73 61 62    const int usab
35970 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42  leSize = pPg->pB
35980 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
35990 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64   u8 * const pEnd
359a0 20 3d 20 26 61 44 61 74 61 5b 75 73 61 62 6c 65   = &aData[usable
359b0 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a  Size];.  int i;.
359c0 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 20 3d    u8 *pCellptr =
359d0 20 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a   pPg->aCellIdx;.
359e0 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c    u8 *pTmp = sql
359f0 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
35a00 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61  ce(pPg->pBt->pPa
35a10 67 65 72 29 3b 0a 20 20 75 38 20 2a 70 44 61 74  ger);.  u8 *pDat
35a20 61 3b 0a 0a 20 20 69 20 3d 20 67 65 74 32 62 79  a;..  i = get2by
35a30 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d  te(&aData[hdr+5]
35a40 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 54 6d  );.  memcpy(&pTm
35a50 70 5b 69 5d 2c 20 26 61 44 61 74 61 5b 69 5d 2c  p[i], &aData[i],
35a60 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 69 29   usableSize - i)
35a70 3b 0a 0a 20 20 70 44 61 74 61 20 3d 20 70 45 6e  ;..  pData = pEn
35a80 64 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  d;.  for(i=0; i<
35a90 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
35aa0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43   u8 *pCell = apC
35ab0 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ell[i];.    if( 
35ac0 70 43 65 6c 6c 3e 61 44 61 74 61 20 26 26 20 70  pCell>aData && p
35ad0 43 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20 20  Cell<pEnd ){.   
35ae0 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70     pCell = &pTmp
35af0 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b  [pCell - aData];
35b00 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 61 74 61  .    }.    pData
35b10 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20   -= szCell[i];. 
35b20 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c     put2byte(pCel
35b30 6c 70 74 72 2c 20 28 70 44 61 74 61 20 2d 20 61  lptr, (pData - a
35b40 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c  Data));.    pCel
35b50 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 69  lptr += 2;.    i
35b60 66 28 20 70 44 61 74 61 20 3c 20 70 43 65 6c 6c  f( pData < pCell
35b70 70 74 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ptr ) return SQL
35b80 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
35b90 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
35ba0 74 61 2c 20 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  ta, pCell, szCel
35bb0 6c 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  l[i]);.    asser
35bc0 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d 70 50  t( szCell[i]==pP
35bd0 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67  g->xCellSize(pPg
35be0 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52  , pCell) || CORR
35bf0 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 74 65  UPT_DB );.    te
35c00 73 74 63 61 73 65 28 20 73 7a 43 65 6c 6c 5b 69  stcase( szCell[i
35c10 5d 21 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a  ]!=pPg->xCellSiz
35c20 65 28 70 50 67 2c 70 43 65 6c 6c 29 20 29 3b 0a  e(pPg,pCell) );.
35c30 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70 50    }..  /* The pP
35c40 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69  g->nFree field i
35c50 73 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72 72  s now set incorr
35c60 65 63 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65  ectly. The calle
35c70 72 20 77 69 6c 6c 20 66 69 78 20 69 74 2e 20 2a  r will fix it. *
35c80 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d  /.  pPg->nCell =
35c90 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e   nCell;.  pPg->n
35ca0 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20  Overflow = 0;.. 
35cb0 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
35cc0 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20 70  [hdr+1], 0);.  p
35cd0 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  ut2byte(&aData[h
35ce0 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c  dr+3], pPg->nCel
35cf0 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  l);.  put2byte(&
35d00 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44  aData[hdr+5], pD
35d10 61 74 61 20 2d 20 61 44 61 74 61 29 3b 0a 20 20  ata - aData);.  
35d20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30  aData[hdr+7] = 0
35d30 78 30 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  x00;.  return SQ
35d40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
35d50 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d  * Array apCell[]
35d60 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20   contains nCell 
35d70 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72  pointers to b-tr
35d80 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20  ee cells. Array 
35d90 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69  szCell.** contai
35da0 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62  ns the size in b
35db0 79 74 65 73 20 6f 66 20 65 61 63 68 20 73 75 63  ytes of each suc
35dc0 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  h cell. This fun
35dd0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
35de0 6f 20 0a 2a 2a 20 61 64 64 20 74 68 65 20 63 65  o .** add the ce
35df0 6c 6c 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  lls stored in th
35e00 65 20 61 72 72 61 79 20 74 6f 20 70 61 67 65 20  e array to page 
35e10 70 50 67 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f  pPg. If it canno
35e20 74 20 28 62 65 63 61 75 73 65 20 0a 2a 2a 20 74  t (because .** t
35e30 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
35e40 20 62 65 20 64 65 66 72 61 67 6d 65 6e 74 65 64   be defragmented
35e50 20 62 65 66 6f 72 65 20 74 68 65 20 63 65 6c 6c   before the cell
35e60 73 20 77 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e  s will fit), non
35e70 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75  -zero.** is retu
35e80 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
35e90 20 69 66 20 74 68 65 20 63 65 6c 6c 73 20 61 72   if the cells ar
35ea0 65 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  e added successf
35eb0 75 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a  ully, zero is.**
35ec0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
35ed0 20 41 72 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70   Argument pCellp
35ee0 74 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  tr points to the
35ef0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
35f00 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72  the cell-pointer
35f10 20 61 72 72 61 79 0a 2a 2a 20 28 70 61 72 74 20   array.** (part 
35f20 6f 66 20 70 61 67 65 20 70 50 67 29 20 74 6f 20  of page pPg) to 
35f30 70 6f 70 75 6c 61 74 65 2e 20 41 66 74 65 72 20  populate. After 
35f40 63 65 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d 20 69  cell apCell[0] i
35f50 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
35f60 0a 2a 2a 20 70 61 67 65 20 62 6f 64 79 2c 20 61  .** page body, a
35f70 20 31 36 2d 62 69 74 20 6f 66 66 73 65 74 20 69   16-bit offset i
35f80 73 20 77 72 69 74 74 65 6e 20 74 6f 20 70 43 65  s written to pCe
35f90 6c 6c 70 74 72 2e 20 41 6e 64 20 73 6f 20 6f 6e  llptr. And so on
35fa0 2c 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 65  , for each.** ce
35fb0 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  ll in the array.
35fc0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
35fd0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
35fe0 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72   caller to ensur
35ff0 65 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20  e.** that it is 
36000 73 61 66 65 20 74 6f 20 6f 76 65 72 77 72 69 74  safe to overwrit
36010 65 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74  e this part of t
36020 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  he cell-pointer 
36030 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  array..**.** Whe
36040 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
36050 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70 44 61  is called, *ppDa
36060 74 61 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ta points to the
36070 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 0a 2a   start of the .*
36080 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 6f  * content area o
36090 6e 20 70 61 67 65 20 70 50 67 2e 20 49 66 20 74  n page pPg. If t
360a0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63  he size of the c
360b0 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20 65  ontent area is e
360c0 78 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70 44  xtended,.** *ppD
360d0 61 74 61 20 69 73 20 75 70 64 61 74 65 64 20 74  ata is updated t
360e0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
360f0 65 77 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ew start of the 
36100 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20  content area.** 
36110 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
36120 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c  ..**.** Finally,
36130 20 61 72 67 75 6d 65 6e 74 20 70 42 65 67 69 6e   argument pBegin
36140 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
36150 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  yte immediately 
36160 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a  following the.**
36170 20 65 6e 64 20 6f 66 20 74 68 65 20 73 70 61 63   end of the spac
36180 65 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  e required by th
36190 69 73 20 70 61 67 65 20 66 6f 72 20 74 68 65 20  is page for the 
361a0 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65  cell-pointer are
361b0 61 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65  a (for.** all ce
361c0 6c 6c 73 20 2d 20 6e 6f 74 20 6a 75 73 74 20 74  lls - not just t
361d0 68 6f 73 65 20 69 6e 73 65 72 74 65 64 20 62 79  hose inserted by
361e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c   the current cal
361f0 6c 29 2e 20 49 66 20 74 68 65 20 63 6f 6e 74 65  l). If the conte
36200 6e 74 0a 2a 2a 20 61 72 65 61 20 6d 75 73 74 20  nt.** area must 
36210 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20 62  be extended to b
36220 65 66 6f 72 65 20 74 68 69 73 20 70 6f 69 6e 74  efore this point
36230 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 63 63   in order to acc
36240 6f 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a 20 63  omodate all.** c
36250 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
36260 2c 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 73  , then the cells
36270 20 64 6f 20 6e 6f 74 20 66 69 74 20 61 6e 64 20   do not fit and 
36280 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
36290 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
362a0 69 6e 74 20 70 61 67 65 49 6e 73 65 72 74 41 72  int pageInsertAr
362b0 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ray(.  MemPage *
362c0 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  pPg,            
362d0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
362e0 6f 20 61 64 64 20 63 65 6c 6c 73 20 74 6f 20 2a  o add cells to *
362f0 2f 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 2c 20  /.  u8 *pBegin, 
36300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36310 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 63 65      /* End of ce
36320 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
36330 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 44 61 74   */.  u8 **ppDat
36340 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
36350 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
36360 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2d 61   Page content -a
36370 72 65 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  rea pointer */. 
36380 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 2c 20 20   u8 *pCellptr,  
36390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
363a0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
363b0 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61  ell-pointer area
363c0 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
363d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
363e0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
363f0 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20  f first cell to 
36400 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  add */.  int nCe
36410 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
36420 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
36430 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  er of cells to a
36440 64 64 20 74 6f 20 70 50 67 20 2a 2f 0a 20 20 43  dd to pPg */.  C
36450 65 6c 6c 41 72 72 61 79 20 2a 70 43 41 72 72 61  ellArray *pCArra
36460 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y              /
36470 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73  * Array of cells
36480 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
36490 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70 50    u8 *aData = pP
364a0 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a  g->aData;.  u8 *
364b0 70 44 61 74 61 20 3d 20 2a 70 70 44 61 74 61 3b  pData = *ppData;
364c0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62 46 72  .  const int bFr
364d0 65 65 6c 69 73 74 20 3d 20 61 44 61 74 61 5b 31  eelist = aData[1
364e0 5d 20 7c 7c 20 61 44 61 74 61 5b 32 5d 3b 0a 20  ] || aData[2];. 
364f0 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 46 69 72   int iEnd = iFir
36500 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20 61 73  st + nCell;.  as
36510 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
36520 20 7c 7c 20 70 50 67 2d 3e 68 64 72 4f 66 66 73   || pPg->hdrOffs
36530 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e  et==0 );    /* N
36540 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 70  ever called on p
36550 61 67 65 20 31 20 2a 2f 0a 20 20 66 6f 72 28 69  age 1 */.  for(i
36560 3d 69 46 69 72 73 74 3b 20 69 3c 69 45 6e 64 3b  =iFirst; i<iEnd;
36570 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 73   i++){.    int s
36580 7a 2c 20 72 63 3b 0a 20 20 20 20 75 38 20 2a 70  z, rc;.    u8 *p
36590 53 6c 6f 74 3b 0a 20 20 20 20 73 7a 20 3d 20 63  Slot;.    sz = c
365a0 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 70 43  achedCellSize(pC
365b0 41 72 72 61 79 2c 20 69 29 3b 0a 20 20 20 20 69  Array, i);.    i
365c0 66 28 20 62 46 72 65 65 6c 69 73 74 3d 3d 30 20  f( bFreelist==0 
365d0 7c 7c 20 28 70 53 6c 6f 74 20 3d 20 70 61 67 65  || (pSlot = page
365e0 46 69 6e 64 53 6c 6f 74 28 70 50 67 2c 20 73 7a  FindSlot(pPg, sz
365f0 2c 20 26 72 63 2c 20 30 29 29 3d 3d 30 20 29 7b  , &rc, 0))==0 ){
36600 0a 20 20 20 20 20 20 70 44 61 74 61 20 2d 3d 20  .      pData -= 
36610 73 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  sz;.      if( pD
36620 61 74 61 3c 70 42 65 67 69 6e 20 29 20 72 65 74  ata<pBegin ) ret
36630 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 70 53 6c  urn 1;.      pSl
36640 6f 74 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  ot = pData;.    
36650 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 53 6c  }.    memcpy(pSl
36660 6f 74 2c 20 70 43 41 72 72 61 79 2d 3e 61 70 43  ot, pCArray->apC
36670 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20  ell[i], sz);.   
36680 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70   put2byte(pCellp
36690 74 72 2c 20 28 70 53 6c 6f 74 20 2d 20 61 44 61  tr, (pSlot - aDa
366a0 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70  ta));.    pCellp
366b0 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 2a  tr += 2;.  }.  *
366c0 70 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a  ppData = pData;.
366d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
366e0 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c  *.** Array apCel
366f0 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65  l[] contains nCe
36700 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62  ll pointers to b
36710 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72  -tree cells. Arr
36720 61 79 20 73 7a 43 65 6c 6c 20 0a 2a 2a 20 63 6f  ay szCell .** co
36730 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
36740 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68  in bytes of each
36750 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73   such cell. This
36760 20 66 75 6e 63 74 69 6f 6e 20 61 64 64 73 20 74   function adds t
36770 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 73 73 6f  he.** space asso
36780 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
36790 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72   cell in the arr
367a0 61 79 20 74 68 61 74 20 69 73 20 63 75 72 72 65  ay that is curre
367b0 6e 74 6c 79 20 73 74 6f 72 65 64 20 0a 2a 2a 20  ntly stored .** 
367c0 77 69 74 68 69 6e 20 74 68 65 20 62 6f 64 79 20  within the body 
367d0 6f 66 20 70 50 67 20 74 6f 20 74 68 65 20 70 50  of pPg to the pP
367e0 67 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 65  g free-list. The
367f0 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 73 20 61   cell-pointers a
36800 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 66 69 65 6c  nd other.** fiel
36810 64 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  ds of the page a
36820 72 65 20 6e 6f 74 20 75 70 64 61 74 65 64 2e 0a  re not updated..
36830 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
36840 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
36850 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
36860 63 65 6c 6c 73 20 61 64 64 65 64 20 74 6f 20 74  cells added to t
36870 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2f  he free-list..*/
36880 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
36890 46 72 65 65 41 72 72 61 79 28 0a 20 20 4d 65 6d  FreeArray(.  Mem
368a0 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20  Page *pPg,      
368b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
368c0 50 61 67 65 20 74 6f 20 65 64 69 74 20 2a 2f 0a  Page to edit */.
368d0 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20    int iFirst,   
368e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
368f0 20 20 2f 2a 20 46 69 72 73 74 20 63 65 6c 6c 20    /* First cell 
36900 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
36910 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
36920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36930 2a 20 43 65 6c 6c 73 20 74 6f 20 64 65 6c 65 74  * Cells to delet
36940 65 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79  e */.  CellArray
36950 20 2a 70 43 41 72 72 61 79 20 20 20 20 20 20 20   *pCArray       
36960 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
36970 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20  of cells */.){. 
36980 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
36990 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
369a0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e    u8 * const pEn
369b0 64 20 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e  d = &aData[pPg->
369c0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
369d0 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70  ;.  u8 * const p
369e0 53 74 61 72 74 20 3d 20 26 61 44 61 74 61 5b 70  Start = &aData[p
369f0 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20  Pg->hdrOffset + 
36a00 38 20 2b 20 70 50 67 2d 3e 63 68 69 6c 64 50 74  8 + pPg->childPt
36a10 72 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 6e 52  rSize];.  int nR
36a20 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  et = 0;.  int i;
36a30 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 46  .  int iEnd = iF
36a40 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20  irst + nCell;.  
36a50 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 20  u8 *pFree = 0;. 
36a60 20 69 6e 74 20 73 7a 46 72 65 65 20 3d 20 30 3b   int szFree = 0;
36a70 0a 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74  ..  for(i=iFirst
36a80 3b 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a  ; i<iEnd; i++){.
36a90 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
36aa0 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b  pCArray->apCell[
36ab0 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 65 6c  i];.    if( pCel
36ac0 6c 3e 3d 70 53 74 61 72 74 20 26 26 20 70 43 65  l>=pStart && pCe
36ad0 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  ll<pEnd ){.     
36ae0 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 2f   int sz;.      /
36af0 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 75 73 65  * No need to use
36b00 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28   cachedCellSize(
36b10 29 20 68 65 72 65 2e 20 20 54 68 65 20 73 69 7a  ) here.  The siz
36b20 65 73 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  es of all cells 
36b30 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 61 72  that.      ** ar
36b40 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 68 61  e to be freed ha
36b50 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
36b60 63 6f 6d 70 75 74 69 6e 67 20 77 68 69 6c 65 20  computing while 
36b70 64 65 63 69 64 69 6e 67 20 77 68 69 63 68 0a 20  deciding which. 
36b80 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 6e 65       ** cells ne
36b90 65 64 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20 20  ed freeing */.  
36ba0 20 20 20 20 73 7a 20 3d 20 70 43 41 72 72 61 79      sz = pCArray
36bb0 2d 3e 73 7a 43 65 6c 6c 5b 69 5d 3b 20 20 61 73  ->szCell[i];  as
36bc0 73 65 72 74 28 20 73 7a 3e 30 20 29 3b 0a 20 20  sert( sz>0 );.  
36bd0 20 20 20 20 69 66 28 20 70 46 72 65 65 21 3d 28      if( pFree!=(
36be0 70 43 65 6c 6c 20 2b 20 73 7a 29 20 29 7b 0a 20  pCell + sz) ){. 
36bf0 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65 65         if( pFree
36c00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
36c10 73 65 72 74 28 20 70 46 72 65 65 3e 61 44 61 74  sert( pFree>aDat
36c20 61 20 26 26 20 28 70 46 72 65 65 20 2d 20 61 44  a && (pFree - aD
36c30 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20  ata)<65536 );.  
36c40 20 20 20 20 20 20 20 20 66 72 65 65 53 70 61 63          freeSpac
36c50 65 28 70 50 67 2c 20 28 75 31 36 29 28 70 46 72  e(pPg, (u16)(pFr
36c60 65 65 20 2d 20 61 44 61 74 61 29 2c 20 73 7a 46  ee - aData), szF
36c70 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ree);.        }.
36c80 20 20 20 20 20 20 20 20 70 46 72 65 65 20 3d 20          pFree = 
36c90 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 73  pCell;.        s
36ca0 7a 46 72 65 65 20 3d 20 73 7a 3b 0a 20 20 20 20  zFree = sz;.    
36cb0 20 20 20 20 69 66 28 20 70 46 72 65 65 2b 73 7a      if( pFree+sz
36cc0 3e 70 45 6e 64 20 29 20 72 65 74 75 72 6e 20 30  >pEnd ) return 0
36cd0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
36ce0 20 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 70         pFree = p
36cf0 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 73 7a  Cell;.        sz
36d00 46 72 65 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  Free += sz;.    
36d10 20 20 7d 0a 20 20 20 20 20 20 6e 52 65 74 2b 2b    }.      nRet++
36d20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
36d30 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 61  ( pFree ){.    a
36d40 73 73 65 72 74 28 20 70 46 72 65 65 3e 61 44 61  ssert( pFree>aDa
36d50 74 61 20 26 26 20 28 70 46 72 65 65 20 2d 20 61  ta && (pFree - a
36d60 44 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20  Data)<65536 );. 
36d70 20 20 20 66 72 65 65 53 70 61 63 65 28 70 50 67     freeSpace(pPg
36d80 2c 20 28 75 31 36 29 28 70 46 72 65 65 20 2d 20  , (u16)(pFree - 
36d90 61 44 61 74 61 29 2c 20 73 7a 46 72 65 65 29 3b  aData), szFree);
36da0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52  .  }.  return nR
36db0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 61 70 43  et;.}../*.** apC
36dc0 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c  ell[] and szCell
36dd0 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e  [] contains poin
36de0 74 65 72 73 20 74 6f 20 61 6e 64 20 73 69 7a 65  ters to and size
36df0 73 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69  s of all cells i
36e00 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 73 20 62  n the.** pages b
36e10 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 2e 20 20  eing balanced.  
36e20 54 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  The current page
36e30 2c 20 70 50 67 2c 20 68 61 73 20 70 50 67 2d 3e  , pPg, has pPg->
36e40 6e 43 65 6c 6c 20 63 65 6c 6c 73 20 73 74 61 72  nCell cells star
36e50 74 69 6e 67 0a 2a 2a 20 77 69 74 68 20 61 70 43  ting.** with apC
36e60 65 6c 6c 5b 69 4f 6c 64 5d 2e 20 20 41 66 74 65  ell[iOld].  Afte
36e70 72 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 69  r balancing, thi
36e80 73 20 70 61 67 65 20 73 68 6f 75 6c 64 20 68 6f  s page should ho
36e90 6c 64 20 6e 4e 65 77 20 63 65 6c 6c 73 0a 2a 2a  ld nNew cells.**
36ea0 20 73 74 61 72 74 69 6e 67 20 61 74 20 61 70 43   starting at apC
36eb0 65 6c 6c 5b 69 4e 65 77 5d 2e 0a 2a 2a 0a 2a 2a  ell[iNew]..**.**
36ec0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
36ed0 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
36ee0 79 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f  y adjustments to
36ef0 20 70 50 67 20 73 6f 20 74 68 61 74 20 69 74 20   pPg so that it 
36f00 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20  contains.** the 
36f10 63 6f 72 72 65 63 74 20 63 65 6c 6c 73 20 61 66  correct cells af
36f20 74 65 72 20 62 65 69 6e 67 20 62 61 6c 61 6e 63  ter being balanc
36f30 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50  ed..**.** The pP
36f40 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69  g->nFree field i
36f50 73 20 69 6e 76 61 6c 69 64 20 77 68 65 6e 20 74  s invalid when t
36f60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
36f70 75 72 6e 73 2e 20 49 74 20 69 73 20 74 68 65 0a  urns. It is the.
36f80 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
36f90 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
36fa0 74 6f 20 73 65 74 20 69 74 20 63 6f 72 72 65 63  to set it correc
36fb0 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tly..*/.static i
36fc0 6e 74 20 65 64 69 74 50 61 67 65 28 0a 20 20 4d  nt editPage(.  M
36fd0 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20  emPage *pPg,    
36fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36ff0 2a 20 45 64 69 74 20 74 68 69 73 20 70 61 67 65  * Edit this page
37000 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 6c 64 2c 20   */.  int iOld, 
37010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37020 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
37030 66 20 66 69 72 73 74 20 63 65 6c 6c 20 63 75 72  f first cell cur
37040 72 65 6e 74 6c 79 20 6f 6e 20 70 61 67 65 20 2a  rently on page *
37050 2f 0a 20 20 69 6e 74 20 69 4e 65 77 2c 20 20 20  /.  int iNew,   
37060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37070 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
37080 6e 65 77 20 66 69 72 73 74 20 63 65 6c 6c 20 6f  new first cell o
37090 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  n page */.  int 
370a0 6e 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20 20  nNew,           
370b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
370c0 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63  inal number of c
370d0 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a  ells on page */.
370e0 20 20 43 65 6c 6c 41 72 72 61 79 20 2a 70 43 41    CellArray *pCA
370f0 72 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20  rray            
37100 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
37110 6c 6c 73 20 61 6e 64 20 73 69 7a 65 73 20 2a 2f  lls and sizes */
37120 0a 29 7b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  .){.  u8 * const
37130 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
37140 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  ata;.  const int
37150 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f   hdr = pPg->hdrO
37160 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 70 42 65  ffset;.  u8 *pBe
37170 67 69 6e 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c  gin = &pPg->aCel
37180 6c 49 64 78 5b 6e 4e 65 77 20 2a 20 32 5d 3b 0a  lIdx[nNew * 2];.
37190 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 50    int nCell = pP
371a0 67 2d 3e 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  g->nCell;       
371b0 2f 2a 20 43 65 6c 6c 73 20 73 74 6f 72 65 64 20  /* Cells stored 
371c0 6f 6e 20 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a  on pPg */.  u8 *
371d0 70 44 61 74 61 3b 0a 20 20 75 38 20 2a 70 43 65  pData;.  u8 *pCe
371e0 6c 6c 70 74 72 3b 0a 20 20 69 6e 74 20 69 3b 0a  llptr;.  int i;.
371f0 20 20 69 6e 74 20 69 4f 6c 64 45 6e 64 20 3d 20    int iOldEnd = 
37200 69 4f 6c 64 20 2b 20 70 50 67 2d 3e 6e 43 65 6c  iOld + pPg->nCel
37210 6c 20 2b 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c  l + pPg->nOverfl
37220 6f 77 3b 0a 20 20 69 6e 74 20 69 4e 65 77 45 6e  ow;.  int iNewEn
37230 64 20 3d 20 69 4e 65 77 20 2b 20 6e 4e 65 77 3b  d = iNew + nNew;
37240 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
37250 44 45 42 55 47 0a 20 20 75 38 20 2a 70 54 6d 70  DEBUG.  u8 *pTmp
37260 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
37270 65 6d 70 53 70 61 63 65 28 70 50 67 2d 3e 70 42  empSpace(pPg->pB
37280 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 6d 65  t->pPager);.  me
37290 6d 63 70 79 28 70 54 6d 70 2c 20 61 44 61 74 61  mcpy(pTmp, aData
372a0 2c 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  , pPg->pBt->usab
372b0 6c 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  leSize);.#endif.
372c0 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 65 6c  .  /* Remove cel
372d0 6c 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  ls from the star
372e0 74 20 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65  t and end of the
372f0 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 69   page */.  if( i
37300 4f 6c 64 3c 69 4e 65 77 20 29 7b 0a 20 20 20 20  Old<iNew ){.    
37310 69 6e 74 20 6e 53 68 69 66 74 20 3d 20 70 61 67  int nShift = pag
37320 65 46 72 65 65 41 72 72 61 79 28 70 50 67 2c 20  eFreeArray(pPg, 
37330 69 4f 6c 64 2c 20 69 4e 65 77 2d 69 4f 6c 64 2c  iOld, iNew-iOld,
37340 20 70 43 41 72 72 61 79 29 3b 0a 20 20 20 20 6d   pCArray);.    m
37350 65 6d 6d 6f 76 65 28 70 50 67 2d 3e 61 43 65 6c  emmove(pPg->aCel
37360 6c 49 64 78 2c 20 26 70 50 67 2d 3e 61 43 65 6c  lIdx, &pPg->aCel
37370 6c 49 64 78 5b 6e 53 68 69 66 74 2a 32 5d 2c 20  lIdx[nShift*2], 
37380 6e 43 65 6c 6c 2a 32 29 3b 0a 20 20 20 20 6e 43  nCell*2);.    nC
37390 65 6c 6c 20 2d 3d 20 6e 53 68 69 66 74 3b 0a 20  ell -= nShift;. 
373a0 20 7d 0a 20 20 69 66 28 20 69 4e 65 77 45 6e 64   }.  if( iNewEnd
373b0 20 3c 20 69 4f 6c 64 45 6e 64 20 29 7b 0a 20 20   < iOldEnd ){.  
373c0 20 20 6e 43 65 6c 6c 20 2d 3d 20 70 61 67 65 46    nCell -= pageF
373d0 72 65 65 41 72 72 61 79 28 70 50 67 2c 20 69 4e  reeArray(pPg, iN
373e0 65 77 45 6e 64 2c 20 69 4f 6c 64 45 6e 64 20 2d  ewEnd, iOldEnd -
373f0 20 69 4e 65 77 45 6e 64 2c 20 70 43 41 72 72 61   iNewEnd, pCArra
37400 79 29 3b 0a 20 20 7d 0a 0a 20 20 70 44 61 74 61  y);.  }..  pData
37410 20 3d 20 26 61 44 61 74 61 5b 67 65 74 32 62 79   = &aData[get2by
37420 74 65 4e 6f 74 5a 65 72 6f 28 26 61 44 61 74 61  teNotZero(&aData
37430 5b 68 64 72 2b 35 5d 29 5d 3b 0a 20 20 69 66 28  [hdr+5])];.  if(
37440 20 70 44 61 74 61 3c 70 42 65 67 69 6e 20 29 20   pData<pBegin ) 
37450 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61  goto editpage_fa
37460 69 6c 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 63 65  il;..  /* Add ce
37470 6c 6c 73 20 74 6f 20 74 68 65 20 73 74 61 72 74  lls to the start
37480 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
37490 20 20 69 66 28 20 69 4e 65 77 3c 69 4f 6c 64 20    if( iNew<iOld 
374a0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 64 64 20  ){.    int nAdd 
374b0 3d 20 4d 49 4e 28 6e 4e 65 77 2c 69 4f 6c 64 2d  = MIN(nNew,iOld-
374c0 69 4e 65 77 29 3b 0a 20 20 20 20 61 73 73 65 72  iNew);.    asser
374d0 74 28 20 28 69 4f 6c 64 2d 69 4e 65 77 29 3c 6e  t( (iOld-iNew)<n
374e0 4e 65 77 20 7c 7c 20 6e 43 65 6c 6c 3d 3d 30 20  New || nCell==0 
374f0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
37500 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 3d 20  .    pCellptr = 
37510 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20  pPg->aCellIdx;. 
37520 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 43 65 6c     memmove(&pCel
37530 6c 70 74 72 5b 6e 41 64 64 2a 32 5d 2c 20 70 43  lptr[nAdd*2], pC
37540 65 6c 6c 70 74 72 2c 20 6e 43 65 6c 6c 2a 32 29  ellptr, nCell*2)
37550 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 49 6e  ;.    if( pageIn
37560 73 65 72 74 41 72 72 61 79 28 0a 20 20 20 20 20  sertArray(.     
37570 20 20 20 20 20 70 50 67 2c 20 70 42 65 67 69 6e       pPg, pBegin
37580 2c 20 26 70 44 61 74 61 2c 20 70 43 65 6c 6c 70  , &pData, pCellp
37590 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 69 4e  tr,.          iN
375a0 65 77 2c 20 6e 41 64 64 2c 20 70 43 41 72 72 61  ew, nAdd, pCArra
375b0 79 0a 20 20 20 20 29 20 29 20 67 6f 74 6f 20 65  y.    ) ) goto e
375c0 64 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a 20 20  ditpage_fail;.  
375d0 20 20 6e 43 65 6c 6c 20 2b 3d 20 6e 41 64 64 3b    nCell += nAdd;
375e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61  .  }..  /* Add a
375f0 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ny overflow cell
37600 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  s */.  for(i=0; 
37610 69 3c 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77  i<pPg->nOverflow
37620 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
37630 69 43 65 6c 6c 20 3d 20 28 69 4f 6c 64 20 2b 20  iCell = (iOld + 
37640 70 50 67 2d 3e 61 69 4f 76 66 6c 5b 69 5d 29 20  pPg->aiOvfl[i]) 
37650 2d 20 69 4e 65 77 3b 0a 20 20 20 20 69 66 28 20  - iNew;.    if( 
37660 69 43 65 6c 6c 3e 3d 30 20 26 26 20 69 43 65 6c  iCell>=0 && iCel
37670 6c 3c 6e 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  l<nNew ){.      
37680 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 67 2d  pCellptr = &pPg-
37690 3e 61 43 65 6c 6c 49 64 78 5b 69 43 65 6c 6c 20  >aCellIdx[iCell 
376a0 2a 20 32 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 6d  * 2];.      memm
376b0 6f 76 65 28 26 70 43 65 6c 6c 70 74 72 5b 32 5d  ove(&pCellptr[2]
376c0 2c 20 70 43 65 6c 6c 70 74 72 2c 20 28 6e 43 65  , pCellptr, (nCe
376d0 6c 6c 20 2d 20 69 43 65 6c 6c 29 20 2a 20 32 29  ll - iCell) * 2)
376e0 3b 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b  ;.      nCell++;
376f0 0a 20 20 20 20 20 20 69 66 28 20 70 61 67 65 49  .      if( pageI
37700 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20 20 20  nsertArray(.    
37710 20 20 20 20 20 20 20 20 70 50 67 2c 20 70 42 65          pPg, pBe
37720 67 69 6e 2c 20 26 70 44 61 74 61 2c 20 70 43 65  gin, &pData, pCe
37730 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20 20 20 20  llptr,.         
37740 20 20 20 69 43 65 6c 6c 2b 69 4e 65 77 2c 20 31     iCell+iNew, 1
37750 2c 20 70 43 41 72 72 61 79 0a 20 20 20 20 20 20  , pCArray.      
37760 29 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67  ) ) goto editpag
37770 65 5f 66 61 69 6c 3b 0a 20 20 20 20 7d 0a 20 20  e_fail;.    }.  
37780 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 63  }..  /* Append c
37790 65 6c 6c 73 20 74 6f 20 74 68 65 20 65 6e 64 20  ells to the end 
377a0 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
377b0 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 67   pCellptr = &pPg
377c0 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c  ->aCellIdx[nCell
377d0 2a 32 5d 3b 0a 20 20 69 66 28 20 70 61 67 65 49  *2];.  if( pageI
377e0 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20 20 20  nsertArray(.    
377f0 20 20 20 20 70 50 67 2c 20 70 42 65 67 69 6e 2c      pPg, pBegin,
37800 20 26 70 44 61 74 61 2c 20 70 43 65 6c 6c 70 74   &pData, pCellpt
37810 72 2c 0a 20 20 20 20 20 20 20 20 69 4e 65 77 2b  r,.        iNew+
37820 6e 43 65 6c 6c 2c 20 6e 4e 65 77 2d 6e 43 65 6c  nCell, nNew-nCel
37830 6c 2c 20 70 43 41 72 72 61 79 0a 20 20 29 20 29  l, pCArray.  ) )
37840 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66   goto editpage_f
37850 61 69 6c 3b 0a 0a 20 20 70 50 67 2d 3e 6e 43 65  ail;..  pPg->nCe
37860 6c 6c 20 3d 20 6e 4e 65 77 3b 0a 20 20 70 50 67  ll = nNew;.  pPg
37870 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
37880 0a 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44  ..  put2byte(&aD
37890 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d  ata[hdr+3], pPg-
378a0 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62  >nCell);.  put2b
378b0 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35  yte(&aData[hdr+5
378c0 5d 2c 20 70 44 61 74 61 20 2d 20 61 44 61 74 61  ], pData - aData
378d0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
378e0 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d  E_DEBUG.  for(i=
378f0 30 3b 20 69 3c 6e 4e 65 77 20 26 26 20 21 43 4f  0; i<nNew && !CO
37900 52 52 55 50 54 5f 44 42 3b 20 69 2b 2b 29 7b 0a  RRUPT_DB; i++){.
37910 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
37920 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b  pCArray->apCell[
37930 69 2b 69 4e 65 77 5d 3b 0a 20 20 20 20 69 6e 74  i+iNew];.    int
37940 20 69 4f 66 66 20 3d 20 67 65 74 32 62 79 74 65   iOff = get2byte
37950 28 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b  (&pPg->aCellIdx[
37960 69 2a 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  i*2]);.    if( p
37970 43 65 6c 6c 3e 3d 61 44 61 74 61 20 26 26 20 70  Cell>=aData && p
37980 43 65 6c 6c 3c 26 61 44 61 74 61 5b 70 50 67 2d  Cell<&aData[pPg-
37990 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
379a0 5d 20 29 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c  ] ){.      pCell
379b0 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c 6c 20 2d   = &pTmp[pCell -
379c0 20 61 44 61 74 61 5d 3b 0a 20 20 20 20 7d 0a 20   aData];.    }. 
379d0 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 6d 65     assert( 0==me
379e0 6d 63 6d 70 28 70 43 65 6c 6c 2c 20 26 61 44 61  mcmp(pCell, &aDa
379f0 74 61 5b 69 4f 66 66 5d 2c 0a 20 20 20 20 20 20  ta[iOff],.      
37a00 20 20 20 20 20 20 70 43 41 72 72 61 79 2d 3e 70        pCArray->p
37a10 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  Ref->xCellSize(p
37a20 43 41 72 72 61 79 2d 3e 70 52 65 66 2c 20 70 43  CArray->pRef, pC
37a30 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 2b  Array->apCell[i+
37a40 69 4e 65 77 5d 29 29 20 29 3b 0a 20 20 7d 0a 23  iNew])) );.  }.#
37a50 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
37a60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 65 64 69 74  SQLITE_OK;. edit
37a70 70 61 67 65 5f 66 61 69 6c 3a 0a 20 20 2f 2a 20  page_fail:.  /* 
37a80 55 6e 61 62 6c 65 20 74 6f 20 65 64 69 74 20 74  Unable to edit t
37a90 68 69 73 20 70 61 67 65 2e 20 52 65 62 75 69 6c  his page. Rebuil
37aa0 64 20 69 74 20 66 72 6f 6d 20 73 63 72 61 74 63  d it from scratc
37ab0 68 20 69 6e 73 74 65 61 64 2e 20 2a 2f 0a 20 20  h instead. */.  
37ac0 70 6f 70 75 6c 61 74 65 43 65 6c 6c 43 61 63 68  populateCellCach
37ad0 65 28 70 43 41 72 72 61 79 2c 20 69 4e 65 77 2c  e(pCArray, iNew,
37ae0 20 6e 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e   nNew);.  return
37af0 20 72 65 62 75 69 6c 64 50 61 67 65 28 70 50 67   rebuildPage(pPg
37b00 2c 20 6e 4e 65 77 2c 20 26 70 43 41 72 72 61 79  , nNew, &pCArray
37b10 2d 3e 61 70 43 65 6c 6c 5b 69 4e 65 77 5d 2c 20  ->apCell[iNew], 
37b20 26 70 43 41 72 72 61 79 2d 3e 73 7a 43 65 6c 6c  &pCArray->szCell
37b30 5b 69 4e 65 77 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  [iNew]);.}../*.*
37b40 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
37b50 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72  parameters deter
37b60 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64  mine how many ad
37b70 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74  jacent pages get
37b80 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20   involved.** in 
37b90 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  a balancing oper
37ba0 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68  ation.  NN is th
37bb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  e number of neig
37bc0 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
37bd0 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  side.** of the p
37be0 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69  age that partici
37bf0 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
37c00 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
37c10 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74    NB is the.** t
37c20 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
37c30 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63  ages that partic
37c40 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67  ipate, including
37c50 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65   the target page
37c60 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68   and.** NN neigh
37c70 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
37c80 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ide..**.** The m
37c90 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
37ca0 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72  NN is 1 (of cour
37cb0 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67  se).  Increasing
37cc0 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28   NN above 1.** (
37cd0 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73  to 2 or 3) gives
37ce0 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76   a modest improv
37cf0 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20  ement in SELECT 
37d00 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f  and DELETE perfo
37d10 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63  rmance.** in exc
37d20 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67  hange for a larg
37d30 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69  er degradation i
37d40 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44  n INSERT and UPD
37d50 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  ATE performance.
37d60 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
37d70 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67   NN appears to g
37d80 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73  ive the best res
37d90 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f  ults overall..*/
37da0 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20  .#define NN 1   
37db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
37dc0 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
37dd0 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
37de0 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66  of pPage */.#def
37df0 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20  ine NB (NN*2+1) 
37e00 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61       /* Total pa
37e10 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ges involved in 
37e20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a  the balance */..
37e30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
37e40 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
37e50 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  E./*.** This ver
37e60 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28  sion of balance(
37e70 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f  ) handles the co
37e80 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73  mmon special cas
37e90 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77  e where.** a new
37ea0 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20   entry is being 
37eb0 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20  inserted on the 
37ec0 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e  extreme right-en
37ed0 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65  d of the.** tree
37ee0 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
37ef0 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65  , when the new e
37f00 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65  ntry will become
37f10 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20   the largest.** 
37f20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
37f30 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  e..**.** Instead
37f40 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61   of trying to ba
37f50 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68  lance the 3 righ
37f60 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65  t-most leaf page
37f70 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61  s, just add.** a
37f80 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
37f90 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
37fa0 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65   and put the one
37fb0 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a   new entry in.**
37fc0 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69   that page.  Thi
37fd0 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67  s leaves the rig
37fe0 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74  ht side of the t
37ff0 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20  ree somewhat.** 
38000 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74  unbalanced.  But
38010 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77   odds are that w
38020 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  e will be insert
38030 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a  ing new entries.
38040 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f  ** at the end so
38050 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f  on afterwards so
38060 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74   the nearly empt
38070 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63  y page will quic
38080 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20  kly.** fill up. 
38090 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a   On average..**.
380a0 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
380b0 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
380c0 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
380d0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72  t page in the tr
380e0 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69  ee..** pParent i
380f0 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70  s its parent.  p
38100 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  Page must have a
38110 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77   single overflow
38120 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20   entry.** which 
38130 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68  is also the righ
38140 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20  t-most entry on 
38150 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
38160 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  The pSpace buffe
38170 72 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  r is used to sto
38180 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  re a temporary c
38190 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64  opy of the divid
381a0 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20  er.** cell that 
381b0 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
381c0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53   into pParent. S
381d0 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69  uch a cell consi
381e0 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79  sts of a 4.** by
381f0 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  te page number f
38200 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72  ollowed by a var
38210 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
38220 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a  eger. In other.*
38230 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74  * words, at most
38240 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65   13 bytes. Hence
38250 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
38260 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a  er must be at.**
38270 20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20   least 13 bytes 
38280 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
38290 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  ic int balance_q
382a0 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50  uick(MemPage *pP
382b0 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a  arent, MemPage *
382c0 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63  pPage, u8 *pSpac
382d0 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
382e0 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67  const pBt = pPag
382f0 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d  e->pBt;    /* B-
38300 54 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f  Tree Database */
38310 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
38320 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
38330 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79          /* Newly
38340 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
38350 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
38360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
38380 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
38390 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20  no pgnoNew;     
383a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
383b0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
383c0 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20  r of pNew */..  
383d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
383e0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
383f0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
38400 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
38410 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
38420 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
38430 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
38440 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
38450 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54