/ Hex Artifact Content
Login

Artifact fe089e57e16c09b8bb8e268e32da9ddf2d0ace9c:


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 23 69 66 20 64 65   enable){.#if de
0b30: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0b50: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0b60: 66 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54  fined(TH3_COMPAT
0b70: 49 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e  IBILITY).  /* En
0b80: 61 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72  able global shar
0b90: 65 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f  ed cache functio
0ba0: 6e 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  n for debugging 
0bb0: 61 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20  and unit tests, 
0bc0: 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f  .  ** but not fo
0bd0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72  r release */.  r
0be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
0bf0: 55 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  USE;.#else.  sql
0c00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0c10: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0c20: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0c40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
0c50: 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f....#ifdef SQLI
0c60: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0c70: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0c90: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0ca0: 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61  leLock(), setSha
0cb0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0cc0: 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c  k(),.  ** and cl
0cd0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ce0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20  eTableLocks().  
0cf0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
0d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
0d10: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
0d20: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
0d30: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
0d40: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
0d50: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
0d60: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
0d70: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
0d80: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0d90: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
0da0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
0db0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
0dc0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
0dd0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
0de0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
0df0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
0e00: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
0e10: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
0e20: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
0e30: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
0e40: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
0e50: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0e60: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0e70: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0e80: 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63  ine setSharedCac
0e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0ea0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0eb0: 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53  define clearAllS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0ee0: 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  e downgradeAllSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0f10: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0f20: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64  ableLock(a,b,c,d
0f30: 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61  ) 1.  #define ha
0f40: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61  sReadConflicts(a
0f50: 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23  , b) 0.#endif..#
0f60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0f70: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0f80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0f90: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
0fa0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
0fb0: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
0fc0: 6f 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  of an assert() s
0fd0: 74 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a  tatement. ***.**
0fe0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
0ff0: 20 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73   if pBtree holds
1000: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1010: 63 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77  cks to read or w
1020: 72 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20  rite to the .** 
1030: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20  table with root 
1040: 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65  page iRoot.   Re
1050: 74 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65  turn 1 if it doe
1060: 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a  s and 0 if not..
1070: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1080: 65 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20  e, when writing 
1090: 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
10a0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20  root-page iRoot 
10b0: 76 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f  via .** Btree co
10c0: 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a  nnection pBtree:
10d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
10e0: 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
10f0: 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65  TableLock(pBtree
1100: 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54  , iRoot, 0, WRIT
1110: 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a  E_LOCK) );.**.**
1120: 20 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f   When writing to
1130: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72   an index that r
1140: 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72  esides in a shar
1150: 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74  able database, t
1160: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
1170: 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20  ould have first 
1180: 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20  obtained a lock 
1190: 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72  specifying the r
11a0: 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  oot page of.** t
11b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11c0: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b   table. This mak
11d0: 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20  es things a bit 
11e0: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
11f0: 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64  ,.** as this mod
1200: 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20  ule treats each 
1210: 74 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72  table as a separ
1220: 61 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54  ate structure. T
1230: 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74  o determine.** t
1240: 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
1250: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
1260: 64 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65  dex being writte
1270: 6e 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  n, this.** funct
1280: 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63  ion has to searc
1290: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61  h through the da
12a0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
12b0: 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
12c0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
12d0: 62 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64  ble/index rooted
12e0: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
12f0: 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a  the caller may.*
1300: 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c  * hold a write-l
1310: 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d  ock on the schem
1320: 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61  a table (root pa
1330: 67 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61  ge 1). This is a
1340: 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c  lso.** acceptabl
1350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1360: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1370: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65  ableLock(.  Btre
1380: 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20  e *pBtree,      
1390: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61     /* Handle tha
13a0: 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b  t must hold lock
13b0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
13c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13d0: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74  Root page of b-t
13e0: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ree */.  int isI
13f0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
1400: 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74  /* True if iRoot
1410: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   is the root of 
1420: 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  an index b-tree 
1430: 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79  */.  int eLockTy
1440: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  pe          /* R
1450: 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70  equired lock typ
1460: 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  e (READ_LOCK or 
1470: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29  WRITE_LOCK) */.)
1480: 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  {.  Schema *pSch
1490: 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29  ema = (Schema *)
14a0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63  pBtree->pBt->pSc
14b0: 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61  hema;.  Pgno iTa
14c0: 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  b = 0;.  BtLock 
14d0: 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  *pLock;..  /* If
14e0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
14f0: 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c  s not shareable,
1500: 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e   or if the clien
1510: 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a  t is reading.  *
1520: 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65  * and has the re
1530: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
1540: 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f  lag set, then no
1550: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
1560: 64 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20  d. .  ** Return 
1570: 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  true immediately
1580: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ..  */.  if( (pB
1590: 74 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d  tree->sharable==
15a0: 30 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54  0).   || (eLockT
15b0: 79 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26  ype==READ_LOCK &
15c0: 26 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  & (pBtree->db->f
15d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
15e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a  adUncommitted)).
15f0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1600: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1610: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
1620: 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e  ading  or writin
1630: 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74  g an index and t
1640: 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a  he schema is.  *
1650: 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68  * not loaded, th
1660: 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66  en it is too dif
1670: 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c  ficult to actual
1680: 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  ly check to see 
1690: 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72  if.  ** the corr
16a0: 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  ect locks are he
16b0: 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62  ld.  So do not b
16c0: 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74  other - just ret
16d0: 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54  urn true..  ** T
16e0: 68 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  his case does no
16f0: 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f  t come up very o
1700: 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  ften anyhow..  *
1710: 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20  /.  if( isIndex 
1720: 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20  && (!pSchema || 
1730: 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  (pSchema->schema
1740: 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61 4c  Flags&DB_SchemaL
1750: 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  oaded)==0) ){.  
1760: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1770: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1780: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
1790: 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68 6f  hat the lock sho
17a0: 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e 20  uld be held on. 
17b0: 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 62  For table.  ** b
17c0: 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73 20  -trees, this is 
17d0: 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70 61  just the root pa
17e0: 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
17f0: 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a 20   being read or. 
1800: 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f 72   ** written. For
1810: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c 20   index b-trees, 
1820: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
1830: 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63  age of the assoc
1840: 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c 65  iated.  ** table
1850: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e  .  */.  if( isIn
1860: 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68 45  dex ){.    HashE
1870: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  lem *p;.    for(
1880: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
1890: 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  t(&pSchema->idxH
18a0: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
18b0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
18c0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
18d0: 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c 69   = (Index *)sqli
18e0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
18f0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74       if( pIdx->t
1900: 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74 20  num==(int)iRoot 
1910: 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62 20  ){.        iTab 
1920: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1930: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1940: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1950: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1960: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1970: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1980: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
1990: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19a0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19b0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19c0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19d0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19e0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
19f0: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a00: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a10: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a20: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a30: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a40: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a50: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a60: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a70: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a80: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1a90: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1aa0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ab0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ac0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ad0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1ae0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1af0: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b00: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b10: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b20: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b30: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b40: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b50: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b60: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b70: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b80: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1b90: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1ba0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bb0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bc0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1bd0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1be0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1bf0: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c00: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c10: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c20: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c30: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c40: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c50: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c60: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c70: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c80: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1c90: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1ca0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cb0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cc0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1cd0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1ce0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1cf0: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d00: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d10: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d20: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d30: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d40: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d50: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d60: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d70: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d80: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1d90: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1da0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1db0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dc0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1dd0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1de0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1df0: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e00: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e10: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e20: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e30: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e40: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e50: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e60: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e70: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e80: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1e90: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1ea0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1eb0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ec0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ed0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ee0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1ef0: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f00: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f10: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f20: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f30: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f40: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f50: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f60: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f70: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f80: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1f90: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fa0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fb0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fc0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fd0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1fe0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
1ff0: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2000: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2010: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2020: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2030: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2040: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2050: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2060: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2070: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2080: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
2090: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20a0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20b0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20c0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20d0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20e0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
20f0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2100: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2110: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2130: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2140: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2150: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2160: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2170: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2180: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2190: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21a0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21b0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21c0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21d0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21e0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
21f0: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2200: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2210: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2220: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2230: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2240: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2250: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2260: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2270: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2280: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
2290: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22a0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22b0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22c0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22d0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22e0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
22f0: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2300: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2310: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2320: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2330: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2350: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2360: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2370: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2380: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
2390: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23b0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23c0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23d0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23e0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
23f0: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2400: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2410: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2420: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2430: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2440: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2450: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2460: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2470: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2480: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
2490: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24a0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24b0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24c0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24d0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24e0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
24f0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2500: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2510: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2520: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2530: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2540: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2550: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2560: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2570: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2580: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
2590: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25a0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25b0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25c0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25d0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25e0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
25f0: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2600: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2610: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2620: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2630: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2640: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2650: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2660: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2670: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2680: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
2690: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26b0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26c0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26d0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26e0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
26f0: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2700: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2710: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2720: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2730: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2740: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2750: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2760: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2770: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2780: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2790: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27a0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27b0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27c0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27d0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
27f0: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2800: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2810: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2820: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2830: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2840: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2850: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2860: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2870: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2880: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
2890: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28a0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28b0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28c0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28d0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28e0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
28f0: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2900: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2910: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2920: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2930: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2940: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2950: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2960: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2970: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2980: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
2990: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29a0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29b0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29c0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29d0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29e0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
29f0: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a00: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a10: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a20: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a30: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a40: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a50: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a60: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a70: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a80: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2a90: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2aa0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ab0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ac0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ad0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ae0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2af0: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b00: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b10: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b20: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b30: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b40: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b50: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b60: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b70: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b80: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2b90: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2ba0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bb0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bc0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2bd0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2be0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2bf0: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c00: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c10: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c20: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c30: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c40: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c50: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c60: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c70: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c80: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2c90: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2ca0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cb0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cc0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2cd0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2ce0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2cf0: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d00: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d10: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d20: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d30: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d40: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d50: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d60: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d70: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d80: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2d90: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2da0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2db0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dc0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2dd0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2de0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2df0: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e00: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e10: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e20: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e30: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e40: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e50: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e60: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e70: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e80: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2e90: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2ea0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2eb0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ec0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ed0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ee0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2ef0: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f00: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f20: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f30: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f40: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f50: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f60: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f70: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f80: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2f90: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fa0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fb0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fc0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fd0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2fe0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
2ff0: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3000: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3010: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3020: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3030: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3040: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3050: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3060: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3070: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
3090: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30a0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30b0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30c0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30d0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30e0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
30f0: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3100: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3110: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3120: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3130: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3140: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3150: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3160: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3170: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3180: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
3190: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31a0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31b0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31c0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31d0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31e0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
31f0: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3200: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3210: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3220: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3230: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3240: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3250: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3260: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3270: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3280: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
3290: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32a0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32b0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32c0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32d0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32e0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
32f0: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3300: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3310: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3320: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3330: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3340: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3360: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3370: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3380: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3390: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33a0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33b0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33c0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33d0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33e0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
33f0: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3400: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3410: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3420: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3430: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3440: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3450: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3460: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3470: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3480: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
3490: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34a0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34c0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34d0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34e0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
34f0: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3500: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3510: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3520: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3530: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3540: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3550: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3560: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3570: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3580: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
3590: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35a0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35b0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35d0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35e0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
35f0: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3600: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3610: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3620: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3630: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3640: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3650: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3660: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3670: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3680: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
3690: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36a0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36b0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36c0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36e0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
36f0: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3700: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3710: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3720: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3730: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3740: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3750: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3760: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3770: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3780: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
3790: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37a0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37b0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37c0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37d0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37e0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
37f0: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3800: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3810: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3820: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3830: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3840: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3850: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3860: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3870: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3880: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3890: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38a0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38b0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38c0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38d0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38e0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
38f0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3900: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3910: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3920: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3930: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3940: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3950: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3960: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3970: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3980: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
3990: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39a0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39b0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39c0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39e0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
39f0: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a00: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a10: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a20: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a30: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a40: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a50: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3a60: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3a70: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3a80: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
3a90: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3aa0: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
3ab0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3ac0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
3ad0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
3ae0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3af0: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
3b00: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
3b10: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
3b20: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b30: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3b40: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
3b50: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
3b60: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
3b70: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
3b80: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
3b90: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3ba0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
3bb0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
3bc0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
3bd0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3be0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3bf0: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3c00: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
3c10: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
3c20: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
3c30: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
3c40: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
3c50: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
3c60: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3c70: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
3c80: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
3c90: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3ca0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3cb0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3cc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3cd0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3ce0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
3cf0: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
3d00: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3d10: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d20: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3d30: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3d40: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3d50: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3d60: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
3d70: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
3d80: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3d90: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
3da0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3db0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
3dc0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
3dd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
3de0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
3df0: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
3e00: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3e10: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3e20: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3e30: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3e40: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
3e50: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3e60: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3e70: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3e80: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3e90: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3ea0: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
3eb0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3ec0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
3ed0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
3ee0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
3ef0: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
3f00: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3f10: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3f20: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3f30: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3f40: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3f50: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3f60: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3f70: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3f80: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3f90: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3fa0: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
3fb0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
3fc0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
3fd0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
3fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3ff0: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4000: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
4010: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
4020: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4030: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
4040: 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  eck */.  i64 iRo
4050: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
4060: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
4070: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
4080: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
4090: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
40a0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
40b0: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
40c0: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
40d0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42  BtCursor *p;.  B
40e0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
40f0: 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73  Btree->pBt;.  as
4100: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
4110: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74  eeHoldsMutex(pBt
4120: 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  ree) );.  for(p=
4130: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
4140: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
4150: 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c 61    if( (p->curFla
4160: 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62 6c  gs & BTCF_Incrbl
4170: 6f 62 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  ob)!=0.     && (
4180: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20  isClearTable || 
4190: 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52  p->info.nKey==iR
41a0: 6f 77 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ow).    ){.     
41b0: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
41c0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
41d0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
41e0: 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69    /* Stub functi
41f0: 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42  on when INCRBLOB
4200: 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20   is omitted */. 
4210: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
4220: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
4230: 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  rs(x,y,z).#endif
4240: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
4250: 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a  INCRBLOB */../*.
4260: 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20  ** Set bit pgno 
4270: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  of the BtShared.
4280: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4290: 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  ec. This is call
42a0: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61  ed .** when a pa
42b0: 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73  ge that previous
42c0: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74  ly contained dat
42d0: 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65  a becomes a free
42e0: 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70  -list leaf .** p
42f0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  age..**.** The B
4300: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4310: 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74  ent bitvec exist
4320: 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  s to work around
4330: 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62   an obscure.** b
4340: 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65  ug caused by the
4350: 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20   interaction of 
4360: 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70  two useful IO op
4370: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72  timizations surr
4380: 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d  ounding.** free-
4390: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a  list leaf pages:
43a0: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e  .**.**   1) When
43b0: 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c   all data is del
43c0: 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65  eted from a page
43d0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65   and the page be
43e0: 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20  comes.**      a 
43f0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4400: 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73  age, the page is
4410: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
4420: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
4430: 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69       (as free-li
4440: 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f  st leaf pages co
4450: 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67  ntain no meaning
4460: 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74  ful data). Somet
4470: 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63  imes.**      suc
4480: 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20  h a page is not 
4490: 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  even journalled 
44a0: 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  (as it will not 
44b0: 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20  be modified,.** 
44c0: 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20       why bother 
44d0: 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29  journalling it?)
44e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
44f0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4500: 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65  af page is reuse
4510: 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69  d, its content i
4520: 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20  s not read.**   
4530: 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61     from the data
4540: 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20  base or written 
4550: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
4560: 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20  ile (why should 
4570: 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69  it.**      be, i
4580: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61  f it is not at a
4590: 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e  ll meaningful?).
45a0: 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65  .**.** By themse
45b0: 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69  lves, these opti
45c0: 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66  mizations work f
45d0: 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20  ine and provide 
45e0: 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f  a handy.** perfo
45f0: 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20  rmance boost to 
4600: 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69  bulk delete or i
4610: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
4620: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a  . However, if.**
4630: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
4640: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
4650: 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  t and then reuse
4660: 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  d within the sam
4670: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
4680: 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65  , a problem come
4690: 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67  s up. If the pag
46a0: 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  e is not journal
46b0: 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69  led when.** it i
46c0: 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  s moved to the f
46d0: 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20  ree-list and it 
46e0: 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72  is also not jour
46f0: 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a  nalled when it.*
4700: 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  * is extracted f
4710: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
4720: 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68  t and reused, th
4730: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
4740: 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c  data.** may be l
4750: 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e  ost. In the even
4760: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  t of a rollback,
4770: 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70   it may not be p
4780: 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65  ossible.** to re
4790: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
47a0: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
47b0: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
47c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75  ..**.** The solu
47d0: 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68  tion is the BtSh
47e0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
47f0: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4800: 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20  r a page is .** 
4810: 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20  moved to become 
4820: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4830: 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65   page, the corre
4840: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a  sponding bit is.
4850: 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69  ** set in the bi
4860: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
4870: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78   leaf page is ex
4880: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
4890: 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f   free-list,.** o
48a0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62  ptimization 2 ab
48b0: 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69  ove is omitted i
48c0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
48d0: 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61  ing bit is alrea
48e0: 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53  dy.** set in BtS
48f0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4900: 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  t. The contents 
4910: 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72  of the bitvec ar
4920: 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20  e cleared.** at 
4930: 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
4940: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
4950: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4960: 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42  eSetHasContent(B
4970: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
4980: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
4990: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
49a0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
49b0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61  Content ){.    a
49c0: 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74  ssert( pgno<=pBt
49d0: 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70  ->nPage );.    p
49e0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
49f0: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
4a00: 72 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65  reate(pBt->nPage
4a10: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d  );.    if( !pBt-
4a20: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
4a30: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
4a40: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
4a50: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
4a60: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
4a70: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
4a80: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
4a90: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
4aa0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
4ab0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4ac0: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
4ad0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4ae0: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
4af0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4b00: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
4b10: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
4b20: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4b30: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4b40: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
4b50: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
4b60: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
4b70: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
4b80: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
4b90: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
4ba0: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
4bb0: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
4bc0: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
4bd0: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
4be0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
4bf0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
4c00: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4c10: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
4c20: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
4c30: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
4c40: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
4c50: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
4c60: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
4c70: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
4c80: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
4c90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
4ca0: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
4cb0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4cc0: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
4cd0: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
4ce0: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
4cf0: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
4d00: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
4d10: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
4d20: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
4d30: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4d40: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
4d50: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
4d60: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
4d70: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
4d80: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
4d90: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
4da0: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
4db0: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
4dc0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
4dd0: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
4de0: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
4df0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4e00: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
4e10: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
4e20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
4e30: 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
4e40: 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43  Page[i]);.    pC
4e50: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
4e60: 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  0;.  }.  pCur->i
4e70: 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f  Page = -1;.}.../
4e80: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
4e90: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
4ea0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
4eb0: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
4ec0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
4ed0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
4ee0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
4ef0: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
4f00: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
4f10: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
4f20: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
4f30: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
4f40: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
4f50: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
4f60: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
4f70: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
4f80: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
4f90: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
4fa0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
4fb0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
4fc0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
4fd0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
4fe0: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
4ff0: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
5000: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
5010: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5020: 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
5030: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
5040: 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e  e(pCur, &pCur->n
5050: 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
5060: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
5070: 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63    /* KeySize() c
5080: 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20  annot fail */.. 
5090: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
50a0: 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20  n intKey table, 
50b0: 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63  then the above c
50c0: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53  all to BtreeKeyS
50d0: 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65  ize().  ** store
50e0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  s the integer ke
50f0: 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e  y in pCur->nKey.
5100: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
5110: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a  is value is.  **
5120: 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
5130: 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
5140: 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74  , if pCur is not
5150: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b   open on an intK
5160: 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74  ey.  ** table, t
5170: 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  hen malloc space
5180: 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74   for and store t
5190: 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79  he pCur->nKey by
51a0: 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a  tes of key .  **
51b0: 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66   data..  */.  if
51c0: 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ( 0==pCur->apPag
51d0: 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  e[0]->intKey ){.
51e0: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d      void *pKey =
51f0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
5200: 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  pCur->nKey );.  
5210: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
5220: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5230: 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30  BtreeKey(pCur, 0
5240: 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  , (int)pCur->nKe
5250: 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
5260: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5270: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
5280: 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a  r->pKey = pKey;.
5290: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
52a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
52b0: 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  e(pKey);.      }
52c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
52d0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
52e0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
52f0: 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e   assert( !pCur->
5300: 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
5310: 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79  y || !pCur->pKey
5320: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
5330: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5340: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
5350: 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72 29  ursorPages(pCur)
5360: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
5370: 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55  te = CURSOR_REQU
5380: 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20  IRESEEK;.  }..  
5390: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
53a0: 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
53b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
53c0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
53d0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
53e0: 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
53f0: 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  E saveCursorsOnL
5400: 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67  ist(BtCursor*,Pg
5410: 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a  no,BtCursor*);..
5420: 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70  /*.** Save the p
5430: 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20  ositions of all 
5440: 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74 20  cursors (except 
5450: 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61 72  pExcept) that ar
5460: 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65  e open on.** the
5470: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
5480: 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53  -page iRoot.  "S
5490: 61 76 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  aving the cursor
54a0: 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73   position" means
54b0: 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63   that.** the loc
54c0: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72  ation in the btr
54d0: 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64  ee is remembered
54e0: 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
54f0: 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a  hat it can be.**
5500: 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74   moved back to t
5510: 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74  he same spot aft
5520: 65 72 20 74 68 65 20 62 74 72 65 65 20 68 61 73  er the btree has
5530: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
5540: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
5550: 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20   is called just 
5560: 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45  before cursor pE
5570: 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f  xcept is used to
5580: 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74   modify the.** t
5590: 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c  able, for exampl
55a0: 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65  e in BtreeDelete
55b0: 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72  () or BtreeInser
55c0: 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65  t()..**.** Imple
55d0: 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20  mentation note: 
55e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65   This routine me
55f0: 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73  rely checks to s
5600: 65 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72  ee if any cursor
5610: 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20  s.** need to be 
5620: 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73  saved.  It calls
5630: 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73   out to saveCurs
5640: 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74  orsOnList() in t
5650: 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20  he (unusual).** 
5660: 65 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f  event that curso
5670: 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74  rs are in need t
5680: 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a  o being saved..*
5690: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
56a0: 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68  eAllCursors(BtSh
56b0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
56c0: 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20  iRoot, BtCursor 
56d0: 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43  *pExcept){.  BtC
56e0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
56f0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
5700: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
5710: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
5720: 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45  pExcept==0 || pE
5730: 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20  xcept->pBt==pBt 
5740: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
5750: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
5760: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
5770: 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28   p!=pExcept && (
5780: 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70  0==iRoot || p->p
5790: 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20  gnoRoot==iRoot) 
57a0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
57b0: 65 74 75 72 6e 20 70 20 3f 20 73 61 76 65 43 75  eturn p ? saveCu
57c0: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69  rsorsOnList(p, i
57d0: 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 20 3a  Root, pExcept) :
57e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
57f0: 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f  * This helper ro
5800: 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c  utine to saveAll
5810: 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65  Cursors does the
5820: 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20   actual work of 
5830: 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75  saving.** the cu
5840: 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65  rsors if and whe
5850: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f  n a cursor is fo
5860: 75 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c  und that actuall
5870: 79 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e  y requires savin
5880: 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  g..** The common
5890: 20 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f   case is that no
58a0: 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f   cursors need to
58b0: 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68   be saved, so th
58c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
58d0: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
58e0: 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61   its caller to a
58f0: 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
5900: 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d   stack pointer m
5910: 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ovement..*/.stat
5920: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
5930: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
5940: 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75  rsOnList(.  BtCu
5950: 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20  rsor *p,        
5960: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75   /* The first cu
5970: 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20  rsor that needs 
5980: 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  saving */.  Pgno
5990: 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20   iRoot,         
59a0: 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75   /* Only save cu
59b0: 72 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69  rsor with this i
59c0: 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69  Root. Save all i
59d0: 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75  f zero */.  BtCu
59e0: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20  rsor *pExcept   
59f0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20   /* Do not save 
5a00: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29  this cursor */.)
5a10: 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  {.  do{.    if( 
5a20: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
5a30: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
5a40: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
5a50: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
5a60: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
5a70: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69  LID ){.        i
5a80: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
5a90: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
5aa0: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
5ab0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
5ac0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
5ad0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5ae0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5af0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
5b00: 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ge>0 );.        
5b10: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
5b20: 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
5b30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5b40: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
5b50: 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20   }while( p );.  
5b60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
5b80: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
5b90: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
5ba0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
5bb0: 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74  eeClearCursor(Bt
5bc0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
5bd0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
5be0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
5bf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
5c00: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
5c10: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
5c20: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
5c30: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
5c40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68  ;.}../*.** In th
5c50: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74  is version of Bt
5c60: 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20  reeMoveto, pKey 
5c70: 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65  is a packed inde
5c80: 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68  x record.** such
5c90: 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64   as is generated
5ca0: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
5cb0: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55  ecord opcode.  U
5cc0: 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63  npack the.** rec
5cd0: 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  ord and then cal
5ce0: 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  l BtreeMovetoUnp
5cf0: 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68  acked() to do th
5d00: 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e work..*/.stati
5d10: 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74  c int btreeMovet
5d20: 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
5d30: 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73  Cur,     /* Curs
5d40: 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  or open on the b
5d50: 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63  tree to be searc
5d60: 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  hed */.  const v
5d70: 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
5d80: 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68  Packed key if th
5d90: 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e  e btree is an in
5da0: 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  dex */.  i64 nKe
5db0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
5dc0: 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  Integer key for 
5dd0: 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66  tables.  Size of
5de0: 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65   pKey for indice
5df0: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c  s */.  int bias,
5e00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
5e10: 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  as search to the
5e20: 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
5e30: 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
5e40: 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
5e50: 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
5e60: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64     /* Status cod
5e90: 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  e */.  UnpackedR
5ea0: 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20  ecord *pIdxKey; 
5eb0: 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e    /* Unpacked in
5ec0: 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61  dex key */.  cha
5ed0: 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 20 20  r aSpace[200];  
5ee0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
5ef0: 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65  space for pIdxKe
5f00: 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  y - to avoid a m
5f10: 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
5f20: 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69  *pFree = 0;..  i
5f30: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
5f40: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36  ssert( nKey==(i6
5f50: 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20  4)(int)nKey );. 
5f60: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
5f70: 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
5f80: 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20  ackedRecord(.   
5f90: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49       pCur->pKeyI
5fa0: 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a  nfo, aSpace, siz
5fb0: 65 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46  eof(aSpace), &pF
5fc0: 72 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ree.    );.    i
5fd0: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
5fe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
5ff0: 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MEM;.    sqlite3
6000: 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
6010: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c  (pCur->pKeyInfo,
6020: 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79   (int)nKey, pKey
6030: 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
6040: 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69  if( pIdxKey->nFi
6050: 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eld==0 ){.      
6060: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
6070: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
6080: 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20  , pFree);.      
6090: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
60a0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
60b0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
60c0: 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  IdxKey = 0;.  }.
60d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
60e0: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
60f0: 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c  d(pCur, pIdxKey,
6100: 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65   nKey, bias, pRe
6110: 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20  s);.  if( pFree 
6120: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
6130: 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49  Free(pCur->pKeyI
6140: 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b  nfo->db, pFree);
6150: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f  ;.}../*.** Resto
6170: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  re the cursor to
6180: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
6190: 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63   was in (or as c
61a0: 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69  lose to as possi
61b0: 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76  ble).** when sav
61c0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
61d0: 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f  ) was called. No
61e0: 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c  te that this cal
61f0: 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a  l deletes the .*
6200: 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  * saved position
6210: 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20   info stored by 
6220: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6230: 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63  on(), so there c
6240: 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74  an be.** at most
6250: 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72   one effective r
6260: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6270: 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65  tion() call afte
6280: 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43  r each .** saveC
6290: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e  ursorPosition().
62a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
62b0: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
62c0: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
62d0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
62e0: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63   rc;.  assert( c
62f0: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
6300: 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
6310: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  t( pCur->eState>
6320: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
6330: 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
6340: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6350: 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
6360: 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
6370: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72  Next;.  }.  pCur
6380: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
6390: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20  R_INVALID;.  rc 
63a0: 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  = btreeMoveto(pC
63b0: 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20  ur, pCur->pKey, 
63c0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26  pCur->nKey, 0, &
63d0: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b  pCur->skipNext);
63e0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
63f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
6400: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
6410: 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Key);.    pCur->
6420: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  pKey = 0;.    as
6430: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
6440: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
6450: 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
6460: 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
6470: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
6480: 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43  ->skipNext && pC
6490: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
64a0: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
64b0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
64c0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
64d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
64e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
64f0: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
6500: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
6510: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
6520: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
6530: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72  ? \.         btr
6540: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
6550: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
6560: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
6570: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
6580: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6590: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
65a0: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
65b0: 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  osition where.**
65c0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61   it was last pla
65d0: 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e  ced, or has been
65e0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72   invalidated for
65f0: 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f   any other reaso
6600: 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61  n..** Cursors ca
6610: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
6620: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
6630: 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65  nting at is dele
6640: 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20  ted out.** from 
6650: 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20  under them, for 
6660: 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72  example.  Cursor
6670: 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65   might also move
6680: 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69   if a btree.** i
6690: 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a  s rebalanced..**
66a0: 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
66b0: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
66c0: 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e  NULL cursor poin
66d0: 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ter returns fals
66e0: 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  e..**.** Use the
66f0: 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65   separate sqlite
6700: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
6710: 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ore() routine to
6720: 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f   restore a curso
6730: 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65  r.** back to whe
6740: 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  re it ought to b
6750: 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e if this routin
6760: 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a  e returns true..
6770: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
6780: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
6790: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
67a0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
67b0: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
67c0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  !=CURSOR_VALID;.
67d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
67e0: 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61  utine restores a
67f0: 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20   cursor back to 
6800: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73  its original pos
6810: 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a  ition after it.*
6820: 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64  * has been moved
6830: 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65   by some outside
6840: 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68 20   activity (such 
6850: 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61 6c  as a btree rebal
6860: 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77  ance or.** a row
6870: 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c   having been del
6880: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
6890: 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e  der the cursor).
68a0: 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63    .**.** On succ
68b0: 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65  ess, the *pDiffe
68c0: 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65  rentRow paramete
68d0: 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  r is false if th
68e0: 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
68f0: 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  .** pointing at 
6900: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
6910: 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e   row.  *pDiffern
6920: 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20  tRow is the row 
6930: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
6940: 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61  s pointing to ha
6950: 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20  s been deleted, 
6960: 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72 73  forcing the curs
6970: 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73  or to point to s
6980: 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f  ome.** nearby ro
6990: 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  w..**.** This ro
69a0: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
69b0: 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20  y be called for 
69c0: 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75  a cursor that ju
69d0: 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54  st returned.** T
69e0: 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  RUE from sqlite3
69f0: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
6a00: 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ved()..*/.int sq
6a10: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
6a20: 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72  Restore(BtCursor
6a30: 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69   *pCur, int *pDi
6a40: 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69  fferentRow){.  i
6a50: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
6a60: 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61  ( pCur!=0 );.  a
6a70: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
6a80: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
6a90: 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  D );.  rc = rest
6aa0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6ab0: 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
6ac0: 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  c ){.    *pDiffe
6ad0: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20  rentRow = 1;.   
6ae0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6af0: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
6b00: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
6b10: 20 7c 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e   || NEVER(pCur->
6b20: 73 6b 69 70 4e 65 78 74 21 3d 30 29 20 29 7b 0a  skipNext!=0) ){.
6b30: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
6b40: 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ow = 1;.  }else{
6b50: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
6b60: 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Row = 0;.  }.  r
6b70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6b80: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
6b90: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
6ba0: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
6bb0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
6bc0: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
6bd0: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
6be0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
6bf0: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
6c00: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
6c10: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
6c20: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
6c30: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
6c40: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
6c50: 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61   (not a valid pa
6c60: 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20  ge) for pgno==1 
6c70: 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a  since there is.*
6c80: 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70  * no pointer map
6c90: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6ca0: 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e   page 1.  The in
6cb0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f  tegrity_check lo
6cc0: 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20  gic.** requires 
6cd0: 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e  that ptrmapPagen
6ce0: 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74  o(*,1)!=1..*/.st
6cf0: 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70  atic Pgno ptrmap
6d00: 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20  Pageno(BtShared 
6d10: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
6d20: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65  {.  int nPagesPe
6d30: 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f  rMapPage;.  Pgno
6d40: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
6d50: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6d60: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
6d70: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
6d80: 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e   pgno<2 ) return
6d90: 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d   0;.  nPagesPerM
6da0: 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75  apPage = (pBt->u
6db0: 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a  sableSize/5)+1;.
6dc0: 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e    iPtrMap = (pgn
6dd0: 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61  o-2)/nPagesPerMa
6de0: 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28  pPage;.  ret = (
6df0: 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65  iPtrMap*nPagesPe
6e00: 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a  rMapPage) + 2; .
6e10: 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49    if( ret==PENDI
6e20: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
6e30: 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a  ) ){.    ret++;.
6e40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
6e50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
6e60: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
6e70: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
6e80: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6e90: 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70  ne updates the p
6ea0: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
6eb0: 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
6ec0: 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61   'key'.** so tha
6ed0: 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70  t it maps to typ
6ee0: 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61  e 'eType' and pa
6ef0: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
6f00: 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49   'pgno'..**.** I
6f10: 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61  f *pRC is initia
6f20: 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f  lly non-zero (no
6f30: 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65  n-SQLITE_OK) the
6f40: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
6f50: 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  s.** a no-op.  I
6f60: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
6f70: 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  s, the appropria
6f80: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
6f90: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
6fa0: 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63   *pRC..*/.static
6fb0: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28   void ptrmapPut(
6fc0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
6fd0: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
6fe0: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20  e, Pgno parent, 
6ff0: 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50  int *pRC){.  DbP
7000: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
7010: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
7020: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
7030: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
7040: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
7050: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
7060: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
7070: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
7080: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
7090: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
70a0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
70b0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
70c0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
70d0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
70e0: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  n code from subf
70f0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69  unctions */..  i
7100: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
7110: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
7120: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7130: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
7140: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
7150: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
7160: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
7170: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
7180: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7190: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
71a0: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
71b0: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
71c0: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
71d0: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
71e0: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
71f0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  y==0 ){.    *pRC
7200: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7210: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
7220: 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61  rn;.  }.  iPtrma
7230: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
7240: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
7250: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
7260: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
7270: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
7280: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
7290: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
72a0: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
72b0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
72c0: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
72d0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
72e0: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
72f0: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
7300: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7310: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
7320: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
7330: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7340: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7350: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7360: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
7370: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7380: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
7390: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
73a0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
73b0: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
73c0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
73d0: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
73e0: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
73f0: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
7400: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
7410: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
7420: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
7430: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
7440: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
7450: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7460: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
7470: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
7480: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
7490: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
74a0: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
74b0: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
74c0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
74d0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
74e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
74f0: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
7500: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
7510: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7520: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
7530: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
7540: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
7550: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
7560: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
7570: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
7580: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
7590: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
75a0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
75b0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
75c0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
75d0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
75e0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
75f0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
7600: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
7610: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
7620: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
7630: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
7640: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
7650: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7660: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
7670: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
7680: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
7690: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
76a0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
76b0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
76c0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
76d0: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
76e0: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
76f0: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
7700: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
7710: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7720: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7730: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
7740: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
7750: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
7760: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
7770: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
7780: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
7790: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
77a0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
77b0: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
77c0: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
77d0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
77e0: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
77f0: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
7800: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
7810: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
7820: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
7830: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
7840: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
7850: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7860: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
7870: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
7880: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
7890: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
78a0: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
78b0: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
78c0: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
78d0: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
78e0: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
78f0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
7900: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
7910: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
7920: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
7930: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
7940: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7950: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74  RUPT_BKPT;.  ret
7960: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7970: 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65  ..#else /* if de
7980: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
7990: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
79a0: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
79b0: 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a  Put(w,x,y,z,rc).
79c0: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
79d0: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
79e0: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
79f0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
7a00: 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64  r(x, y, rc).#end
7a10: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
7a20: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
7a30: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
7a40: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
7a50: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
7a60: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
7a70: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
7a80: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
7a90: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
7aa0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
7ab0: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tent..**.** This
7ac0: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f   routine works o
7ad0: 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68  nly for pages th
7ae0: 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  at do not contai
7af0: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
7b00: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e  ..*/.#define fin
7b10: 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28  dCell(P,I) \.  (
7b20: 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50  (P)->aData + ((P
7b30: 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  )->maskPage & ge
7b40: 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 43 65  t2byte(&(P)->aCe
7b50: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
7b60: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
7b70: 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b 28  v2(D,M,O,I) (D+(
7b80: 4d 26 67 65 74 32 62 79 74 65 28 44 2b 28 4f 2b  M&get2byte(D+(O+
7b90: 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a 2a  2*(I))))).../*.*
7ba0: 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f  * This a more co
7bb0: 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66  mplex version of
7bc0: 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74   findCell() that
7bd0: 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61   works for.** pa
7be0: 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74  ges that do cont
7bf0: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
7c00: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ls..*/.static u8
7c10: 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65   *findOverflowCe
7c20: 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
7c30: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
7c40: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
7c50: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7c60: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
7c70: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72  >mutex) );.  for
7c80: 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  (i=pPage->nOverf
7c90: 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  low-1; i>=0; i--
7ca0: 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  ){.    int k;.  
7cb0: 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e 61 69 4f    k = pPage->aiO
7cc0: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  vfl[i];.    if( 
7cd0: 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k<=iCell ){.    
7ce0: 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29    if( k==iCell )
7cf0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
7d00: 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 69   pPage->apOvfl[i
7d10: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
7d20: 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a   iCell--;.    }.
7d30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e    }.  return fin
7d40: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
7d50: 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ll);.}../*.** Pa
7d60: 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65  rse a cell conte
7d70: 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c  nt block and fil
7d80: 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66  l in the CellInf
7d90: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
7da0: 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76  ere.** are two v
7db0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
7dc0: 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65 65  function.  btree
7dd0: 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65  ParseCell() take
7de0: 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64  s a .** cell ind
7df0: 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ex as the second
7e00: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62 74   argument and bt
7e10: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7e20: 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f  ) .** takes a po
7e30: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64  inter to the bod
7e40: 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73  y of the cell as
7e50: 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75   its second argu
7e60: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
7e70: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
7e80: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
7e90: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
7ea0: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
7eb0: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
7ec0: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
7ed0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
7ee0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
7ef0: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
7f00: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
7f10: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
7f20: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
7f30: 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  /.){.  u8 *pIter
7f40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7f50: 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74  * For scanning t
7f60: 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a  hrough pCell */.
7f70: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
7f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7f90: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
7fa0: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
7fb0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7fc0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
7fd0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
7fe0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
7ff0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
8000: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
8010: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
8020: 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
8030: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8040: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20  childPtrSize==0 
8050: 29 3b 0a 20 20 20 20 70 49 74 65 72 20 3d 20 70  );.    pIter = p
8060: 43 65 6c 6c 20 2b 20 67 65 74 56 61 72 69 6e 74  Cell + getVarint
8070: 33 32 28 70 43 65 6c 6c 2c 20 6e 50 61 79 6c 6f  32(pCell, nPaylo
8080: 61 64 29 3b 0a 20 20 20 20 70 49 74 65 72 20 2b  ad);.    pIter +
8090: 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74 65  = getVarint(pIte
80a0: 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  r, (u64*)&pInfo-
80b0: 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 20  >nKey);.  }else 
80c0: 69 66 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79  if( pPage->noPay
80d0: 6c 6f 61 64 20 29 7b 0a 20 20 20 20 61 73 73 65  load ){.    asse
80e0: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
80f0: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
8100: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
8110: 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26   4 + getVarint(&
8120: 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29  pCell[4], (u64*)
8130: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
8140: 20 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f     pInfo->nPaylo
8150: 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e 66  ad = 0;.    pInf
8160: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20  o->nLocal = 0;. 
8170: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
8180: 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e  low = 0;.    pIn
8190: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30  fo->pPayload = 0
81a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
81b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
81c0: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
81d0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
81e0: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
81f0: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
8200: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70  nPayload);.    p
8210: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
8220: 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e  yload;.  }.  pIn
8230: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
8240: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
8250: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
8260: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
8270: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
8280: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
8290: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
82a0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
82b0: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
82c0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
82d0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
82e0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
82f0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
8300: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
8310: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
8320: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
8330: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
8340: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
8350: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
8360: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
8370: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
8380: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
8390: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
83a0: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
83b0: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
83c0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
83d0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
83e0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
83f0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
8400: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
8410: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
8420: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
8430: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
8440: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
8450: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
8460: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
8470: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
8480: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
8490: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
84a0: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
84b0: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
84c0: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
84d0: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
84e0: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
84f0: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
8500: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
8510: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
8520: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
8530: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
8540: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
8550: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
8560: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
8570: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
8580: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
8590: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
85a0: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
85b0: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
85c0: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
85d0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
85e0: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
85f0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8600: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8610: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
8620: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
8630: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8640: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8650: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
8660: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
8670: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
8680: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
8690: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
86a0: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
86b0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
86c0: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
86d0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
86e0: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
86f0: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
8700: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
8710: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
8720: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
8730: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
8740: 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ==maxLocal );.  
8750: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8760: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
8770: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
8780: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
8790: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
87a0: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
87b0: 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  plus;.    }else{
87c0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
87d0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
87e0: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
87f0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8800: 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d   = (u16)(&pInfo-
8810: 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d  >pPayload[pInfo-
8820: 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c  >nLocal] - pCell
8830: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  );.    pInfo->nS
8840: 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76  ize = pInfo->iOv
8850: 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a  erflow + 4;.  }.
8860: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
8870: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
8880: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8890: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
88a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
88b0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
88c0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
88d0: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
88e0: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
88f0: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
8900: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
8910: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
8920: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
8930: 7b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  {.  btreeParseCe
8940: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e  llPtr(pPage, fin
8950: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
8960: 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ll), pInfo);.}..
8970: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
8980: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
8990: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
89a0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
89b0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
89c0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
89d0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
89e0: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
89f0: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
8a00: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
8a10: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
8a20: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
8a30: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
8a40: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
8a50: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
8a60: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ter..*/.static u
8a70: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d  16 cellSizePtr(M
8a80: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
8a90: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
8aa0: 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b  *pIter = pCell +
8ab0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
8ac0: 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f  Size; /* For loo
8ad0: 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20  ping over bytes 
8ae0: 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  of pCell */.  u8
8af0: 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *pEnd;         
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b10: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
8b20: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
8b30: 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20  */.  u32 nSize; 
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8b60: 20 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72   Size value to r
8b70: 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66  eturn */..#ifdef
8b80: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
8b90: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  /* The value ret
8ba0: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
8bb0: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c  nction should al
8bc0: 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65  ways be the same
8bd0: 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65   as.  ** the (Ce
8be0: 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61  llInfo.nSize) va
8bf0: 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69  lue found by doi
8c00: 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20  ng a full parse 
8c10: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  of the.  ** cell
8c20: 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55  . If SQLITE_DEBU
8c30: 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  G is defined, an
8c40: 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65   assert() at the
8c50: 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20   bottom of.  ** 
8c60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65  this function ve
8c70: 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73  rifies that this
8c80: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f   invariant is no
8c90: 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20  t violated. */. 
8ca0: 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69   CellInfo debugi
8cb0: 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72 73  nfo;.  btreePars
8cc0: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
8cd0: 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66  pCell, &debuginf
8ce0: 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  o);.#endif..  if
8cf0: 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f  ( pPage->noPaylo
8d00: 61 64 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d  ad ){.    pEnd =
8d10: 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20   &pIter[9];.    
8d20: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
8d30: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
8d40: 70 45 6e 64 20 29 3b 0a 20 20 20 20 61 73 73 65  pEnd );.    asse
8d50: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
8d60: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
8d70: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 28 70    return (u16)(p
8d80: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
8d90: 20 7d 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49   }.  nSize = *pI
8da0: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
8db0: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
8dc0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a  nd = &pIter[9];.
8dd0: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
8de0: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
8df0: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
8e00: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
8e10: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
8e20: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
8e30: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
8e40: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
8e50: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
8e60: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
8e70: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
8e80: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
8e90: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
8ea0: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
8eb0: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
8ec0: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
8ed0: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
8ee0: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
8ef0: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
8f00: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
8f10: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
8f20: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
8f30: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
8f40: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
8f50: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
8f60: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
8f70: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
8f80: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
8f90: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
8fa0: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
8fb0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
8fc0: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
8fd0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
8fe0: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
8ff0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
9000: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
9010: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
9020: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
9030: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
9040: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
9050: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
9060: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
9070: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
9080: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
9090: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
90a0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
90b0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
90c0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
90d0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
90e0: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
90f0: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
9100: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
9110: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
9120: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
9130: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
9140: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
9150: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
9160: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
9170: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
9180: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
9190: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64  6)nSize;.}..#ifd
91a0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
91b0: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
91c0: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
91d0: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
91e0: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
91f0: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
9200: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
9210: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
9220: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
9230: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65  ll){.  return ce
9240: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
9250: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
9260: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
9270: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
9280: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
9290: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
92a0: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
92b0: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
92c0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
92d0: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
92e0: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
92f0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
9300: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
9310: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
9320: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
9330: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
9340: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
9350: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
9360: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
9370: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
9380: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
9390: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
93a0: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72  Cell!=0 );.  btr
93b0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
93c0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
93d0: 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
93e0: 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
93f0: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
9400: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
9410: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
9420: 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61     ptrmapPut(pPa
9430: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
9440: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
9450: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52   pPage->pgno, pR
9460: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
9470: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
9480: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
9490: 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61  en.  All Cells a
94a0: 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
94b0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  ** end of the pa
94c0: 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20  ge and all free 
94d0: 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74  space is collect
94e0: 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62  ed into one.** b
94f0: 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20  ig FreeBlk that 
9500: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
9510: 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  n the header and
9520: 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72   cell.** pointer
9530: 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63   array and the c
9540: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
9550: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9560: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d  defragmentPage(M
9570: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
9580: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
95a0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
95b0: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
95d0: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  Address of the i
95e0: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
95f0: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
9600: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
9610: 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  et to the page h
9620: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73  eader */.  int s
9630: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
9640: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
9650: 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74   a cell */.  int
9660: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
9670: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9680: 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65  r of usable byte
9690: 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s on a page */. 
96a0: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
96c0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
96d0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
96e0: 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20  */.  int cbrk;  
96f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9700: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
9710: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
9720: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ea */.  int nCel
9730: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
9740: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9750: 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
9760: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
9770: 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
9780: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61    /* The page da
9790: 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ta */.  unsigned
97a0: 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20   char *temp;    
97b0: 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20     /* Temp area 
97c0: 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  for cell content
97d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46   */.  int iCellF
97e0: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
97f0: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
9800: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
9810: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73  /.  int iCellLas
9820: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
9830: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
9840: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a  cell index */...
9850: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9860: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
9870: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
9880: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
9890: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
98a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
98b0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
98c0: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   <= SQLITE_MAX_P
98d0: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73  AGE_SIZE );.  as
98e0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
98f0: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
9900: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9910: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
9920: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
9930: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33    temp = sqlite3
9940: 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
9950: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
9960: 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  r);.  data = pPa
9970: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
9980: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
9990: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
99a0: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
99b0: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
99c0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
99d0: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
99e0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
99f0: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62  dr+3]) );.  usab
9a00: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
9a10: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
9a20: 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62 79  .  cbrk = get2by
9a30: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
9a40: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70  ;.  memcpy(&temp
9a50: 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62  [cbrk], &data[cb
9a60: 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20  rk], usableSize 
9a70: 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b 20  - cbrk);.  cbrk 
9a80: 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
9a90: 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
9aa0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c  lOffset + 2*nCel
9ab0: 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  l;.  iCellLast =
9ac0: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
9ad0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
9ae0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
9af0: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
9b00: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
9b10: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
9b20: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
9b30: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
9b40: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
9b50: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73  (pAddr);.    tes
9b60: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
9b70: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
9b80: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
9b90: 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64 65 66  Last );.#if !def
9ba0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
9bb0: 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
9bc0: 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a 20 54  _CHECK).    /* T
9bd0: 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  hese conditions 
9be0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
9bf0: 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74  n verified in bt
9c00: 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20  reeInitPage().  
9c10: 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 45    ** if SQLITE_E
9c20: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
9c30: 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64 65 66  ELL_CHECK is def
9c40: 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ined .    */.   
9c50: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
9c60: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
9c70: 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
9c80: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9c90: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65  T_BKPT;.    }.#e
9ca0: 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
9cb0: 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc>=iCellFirst 
9cc0: 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74  && pc<=iCellLast
9cd0: 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63   );.    size = c
9ce0: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
9cf0: 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20  , &temp[pc]);.  
9d00: 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a    cbrk -= size;.
9d10: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
9d20: 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
9d30: 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20  ZE_CELL_CHECK). 
9d40: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
9d50: 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20  lFirst ){.      
9d60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9d70: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
9d80: 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  }.#else.    if( 
9d90: 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20  cbrk<iCellFirst 
9da0: 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
9db0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
9dc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9dd0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
9de0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
9df0: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
9e00: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
9e10: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
9e20: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
9e30: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
9e40: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
9e50: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
9e60: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
9e70: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62   memcpy(&data[cb
9e80: 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20  rk], &temp[pc], 
9e90: 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62  size);.    put2b
9ea0: 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29  yte(pAddr, cbrk)
9eb0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
9ec0: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
9ed0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
9ee0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72  data[hdr+5], cbr
9ef0: 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31  k);.  data[hdr+1
9f00: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
9f10: 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+2] = 0;.  data
9f20: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d  [hdr+7] = 0;.  m
9f30: 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c  emset(&data[iCel
9f40: 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b  lFirst], 0, cbrk
9f50: 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20  -iCellFirst);.  
9f60: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9f70: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
9f80: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
9f90: 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69 43  );.  if( cbrk-iC
9fa0: 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d  ellFirst!=pPage-
9fb0: 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65  >nFree ){.    re
9fc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9fd0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
9fe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9ff0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
a000: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
a010: 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69  of space from wi
a020: 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  thin the B-Tree 
a030: 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  page passed.** a
a040: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
a050: 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f  ment. Write into
a060: 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78   *pIdx the index
a070: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
a080: 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ta[].** of the f
a090: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c  irst byte of all
a0a0: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65  ocated space. Re
a0b0: 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49  turn either SQLI
a0c0: 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65  TE_OK or.** an e
a0d0: 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c  rror code (usual
a0e0: 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ly SQLITE_CORRUP
a0f0: 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  T)..**.** The ca
a100: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
a110: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75  that there is su
a120: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
a130: 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c  o make the.** al
a140: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  location.  This 
a150: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65  routine might ne
a160: 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74  ed to defragment
a170: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69   in order to bri
a180: 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70  ng.** all the sp
a190: 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f  ace together, ho
a1a0: 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75  wever.  This rou
a1b0: 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20  tine will avoid 
a1c0: 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72  using.** the fir
a1d0: 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73  st two bytes pas
a1e0: 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  t the cell point
a1f0: 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72  er area since pr
a200: 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a  esumably this.**
a210: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62   allocation is b
a220: 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64  eing made in ord
a230: 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e  er to insert a n
a240: 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77  ew cell, so we w
a250: 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20  ill.** also end 
a260: 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77  up needing a new
a270: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
a280: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
a290: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
a2a0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
a2b0: 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29  Byte, int *pIdx)
a2c0: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
a2d0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
a2e0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  fset;    /* Loca
a2f0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
a300: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20  ->hdrOffset */. 
a310: 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
a320: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
a330: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
a340: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  ache of pPage->a
a350: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  Data */.  int to
a360: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
a370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a380: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
a390: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
a3a0: 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20  a */.  int gap; 
a3b0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
a3c0: 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74 77  byte of gap betw
a3d0: 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  een cell pointer
a3e0: 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65  s and cell conte
a3f0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  nt */.  int rc; 
a400: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
a410: 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  er return code *
a420: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
a430: 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69  ze; /* Usable si
a440: 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  ze of the page *
a450: 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73  /.  .  assert( s
a460: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
a470: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
a480: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
a490: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
a4a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
a4b0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
a4c0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
a4d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
a4e0: 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d  Byte>=0 );  /* M
a4f0: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
a500: 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72   is 4 */.  asser
a510: 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  t( pPage->nFree>
a520: 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65  =nByte );.  asse
a530: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
a540: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 75 73 61  flow==0 );.  usa
a550: 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d  bleSize = pPage-
a560: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a570: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
a580: 65 20 3c 20 75 73 61 62 6c 65 53 69 7a 65 2d 38  e < usableSize-8
a590: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
a5a0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
a5b0: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
a5c0: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
a5d0: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
a5e0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
a5f0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
a600: 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36  sert( gap<=65536
a610: 20 29 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   );.  top = get2
a620: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
a630: 5d 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74 6f  ]);.  if( gap>to
a640: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f 70  p ){.    if( top
a650: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 6f 70  ==0 ){.      top
a660: 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65   = 65536;.    }e
a670: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
a680: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
a690: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
a6a0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
a6b0: 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  is enough space 
a6c0: 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20  between gap and 
a6d0: 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65  top for one more
a6e0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20   cell pointer.  
a6f0: 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f  ** array entry o
a700: 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68  ffset, and if th
a710: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f  e freelist is no
a720: 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65  t empty, then se
a730: 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72  arch the.  ** fr
a740: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
a750: 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62  or a free slot b
a760: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
a770: 69 73 66 79 20 74 68 65 20 72 65 71 75 65 73 74  isfy the request
a780: 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
a790: 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b  e( gap+2==top );
a7a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
a7b0: 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +1==top );.  tes
a7c0: 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20  tcase( gap==top 
a7d0: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 3c 3d  );.  if( gap+2<=
a7e0: 74 6f 70 20 26 26 20 28 64 61 74 61 5b 68 64 72  top && (data[hdr
a7f0: 2b 31 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b  +1] || data[hdr+
a800: 32 5d 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 70  2]) ){.    int p
a810: 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f 72  c, addr;.    for
a820: 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70 63  (addr=hdr+1; (pc
a830: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a840: 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64 64  a[addr]))>0; add
a850: 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e 74  r=pc){.      int
a860: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
a870: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
a880: 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20   free slot */.  
a890: 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c      if( pc>usabl
a8a0: 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 61 64  eSize-4 || pc<ad
a8b0: 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20  dr+4 ){.        
a8c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
a8d0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a8e0: 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65 20 3d    }.      size =
a8f0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a900: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  pc+2]);.      if
a910: 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b  ( size>=nByte ){
a920: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d  .        int x =
a930: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20   size - nByte;. 
a940: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
a950: 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20   x==4 );.       
a960: 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20   testcase( x==3 
a970: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  );.        if( x
a980: 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <4 ){.          
a990: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 37 5d 3e  if( data[hdr+7]>
a9a0: 3d 36 30 20 29 20 67 6f 74 6f 20 64 65 66 72 61  =60 ) goto defra
a9b0: 67 6d 65 6e 74 5f 70 61 67 65 3b 0a 20 20 20 20  gment_page;.    
a9c0: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
a9d0: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
a9e0: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
a9f0: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
aa00: 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  f.          ** f
aa10: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
aa20: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
aa30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
aa40: 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d  mcpy(&data[addr]
aa50: 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b  , &data[pc], 2);
aa60: 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b  .          data[
aa70: 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b  hdr+7] += (u8)x;
aa80: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
aa90: 66 28 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61  f( size+pc > usa
aaa0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
aab0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
aac0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
aad0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
aae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
aaf0: 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e   slot remains on
ab00: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
ab10: 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20  Reduce its size 
ab20: 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20  to account.     
ab30: 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
ab40: 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20  portion used by 
ab50: 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
ab60: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  on. */.         
ab70: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ab80: 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20  pc+2], x);.     
ab90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 49     }.        *pI
aba0: 64 78 20 3d 20 70 63 20 2b 20 78 3b 0a 20 20 20  dx = pc + x;.   
abb0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
abc0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
abd0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
abe0: 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c 64  he request could
abf0: 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c 65   not be fulfille
ac00: 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c 69  d using a freeli
ac10: 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a  st slot.  Check.
ac20: 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 64    ** to see if d
ac30: 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69  efragmentation i
ac40: 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  s necessary..  *
ac50: 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  /.  testcase( ga
ac60: 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29  p+2+nByte==top )
ac70: 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42  ;.  if( gap+2+nB
ac80: 79 74 65 3e 74 6f 70 20 29 7b 0a 64 65 66 72 61  yte>top ){.defra
ac90: 67 6d 65 6e 74 5f 70 61 67 65 3a 0a 20 20 20 20  gment_page:.    
aca0: 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
acb0: 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
acc0: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
acd0: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
ace0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
acf0: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
ad00: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
ad10: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
ad20: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42    assert( gap+nB
ad30: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
ad40: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
ad50: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
ad60: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
ad70: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
ad80: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
ad90: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
ada0: 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65  area.  The btree
adb0: 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20  InitPage() call 
adc0: 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
add0: 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66   validated the f
ade0: 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20  reelist.  Given 
adf0: 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73  that the freelis
ae00: 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72  t is valid, ther
ae10: 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79  e.  ** is no way
ae20: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
ae30: 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20  tion can extend 
ae40: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
ae50: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68  he page..  ** Th
ae60: 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
ae70: 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72   verifies the pr
ae80: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e  evious sentence.
ae90: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e  .  */.  top -= n
aea0: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
aeb0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
aec0: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  op);.  assert( t
aed0: 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74  op+nByte <= (int
aee0: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
aef0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49  bleSize );.  *pI
af00: 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75  dx = top;.  retu
af10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
af20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
af30: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  section of the p
af40: 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74  Page->aData to t
af50: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20  he freelist..** 
af60: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
af70: 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62  f the new free b
af80: 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61  lock is pPage->a
af90: 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20  Data[iStart].** 
afa0: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
afb0: 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69  the block is iSi
afc0: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
afd0: 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f  Adjacent freeblo
afe0: 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65  cks are coalesce
aff0: 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  d..**.** Note th
b000: 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  at even though t
b010: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73  he freeblock lis
b020: 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79  t was checked by
b030: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
b040: 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e  ,.** that routin
b050: 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63  e will not detec
b060: 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65  t overlap betwee
b070: 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  n cells or freeb
b080: 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64  locks.  Nor.** d
b090: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65  oes it detect ce
b0a0: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
b0b0: 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20  s that encrouch 
b0c0: 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65  into the reserve
b0d0: 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68  d bytes.** at th
b0e0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
b0f0: 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69  e.  So do additi
b100: 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  onal corruption 
b110: 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68  checks inside th
b120: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e  is.** routine an
b130: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
b140: 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70  CORRUPT if any p
b150: 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e  roblems are foun
b160: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
b170: 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
b180: 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69  ge *pPage, u16 i
b190: 53 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65  Start, u16 iSize
b1a0: 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20  ){.  u16 iPtr;  
b1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
b1d0: 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20  dress of ptr to 
b1e0: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
b1f0: 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b  /.  u16 iFreeBlk
b200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
b220: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
b230: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
b240: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
b250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b260: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65        /* Page he
b270: 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72  ader size.  0 or
b280: 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72   100 */.  u8 nFr
b290: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ag = 0;         
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2b0: 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20  /* Reduction in 
b2c0: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  fragmentation */
b2d0: 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65  .  u16 iOrigSize
b2e0: 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   = iSize;       
b2f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
b300: 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53  inal value of iS
b310: 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61  ize */.  u32 iLa
b320: 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  st = pPage->pBt-
b330: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f  >usableSize-4; /
b340: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
b350: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
b360: 73 65 74 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e  set */.  u32 iEn
b370: 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69  d = iStart + iSi
b380: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
b390: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
b3a0: 74 20 74 68 65 20 69 53 74 61 72 74 20 62 75 66  t the iStart buf
b3b0: 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  fer */.  unsigne
b3c0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
b3d0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f  Page->aData;   /
b3e0: 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a  * Page content *
b3f0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
b400: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
b410: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
b420: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
b430: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
b440: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
b450: 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f  art>=pPage->hdrO
b460: 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63  ffset+6+pPage->c
b470: 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20  hildPtrSize );. 
b480: 20 61 73 73 65 72 74 28 20 69 45 6e 64 20 3c 3d   assert( iEnd <=
b490: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
b4a0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
b4b0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
b4c0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
b4d0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
b4e0: 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34  assert( iSize>=4
b4f0: 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d   );   /* Minimum
b500: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
b510: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
b520: 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20  art<=iLast );.. 
b530: 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65   /* Overwrite de
b540: 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
b550: 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65  n with zeros whe
b560: 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  n the secure_del
b570: 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  ete.  ** option 
b580: 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
b590: 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
b5a0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
b5b0: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
b5c0: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
b5d0: 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69  [iStart], 0, iSi
b5e0: 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ze);.  }..  /* T
b5f0: 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62  he list of freeb
b600: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
b610: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
b620: 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a  .  Find the .  *
b630: 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69  * spot on the li
b640: 73 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20  st where iStart 
b650: 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
b660: 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d  ed..  */.  hdr =
b670: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
b680: 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20  t;.  iPtr = hdr 
b690: 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b  + 1;.  if( data[
b6a0: 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61  iPtr+1]==0 && da
b6b0: 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20  ta[iPtr]==0 ){. 
b6c0: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b     iFreeBlk = 0;
b6d0: 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f    /* Shortcut fo
b6e0: 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20  r the case when 
b6f0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
b700: 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65  empty */.  }else
b710: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46  {.    while( (iF
b720: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
b730: 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3e  e(&data[iPtr]))>
b740: 30 20 26 26 20 69 46 72 65 65 42 6c 6b 3c 69 53  0 && iFreeBlk<iS
b750: 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66  tart ){.      if
b760: 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b  ( iFreeBlk<iPtr+
b770: 34 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  4 ) return SQLIT
b780: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b790: 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72        iPtr = iFr
b7a0: 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eeBlk;.    }.   
b7b0: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c   if( iFreeBlk>iL
b7c0: 61 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ast ) return SQL
b7d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b7e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46  ;.    assert( iF
b7f0: 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69  reeBlk>iPtr || i
b800: 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20  FreeBlk==0 );.  
b810: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
b820: 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20  point:.    **   
b830: 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72   iFreeBlk:   Fir
b840: 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74  st freeblock aft
b850: 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65  er iStart, or ze
b860: 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a  ro if none.    *
b870: 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20  *    iPtr:      
b880: 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   The address of 
b890: 61 20 70 6f 69 6e 74 65 72 20 69 46 72 65 65 42  a pointer iFreeB
b8a0: 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  lk.    **.    **
b8b0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
b8c0: 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64   iFreeBlk should
b8d0: 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e   be coalesced on
b8e0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53  to the end of iS
b8f0: 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tart..    */.   
b900: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26   if( iFreeBlk &&
b910: 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c   iEnd+3>=iFreeBl
b920: 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67  k ){.      nFrag
b930: 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45   = iFreeBlk - iE
b940: 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  nd;.      if( iE
b950: 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65  nd>iFreeBlk ) re
b960: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b970: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
b980: 69 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20  iEnd = iFreeBlk 
b990: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
b9a0: 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20  [iFreeBlk+2]);. 
b9b0: 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e       iSize = iEn
b9c0: 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20  d - iStart;.    
b9d0: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74    iFreeBlk = get
b9e0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
b9f0: 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  eBlk]);.    }.  
ba00: 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20  .    /* If iPtr 
ba10: 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62  is another freeb
ba20: 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69  lock (that is, i
ba30: 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68  f iPtr is not th
ba40: 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a  e freelist.    *
ba50: 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  * pointer in the
ba60: 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68   page header) th
ba70: 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  en check to see 
ba80: 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  if iStart should
ba90: 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65   be.    ** coale
baa0: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
bab0: 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a  d of iPtr..    *
bac0: 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68  /.    if( iPtr>h
bad0: 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  dr+1 ){.      in
bae0: 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72  t iPtrEnd = iPtr
baf0: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
bb00: 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20  a[iPtr+2]);.    
bb10: 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e    if( iPtrEnd+3>
bb20: 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  =iStart ){.     
bb30: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69     if( iPtrEnd>i
bb40: 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53  Start ) return S
bb50: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
bb60: 50 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61  PT;.        nFra
bb70: 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50  g += iStart - iP
bb80: 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69  trEnd;.        i
bb90: 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50  Size = iEnd - iP
bba0: 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  tr;.        iSta
bbb0: 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20  rt = iPtr;.     
bbc0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
bbd0: 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b   nFrag>data[hdr+
bbe0: 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  7] ) return SQLI
bbf0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
bc00: 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
bc10: 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20   -= nFrag;.  }. 
bc20: 20 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65 74   if( iStart==get
bc30: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
bc40: 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  5]) ){.    /* Th
bc50: 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20  e new freeblock 
bc60: 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  is at the beginn
bc70: 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ing of the cell 
bc80: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20  content area,.  
bc90: 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74    ** so just ext
bca0: 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  end the cell con
bcb0: 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72  tent area rather
bcc0: 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f   than create ano
bcd0: 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65  ther.    ** free
bce0: 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  list entry */.  
bcf0: 20 20 69 66 28 20 69 50 74 72 21 3d 68 64 72 2b    if( iPtr!=hdr+
bd00: 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
bd10: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
bd20: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
bd30: 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65  ta[hdr+1], iFree
bd40: 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79  Blk);.    put2by
bd50: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
bd60: 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b   iEnd);.  }else{
bd70: 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
bd80: 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
bd90: 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69   into the freeli
bda0: 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79  st */.    put2by
bdb0: 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20  te(&data[iPtr], 
bdc0: 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75 74  iStart);.    put
bdd0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
bde0: 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a  rt], iFreeBlk);.
bdf0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
be00: 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53  ta[iStart+2], iS
be10: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ize);.  }.  pPag
be20: 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69  e->nFree += iOri
be30: 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  gSize;.  return 
be40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
be50: 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66  .** Decode the f
be60: 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66  lags byte (the f
be70: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
be80: 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70   header) for a p
be90: 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  age.** and initi
bea0: 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20  alize fields of 
beb0: 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
bec0: 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c  cture accordingl
bed0: 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  y..**.** Only th
bee0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
bef0: 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70  inations are sup
bf00: 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e  ported.  Anythin
bf10: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69  g different.** i
bf20: 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75  ndicates a corru
bf30: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
bf40: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
bf50: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a   PTF_ZERODATA.**
bf60: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
bf70: 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46  ODATA | PTF_LEAF
bf80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
bf90: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
bfa0: 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20  NTKEY.**        
bfb0: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
bfc0: 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46  PTF_INTKEY | PTF
bfd0: 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20  _LEAF.*/.static 
bfe0: 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28  int decodeFlags(
bff0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
c000: 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20  int flagByte){. 
c010: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
c020: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
c030: 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a   pPage->pBt */..
c040: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
c050: 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61  >hdrOffset==(pPa
c060: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
c070: 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65  0 : 0) );.  asse
c080: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
c090: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
c0a0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
c0b0: 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38  Page->leaf = (u8
c0c0: 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20  )(flagByte>>3); 
c0d0: 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41   assert( PTF_LEA
c0e0: 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66  F == 1<<3 );.  f
c0f0: 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f  lagByte &= ~PTF_
c100: 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63  LEAF;.  pPage->c
c110: 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d  hildPtrSize = 4-
c120: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
c130: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
c140: 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74  t;.  if( flagByt
c150: 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41  e==(PTF_LEAFDATA
c160: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29   | PTF_INTKEY) )
c170: 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  {.    pPage->int
c180: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  Key = 1;.    pPa
c190: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d  ge->intKeyLeaf =
c1a0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
c1b0: 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f    pPage->noPaylo
c1c0: 61 64 20 3d 20 21 70 50 61 67 65 2d 3e 6c 65 61  ad = !pPage->lea
c1d0: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  f;.    pPage->ma
c1e0: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
c1f0: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
c200: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
c210: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
c220: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
c230: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
c240: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
c250: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ey = 0;.    pPag
c260: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
c270: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f  0;.    pPage->no
c280: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
c290: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
c2a0: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
c2b0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
c2c0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
c2d0: 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
c2e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c2f0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
c300: 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78    }.  pPage->max
c310: 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70  1bytePayload = p
c320: 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
c330: 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  oad;.  return SQ
c340: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
c350: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
c360: 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
c370: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73  mation for a dis
c380: 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52  k block..**.** R
c390: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
c3a0: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
c3b0: 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20  we see that the 
c3c0: 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  page does.** not
c3d0: 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d   contain a well-
c3e0: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
c3f0: 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72  page, then retur
c400: 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  n .** SQLITE_COR
c410: 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74  RUPT.  Note that
c420: 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c   a return of SQL
c430: 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a  ITE_OK does not.
c440: 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ** guarantee tha
c450: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65  t the page is we
c460: 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f  ll-formed.  It o
c470: 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a  nly shows that.*
c480: 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64  * we failed to d
c490: 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70  etect any corrup
c4a0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
c4b0: 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67  int btreeInitPag
c4c0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
c4d0: 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  ){..  assert( pP
c4e0: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
c4f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c500: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
c510: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
c520: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
c530: 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
c540: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
c550: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c560: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
c570: 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ge == sqlite3Pag
c580: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
c590: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
c5a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
c5b0: 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50  Data == sqlite3P
c5c0: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
c5d0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
c5e0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73    if( !pPage->is
c5f0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20  Init ){.    u16 
c600: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pc;            /
c610: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66  * Address of a f
c620: 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20  reeblock within 
c630: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a  pPage->aData[] *
c640: 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20 20  /.    u8 hdr;   
c650: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
c660: 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20  et to beginning 
c670: 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
c680: 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20  /.    u8 *data; 
c690: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
c6a0: 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
c6b0: 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65  a */.    BtShare
c6c0: 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f  d *pBt;        /
c6d0: 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65  * The main btree
c6e0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
c6f0: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
c700: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
c710: 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f  f usable space o
c720: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
c730: 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65     u16 cellOffse
c740: 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
c750: 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
c760: 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
c770: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
c780: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
c790: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c7a0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
c7b0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
c7c0: 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20  int top;        
c7d0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
c7e0: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
c7f0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20  tent area */.   
c800: 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b   int iCellFirst;
c810: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
c820: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66  owable cell or f
c830: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
c840: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
c850: 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73  Last;     /* Las
c860: 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
c870: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
c880: 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20  set */..    pBt 
c890: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20  = pPage->pBt;.. 
c8a0: 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e     hdr = pPage->
c8b0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64  hdrOffset;.    d
c8c0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
c8d0: 74 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f  ta;.    if( deco
c8e0: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64  deFlags(pPage, d
c8f0: 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75  ata[hdr]) ) retu
c900: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c910: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65  T_BKPT;.    asse
c920: 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
c930: 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
c940: 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29  ageSize<=65536 )
c950: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73  ;.    pPage->mas
c960: 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42  kPage = (u16)(pB
c970: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29  t->pageSize - 1)
c980: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76  ;.    pPage->nOv
c990: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
c9a0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
c9b0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
c9c0: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
c9d0: 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  set = cellOffset
c9e0: 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a   = hdr + 12 - 4*
c9f0: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20  pPage->leaf;.   
ca00: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
ca10: 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53   = &data[usableS
ca20: 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d  ize];.    pPage-
ca30: 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
ca40: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20  a[cellOffset];. 
ca50: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
ca60: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
ca70: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67  dr+5]);.    pPag
ca80: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  e->nCell = get2b
ca90: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
caa0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
cab0: 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28  ->nCell>MX_CELL(
cac0: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
cad0: 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66   To many cells f
cae0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  or a single page
caf0: 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74  .  The page must
cb00: 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20   be corrupt */. 
cb10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
cb20: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
cb30: 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
cb40: 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ase( pPage->nCel
cb50: 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  l==MX_CELL(pBt) 
cb60: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c  );..    /* A mal
cb70: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
cb80: 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73 65  page might cause
cb90: 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73 74   us to read past
cba0: 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20   the end.    ** 
cbb0: 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72  of page when par
cbc0: 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20  sing a cell.  . 
cbd0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
cbe0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
cbf0: 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20   of code checks 
cc00: 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20  early to see if 
cc10: 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20  a cell extends. 
cc20: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
cc30: 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75  nd of a page bou
cc40: 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73  ndary and causes
cc50: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
cc60: 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65  to be .    ** re
cc70: 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65  turned if it doe
cc80: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43  s..    */.    iC
cc90: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
cca0: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
ccb0: 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c  >nCell;.    iCel
ccc0: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
ccd0: 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64 65 66 69  ze - 4;.#if defi
cce0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
ccf0: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
cd00: 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20  CHECK).    {.   
cd10: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
cd20: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
cd30: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
cd40: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  ter array */.   
cd50: 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20     int sz;      
cd60: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
cd70: 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20  a cell */..     
cd80: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
cd90: 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b  f ) iCellLast--;
cda0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
cdb0: 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
cdc0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63  i++){.        pc
cdd0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
cde0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32  a[cellOffset+i*2
cdf0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
ce00: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
ce10: 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  irst );.        
ce20: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
ce30: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20  ellLast );.     
ce40: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
ce50: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
ce60: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
ce70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ce80: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ce90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cea0: 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  sz = cellSizePtr
ceb0: 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
cec0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
ced0: 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
cee0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
cef0: 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61     if( pc+sz>usa
cf00: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
cf10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
cf20: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
cf30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cf40: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   }.      if( !pP
cf50: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
cf60: 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20  lLast++;.    }  
cf70: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
cf80: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
cf90: 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
cfa0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
cfb0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
cfc0: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
cfd0: 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
cfe0: 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20  r+7] + top;.    
cff0: 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20  while( pc>0 ){. 
d000: 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73       u16 next, s
d010: 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
d020: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
d030: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
d040: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
d050: 20 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b 20 69   of free block i
d060: 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a  s off the page *
d070: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
d080: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d090: 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
d0a0: 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32       next = get2
d0b0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b  byte(&data[pc]);
d0c0: 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65  .      size = ge
d0d0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
d0e0: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  2]);.      if( (
d0f0: 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d  next>0 && next<=
d100: 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63  pc+size+3) || pc
d110: 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65  +size>usableSize
d120: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
d130: 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20  ree blocks must 
d140: 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  be in ascending 
d150: 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c  order. And the l
d160: 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20  ast byte of.    
d170: 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d      ** the free-
d180: 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f  block must lie o
d190: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  n the database p
d1a0: 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
d1b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d1c0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
d1d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65      }.      nFre
d1e0: 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65  e = nFree + size
d1f0: 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78  ;.      pc = nex
d200: 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  t;.    }..    /*
d210: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
d220: 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74  nFree contains t
d230: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66  he sum of the of
d240: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
d250: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
d260: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
d270: 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65  a plus the numbe
d280: 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
d290: 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68  within.    ** th
d2a0: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
d2b0: 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20  rea. If this is 
d2c0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
d2d0: 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20   usable-size.   
d2e0: 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c   ** of the page,
d2f0: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
d300: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  ust be corrupted
d310: 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73  . This check als
d320: 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20  o.    ** serves 
d330: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
d340: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
d350: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
d360: 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  ll-content.    *
d370: 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e  * area, accordin
d380: 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  g to the page he
d390: 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69  ader, lies withi
d3a0: 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20  n the page..    
d3b0: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  */.    if( nFree
d3c0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
d3d0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d3e0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d3f0: 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67   .    }.    pPag
d400: 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
d410: 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69  (nFree - iCellFi
d420: 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  rst);.    pPage-
d430: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d  >isInit = 1;.  }
d440: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d450: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
d460: 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
d470: 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
d480: 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
d490: 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
d4a0: 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
d4b0: 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
d4c0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
d4d0: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
d4e0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
d4f0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
d500: 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
d510: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
d520: 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
d530: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d540: 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
d550: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d560: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
d570: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d580: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
d590: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d5a0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
d5b0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d5c0: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
d5d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
d5e0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
d5f0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d600: 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
d610: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
d620: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
d630: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
d640: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d650: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
d660: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
d670: 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
d680: 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
d690: 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73  LETE ){.    mems
d6a0: 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30  et(&data[hdr], 0
d6b0: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
d6c0: 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20  e - hdr);.  }.  
d6d0: 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61  data[hdr] = (cha
d6e0: 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74  r)flags;.  first
d6f0: 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73   = hdr + ((flags
d700: 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20  &PTF_LEAF)==0 ? 
d710: 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65  12 : 8);.  memse
d720: 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
d730: 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64  0, 4);.  data[hd
d740: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32  r+7] = 0;.  put2
d750: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
d760: 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
d770: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
d780: 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  ree = (u16)(pBt-
d790: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
d7a0: 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c  rst);.  decodeFl
d7b0: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
d7c0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  );.  pPage->cell
d7d0: 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a  Offset = first;.
d7e0: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e    pPage->aDataEn
d7f0: 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75  d = &data[pBt->u
d800: 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50  sableSize];.  pP
d810: 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20  age->aCellIdx = 
d820: 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20  &data[first];.  
d830: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
d840: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
d850: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
d860: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
d870: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
d880: 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
d890: 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67  = (u16)(pBt->pag
d8a0: 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50  eSize - 1);.  pP
d8b0: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
d8c0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
d8d0: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  = 1;.}.../*.** C
d8e0: 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20  onvert a DbPage 
d8f0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68  obtained from th
d900: 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d  e pager into a M
d910: 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a  emPage used by.*
d920: 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  * the btree laye
d930: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  r..*/.static Mem
d940: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46  Page *btreePageF
d950: 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65  romDbPage(DbPage
d960: 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20   *pDbPage, Pgno 
d970: 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a  pgno, BtShared *
d980: 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
d990: 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  *pPage = (MemPag
d9a0: 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
d9b0: 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
d9c0: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
d9d0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
d9e0: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
d9f0: 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  .  pPage->pDbPag
da00: 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70  e = pDbPage;.  p
da10: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
da20: 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d  .  pPage->pgno =
da30: 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e   pgno;.  pPage->
da40: 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  hdrOffset = pPag
da50: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
da60: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   : 0;.  return p
da70: 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
da80: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
da90: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
daa0: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
dab0: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
dac0: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
dad0: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
dae0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43  **.** If the noC
daf0: 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73  ontent flag is s
db00: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
db10: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
db20: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
db30: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
db40: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
db50: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
db60: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
db70: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
db80: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
db90: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
dba0: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
dbb0: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
dbc0: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
dbd0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
dbe0: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
dbf0: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
dc00: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
dc10: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
dc20: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
dc30: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
dc40: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
dc50: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
dc60: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
dc70: 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
dc80: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
dc90: 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
dca0: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
dcb0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
dcc0: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
dcd0: 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
dce0: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
dcf0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
dd00: 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
dd10: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ter */.  int fla
dd20: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
dd30: 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
dd40: 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45  TENT or PAGER_GE
dd50: 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b  T_READONLY */.){
dd60: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
dd70: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20  age *pDbPage;.. 
dd80: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
dd90: 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45  0 || flags==PAGE
dda0: 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
ddb0: 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f  || flags==PAGER_
ddc0: 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a  GET_READONLY );.
ddd0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
dde0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
ddf0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
de00: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
de10: 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
de20: 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
de30: 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c  e**)&pDbPage, fl
de40: 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ags);.  if( rc )
de50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
de60: 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
de70: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
de80: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
de90: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
dea0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
deb0: 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
dec0: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
ded0: 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
dee0: 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
def0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
df00: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
df10: 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
df20: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
df30: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
df40: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
df50: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
df60: 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
df70: 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
df80: 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
df90: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
dfa0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
dfb0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
dfc0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
dfd0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
dfe0: 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
dff0: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
e000: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
e010: 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
e020: 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
e030: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
e040: 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
e050: 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
e060: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
e070: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
e080: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e090: 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
e0a0: 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
e0b0: 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
e0c0: 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
e0d0: 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
e0e0: 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61  tic Pgno btreePa
e0f0: 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
e100: 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e   *pBt){.  return
e110: 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75   pBt->nPage;.}.u
e120: 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  32 sqlite3BtreeL
e130: 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70  astPage(Btree *p
e140: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
e150: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
e160: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
e170: 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50  rt( ((p->pBt->nP
e180: 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29 3d  age)&0x8000000)=
e190: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  =0 );.  return b
e1a0: 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d  treePagecount(p-
e1b0: 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pBt);.}../*.** 
e1c0: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
e1d0: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
e1e0: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
e1f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75  is routine is ju
e200: 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65  st a.** convenie
e210: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
e220: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
e230: 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67  s to btreeGetPag
e240: 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65  e() and .** btre
e250: 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a  eInitPage()..**.
e260: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
e270: 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
e280: 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73  value *ppPage is
e290: 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66   set to is undef
e2a0: 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20  ined. It.** may 
e2b0: 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
e2c0: 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73  , or it may be s
e2d0: 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  et to an invalid
e2e0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
e2f0: 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
e300: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
e310: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
e320: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
e330: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
e340: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e360: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
e370: 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
e380: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
e390: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
e3a0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
e3b0: 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65   page pointer he
e3c0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61  re */.  int bRea
e3d0: 64 6f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20  donly           
e3e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
e3f0: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 6f 72  _GET_READONLY or
e400: 20 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72   0 */.){.  int r
e410: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  c;.  assert( sql
e420: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e430: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
e440: 20 61 73 73 65 72 74 28 20 62 52 65 61 64 6f 6e   assert( bReadon
e450: 6c 79 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45  ly==PAGER_GET_RE
e460: 41 44 4f 4e 4c 59 20 7c 7c 20 62 52 65 61 64 6f  ADONLY || bReado
e470: 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  nly==0 );..  if(
e480: 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63   pgno>btreePagec
e490: 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
e4a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
e4b0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c  RUPT_BKPT;.  }el
e4c0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  se{.    rc = btr
e4d0: 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
e4e0: 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 52 65  gno, ppPage, bRe
e4f0: 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 69 66 28  adonly);.    if(
e500: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
e510: 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  & (*ppPage)->isI
e520: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nit==0 ){.      
e530: 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
e540: 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
e550: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e560: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
e570: 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
e580: 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
e590: 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63    }.  }..  testc
e5a0: 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a  ase( pgno==0 );.
e5b0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
e5c0: 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
e5d0: 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74  CORRUPT );.  ret
e5e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
e5f0: 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61   Release a MemPa
e600: 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ge.  This should
e610: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   be called once 
e620: 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a  for each prior.*
e630: 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47  * call to btreeG
e640: 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  etPage..*/.stati
e650: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
e660: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
e670: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
e680: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
e690: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
e6a0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
e6b0: 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73  ->pBt );.    ass
e6c0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50  ert( pPage->pDbP
e6d0: 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  age!=0 );.    as
e6e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
e6f0: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
e700: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
e710: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
e720: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e730: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
e740: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
e750: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
e760: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
e770: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
e780: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
e790: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
e7a0: 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
e7b0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
e7c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
e7d0: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
e7e0: 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  , when the pager
e7f0: 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61   reloads informa
e800: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61  tion into the ca
e810: 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74  che.** so that t
e820: 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74  he cache is rest
e830: 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
e840: 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68  inal state at th
e850: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
e860: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66  e transaction, f
e870: 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73  or each page res
e880: 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69  tored this routi
e890: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
e8a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e8b0: 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20   needs to reset 
e8c0: 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73  the extra data s
e8d0: 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e  ection at the en
e8e0: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  d of the.** page
e8f0: 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
e900: 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61  he restored data
e910: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e920: 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61   pageReinit(DbPa
e930: 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65  ge *pData){.  Me
e940: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
e950: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
e960: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
e970: 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
e980: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e990: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
e9a0: 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20  nt(pData)>0 );. 
e9b0: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
e9c0: 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  it ){.    assert
e9d0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e9e0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
e9f0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70  >mutex) );.    p
ea00: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
ea10: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
ea20: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
ea30: 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20  nt(pData)>1 ){. 
ea40: 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69       /* pPage mi
ea50: 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72  ght not be a btr
ea60: 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67  ee page;  it mig
ea70: 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ht be an overflo
ea80: 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
ea90: 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f  or ptrmap page o
eaa0: 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20  r a free page.  
eab0: 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20  In those cases, 
eac0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
ead0: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62      ** call to b
eae0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77  treeInitPage() w
eaf0: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72  ill likely retur
eb00: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
eb10: 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e  ..      ** But n
eb20: 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62  o harm is done b
eb30: 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20  y this.  And it 
eb40: 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e  is very importan
eb50: 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  t that.      ** 
eb60: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
eb70: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65  be called on eve
eb80: 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f  ry btree page so
eb90: 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   we make.      *
eba0: 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65  * the call for e
ebb0: 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63  very page that c
ebc0: 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69  omes in for re-i
ebd0: 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  niting. */.     
ebe0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
ebf0: 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
ec00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
ec10: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
ec20: 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a  r for a btree..*
ec30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
ec40: 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
ec50: 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  ler(void *pArg){
ec60: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
ec70: 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41   = (BtShared*)pA
ec80: 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rg;.  assert( pB
ec90: 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72  t->db );.  asser
eca0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ecb0: 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d  _held(pBt->db->m
ecc0: 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
ecd0: 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  n sqlite3InvokeB
ece0: 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d  usyHandler(&pBt-
ecf0: 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72  >db->busyHandler
ed00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
ed10: 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
ed20: 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
ed30: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
ed40: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
ed50: 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
ed60: 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68  me is NULL.** th
ed70: 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
ed80: 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
ed90: 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65  ted.  The epheme
eda0: 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67  ral database mig
edb0: 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69  ht.** be exclusi
edc0: 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  vely in memory, 
edd0: 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20  or it might use 
ede0: 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d  a disk-based mem
edf0: 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69  ory cache..** Ei
ee00: 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70  ther way, the ep
ee10: 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
ee20: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
ee30: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a  ically deleted .
ee40: 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ** when sqlite3B
ee50: 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
ee60: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
ee70: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
ee80: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
ee90: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
eea0: 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
eeb0: 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
eec0: 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
eed0: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
eee0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66  ed..**.** The "f
eef0: 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20  lags" parameter 
ef00: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61  is a bitmask tha
ef10: 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  t might contain 
ef20: 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52  bits like.** BTR
ef30: 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  EE_OMIT_JOURNAL 
ef40: 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d  and/or BTREE_MEM
ef50: 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ORY..**.** If th
ef60: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
ef70: 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20  ready opened in 
ef80: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
ef90: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
efa0: 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68  and we are in sh
efb0: 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c  ared cache mode,
efc0: 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77   then the open w
efd0: 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e  ill fail with an
efe0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  .** SQLITE_CONST
eff0: 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65  RAINT error.  We
f000: 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77   cannot allow tw
f010: 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72  o or more BtShar
f020: 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e  ed.** objects in
f030: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
f040: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69  se connection si
f050: 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c  nce doing so wil
f060: 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f  l lead.** to pro
f070: 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69  blems with locki
f080: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
f090: 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73  e3BtreeOpen(.  s
f0a0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
f0b0: 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f  ,      /* VFS to
f0c0: 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d   use for this b-
f0d0: 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tree */.  const 
f0e0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
f0f0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
f100: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
f110: 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
f120: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
f130: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
f140: 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
f150: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
f160: 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
f170: 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ree,        /* P
f180: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74  ointer to new Bt
f190: 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74  ree object writt
f1a0: 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  en here */.  int
f1b0: 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
f1c0: 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20       /* Options 
f1d0: 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
f1e0: 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
f1f0: 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
f200: 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
f210: 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
f220: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
f230: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
f240: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
f250: 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
f260: 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
f270: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
f280: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
f290: 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
f2a0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
f2b0: 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20  *mutexOpen = 0; 
f2c0: 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72   /* Prevents a r
f2d0: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54  ace condition. T
f2e0: 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20  icket #3537 */. 
f2f0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
f300: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
f310: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
f320: 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
f330: 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72  n */.  u8 nReser
f340: 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ve;             
f350: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
f360: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   unused space on
f370: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
f380: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
f390: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f  bHeader[100];  /
f3a0: 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
f3b0: 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  r content */..  
f3c0: 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69  /* True if openi
f3d0: 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c  ng an ephemeral,
f3e0: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
f3f0: 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ase */.  const i
f400: 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46  nt isTempDb = zF
f410: 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
f420: 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a  ilename[0]==0;..
f430: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
f440: 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
f450: 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
f460: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
f470: 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
f480: 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
f490: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
f4a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
f4b0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f  IT_MEMORYDB.  co
f4c0: 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
f4d0: 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e  = 0;.#else.  con
f4e0: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
f4f0: 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73   (zFilename && s
f500: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
f510: 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29   ":memory:")==0)
f520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f530: 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65          || (isTe
f540: 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54  mpDb && sqlite3T
f550: 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29  empInMemory(db))
f560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f570: 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46          || (vfsF
f580: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
f590: 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23  EN_MEMORY)!=0;.#
f5a0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
f5b0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
f5c0: 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20  rt( pVfs!=0 );. 
f5d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f5e0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
f5f0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
f600: 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29  rt( (flags&0xff)
f610: 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20  ==flags );   /* 
f620: 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62  flags fit in 8 b
f630: 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c  its */..  /* Onl
f640: 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  y a BTREE_SINGLE
f650: 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
f660: 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
f670: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
f680: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f  lags & BTREE_UNO
f690: 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66  RDERED)==0 || (f
f6a0: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
f6b0: 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  GLE)!=0 );..  /*
f6c0: 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   A BTREE_SINGLE 
f6d0: 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61  database is alwa
f6e0: 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61  ys a temporary a
f6f0: 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20  nd/or ephemeral 
f700: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
f710: 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
f720: 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70  LE)==0 || isTemp
f730: 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d  Db );..  if( isM
f740: 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67  emdb ){.    flag
f750: 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52  s |= BTREE_MEMOR
f760: 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66  Y;.  }.  if( (vf
f770: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
f780: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30  OPEN_MAIN_DB)!=0
f790: 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20   && (isMemdb || 
f7a0: 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20  isTempDb) ){.   
f7b0: 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73   vfsFlags = (vfs
f7c0: 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f  Flags & ~SQLITE_
f7d0: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20  OPEN_MAIN_DB) | 
f7e0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
f7f0: 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  _DB;.  }.  p = s
f800: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
f810: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
f820: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
f830: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
f840: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
f850: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
f860: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
f870: 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
f880: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
f890: 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42  CHE.  p->lock.pB
f8a0: 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c  tree = p;.  p->l
f8b0: 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a  ock.iTable = 1;.
f8c0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
f8d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f8e0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
f8f0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
f900: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
f910: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
f920: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
f930: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
f940: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
f950: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
f960: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
f970: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
f980: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
f990: 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d  .  if( isTempDb=
f9a0: 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d  =0 && (isMemdb==
f9b0: 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53  0 || (vfsFlags&S
f9c0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21  QLITE_OPEN_URI)!
f9d0: 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76  =0) ){.    if( v
f9e0: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
f9f0: 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
fa00: 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E ){.      int n
fa10: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
fa20: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
fa30: 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
fa40: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
fa50: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75  qlite3Malloc(nFu
fa60: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
fa70: 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
fa80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
fa90: 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20  utexShared; ).  
faa0: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
fab0: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21  = 1;.      if( !
fac0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
fad0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
fae0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
faf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fb00: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
fb10: 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62       if( isMemdb
fb20: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
fb30: 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  py(zFullPathname
fb40: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c  , zFilename, sql
fb50: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
fb60: 6c 65 6e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20  lename)+1);.    
fb70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
fb80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
fb90: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
fba0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbd0: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  nFullPathname, z
fbe0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
fbf0: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
fc00: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
fc10: 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
fc20: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
fc30: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
fc40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
fc50: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
fc60: 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  }.      }.#if SQ
fc70: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
fc80: 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20        mutexOpen 
fc90: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
fca0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
fcb0: 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20  _STATIC_OPEN);. 
fcc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
fcd0: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70  ex_enter(mutexOp
fce0: 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  en);.      mutex
fcf0: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
fd00: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
fd10: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
fd20: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
fd30: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
fd40: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
fd50: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72  #endif.      for
fd60: 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
fd70: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
fd80: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
fd90: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
fda0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
fdb0: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
fdc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
fdd0: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
fde0: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
fdf0: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
fe00: 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20  t->pPager, 0)). 
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe20: 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
fe30: 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
fe40: 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
fe50: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
fe60: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
fe70: 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
fe80: 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
fe90: 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
fea0: 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
feb0: 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
fec0: 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
fed0: 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
fee0: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ff00: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ff10: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ff30: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ff40: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
ff50: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ff60: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
ff70: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
ff80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
ff90: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
ffa0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ffb0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
ffc0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ffd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ffe0: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
fff0: 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
10000 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
10010 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
10020 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
10030 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10040 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
10050 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
10060 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
10070 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
10080 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
10090 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
100a0 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
100b0 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
100c0 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
100d0 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
100e0 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
100f0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
10100 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
10110 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
10120 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
10130 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
10140 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
10150 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10160 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
10170 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
10180 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
10190 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
101a0 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
101b0 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
101c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
101d0 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
101e0 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
101f0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
10200 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
10210 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
10220 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
10230 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
10240 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
10250 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
10260 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
10270 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
10280 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
10290 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
102a0 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
102b0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
102c0 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c  sizeof(i64)==8 |
102d0 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34  | sizeof(i64)==4
102e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
102f0 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c  sizeof(u64)==8 |
10300 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34  | sizeof(u64)==4
10310 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
10320 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
10330 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
10340 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
10350 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
10360 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
10370 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
10380 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
10390 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
103a0 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
103b0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
103c0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
103d0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
103e0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
103f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10400 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
10410 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
10420 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58                EX
10440 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c  TRA_SIZE, flags,
10450 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52   vfsFlags, pageR
10460 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  einit);.    if( 
10470 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10480 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
10490 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
104a0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d  pBt->pPager, db-
104b0 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20  >szMmap);.      
104c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
104d0 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
104e0 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
104f0 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
10500 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
10510 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10520 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
10530 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
10540 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ut;.    }.    pB
10550 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28  t->openFlags = (
10560 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42  u8)flags;.    pB
10570 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  t->db = db;.    
10580 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
10590 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
105a0 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76  pPager, btreeInv
105b0 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20  okeBusyHandler, 
105c0 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  pBt);.    p->pBt
105d0 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70   = pBt;.  .    p
105e0 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
105f0 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
10600 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
10610 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
10620 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
10630 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ) ) pBt->btsFlag
10640 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
10650 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  LY;.#ifdef SQLIT
10660 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
10670 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
10680 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
10690 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20  DELETE;.#endif. 
106a0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
106b0 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36   = (zDbHeader[16
106c0 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64  ]<<8) | (zDbHead
106d0 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  er[17]<<16);.   
106e0 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
106f0 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
10700 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
10710 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
10720 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
10730 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
10740 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
10750 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
10760 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
10770 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10780 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
10790 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
107a0 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
107b0 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
107c0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
107d0 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
107e0 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
107f0 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
10800 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
10810 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
10820 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
10830 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
10840 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
10850 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
10860 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
10870 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
10880 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
10890 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
108a0 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
108b0 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
108c0 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
108d0 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
108e0 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
108f0 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
10900 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
10910 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
10920 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
10930 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
10940 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
10950 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
10960 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
10970 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
10980 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
10990 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
109a0 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
109b0 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
109c0 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
109d0 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72  se{.      nReser
109e0 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
109f0 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  0];.      pBt->b
10a00 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
10a10 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
10a20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10a30 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
10a40 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
10a50 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
10a60 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
10a70 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
10a80 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
10a90 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
10aa0 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
10ab0 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
10ac0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
10ad0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
10ae0 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
10af0 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
10b00 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
10b10 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
10b20 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
10b30 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
10b40 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
10b50 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
10b60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
10b70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
10b80 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
10b90 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
10ba0 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a  pageSize */.   .
10bb0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
10bc0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
10bd0 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
10be0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
10bf0 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
10c00 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
10c10 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
10c20 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
10c30 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
10c40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10c50 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
10c60 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
10c70 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
10c80 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a  *mutexShared; ).
10c90 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20        pBt->nRef 
10ca0 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  = 1;.      MUTEX
10cb0 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61  _LOGIC( mutexSha
10cc0 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
10cd0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
10ce0 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
10cf0 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20  ER);).      if( 
10d00 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
10d10 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  E && sqlite3Glob
10d20 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
10d30 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  tex ){.        p
10d40 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  Bt->mutex = sqli
10d50 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
10d60 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
10d70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  ;.        if( pB
10d80 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  t->mutex==0 ){. 
10d90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
10da0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
10db0 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
10dc0 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  Failed = 0;.    
10dd0 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
10de0 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20  _open_out;.     
10df0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10e00 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
10e10 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
10e20 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ed);.      pBt->
10e30 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pNext = GLOBAL(B
10e40 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
10e50 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
10e60 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  ;.      GLOBAL(B
10e70 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
10e80 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
10e90 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71   = pBt;.      sq
10ea0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
10eb0 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
10ec0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
10ed0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
10ee0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
10ef0 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
10f00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10f10 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66  _DISKIO).  /* If
10f20 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75   the new Btree u
10f30 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70  ses a sharable p
10f40 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c  BtShared, then l
10f50 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  ink the new.  **
10f60 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20   Btree into the 
10f70 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72  list of all shar
10f80 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20  able Btrees for 
10f90 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74  the same connect
10fa0 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69  ion..  ** The li
10fb0 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73  st is kept in as
10fc0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
10fd0 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20   pBt address..  
10fe0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  */.  if( p->shar
10ff0 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  able ){.    int 
11000 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53  i;.    Btree *pS
11010 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ib;.    for(i=0;
11020 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
11030 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69  {.      if( (pSi
11040 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  b = db->aDb[i].p
11050 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e  Bt)!=0 && pSib->
11060 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
11070 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
11080 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d  >pPrev ){ pSib =
11090 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a   pSib->pPrev; }.
110a0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
110b0 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a  Bt<pSib->pBt ){.
110c0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
110d0 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  xt = pSib;.     
110e0 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
110f0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69  0;.          pSi
11100 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  b->pPrev = p;.  
11110 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11120 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
11130 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69  ib->pNext && pSi
11140 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d  b->pNext->pBt<p-
11150 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
11160 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d      pSib = pSib-
11170 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
11180 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
11190 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70  >pNext = pSib->p
111a0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
111b0 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b  p->pPrev = pSib;
111c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
111d0 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
111e0 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d         p->pNext-
111f0 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
11200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11210 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20    pSib->pNext = 
11220 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
11230 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11240 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
11250 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20  ndif.  *ppBtree 
11260 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
11270 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
11280 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11290 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
112a0 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
112b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
112c0 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
112d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
112e0 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
112f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11300 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
11310 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
11320 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72    /* If the B-Tr
11330 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ee was successfu
11340 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20  lly opened, set 
11350 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
11360 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20  size to the.    
11370 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
11380 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f  . Except, when o
11390 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69  pening on an exi
113a0 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67  sting shared pag
113b0 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a  er-cache,.    **
113c0 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74   do not change t
113d0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
113e0 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
113f0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
11400 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d  Schema(p, 0, 0)=
11410 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
11420 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
11430 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  size(p->pBt->pPa
11440 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ger, SQLITE_DEFA
11450 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b  ULT_CACHE_SIZE);
11460 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
11470 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20   mutexOpen ){.  
11480 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11490 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74  3_mutex_held(mut
114a0 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73  exOpen) );.    s
114b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
114c0 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
114d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
114e0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
114f0 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  nt the BtShared.
11500 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57  nRef counter.  W
11510 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a  hen it reaches z
11520 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74  ero,.** remove t
11530 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
11540 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73  cture from the s
11550 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65  haring list.  Re
11560 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
11570 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
11580 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65  f counter reache
11590 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  s zero and retur
115a0 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74  n.** false if it
115b0 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69   is still positi
115c0 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ve..*/.static in
115d0 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  t removeFromShar
115e0 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64  ingList(BtShared
115f0 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20   *pBt){.#ifndef 
11600 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
11610 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58  ED_CACHE.  MUTEX
11620 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
11630 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
11640 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ).  BtShared *pL
11650 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
11660 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
11670 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11680 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
11690 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f  tex) );.  MUTEX_
116a0 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
116b0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
116c0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
116d0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
116e0 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
116f0 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
11700 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
11710 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
11720 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
11730 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
11740 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
11750 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
11760 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
11770 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
11780 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
11790 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
117a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
117b0 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
117c0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
117d0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
117e0 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
117f0 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
11800 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
11810 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
11820 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
11830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11840 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
11850 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
11860 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
11870 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
11880 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
11890 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
118a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
118b0 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
118c0 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
118d0 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
118e0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
118f0 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
11900 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
11910 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
11920 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
11930 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
11940 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
11950 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
11960 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
11970 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
11980 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
11990 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d  void allocateTem
119a0 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
119b0 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42  *pBt){.  if( !pB
119c0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
119d0 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
119e0 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
119f0 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67  Malloc( pBt->pag
11a00 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a  eSize );..    /*
11a10 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65 73   One of the uses
11a20 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70 61   of pBt->pTmpSpa
11a30 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74 20  ce is to format 
11a40 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20 20  cells before.   
11a50 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74 68   ** inserting th
11a60 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20 70  em into a leaf p
11a70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66 69  age (function fi
11a80 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a  llInCell()). If.
11a90 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73      ** a cell is
11aa0 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79 74   less than 4 byt
11ab0 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69  es in size, it i
11ac0 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  s rounded up to 
11ad0 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20 62  4 bytes.    ** b
11ae0 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f  y the various ro
11af0 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e 69  utines that mani
11b00 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63 65  pulate binary ce
11b10 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20 2a  lls. Which.    *
11b20 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74 20  * can mean that 
11b30 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c  fillInCell() onl
11b40 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  y initializes th
11b50 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a 20  e first 2 or 3. 
11b60 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70     ** bytes of p
11b70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74 68  TmpSpace, but th
11b80 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20 62  at the first 4 b
11b90 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64 20  ytes are copied 
11ba0 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69  from.    ** it i
11bb0 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 70  nto a database p
11bc0 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  age. This is not
11bd0 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f 62   actually a prob
11be0 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20 20  lem, but it.    
11bf0 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61 20  ** does cause a 
11c00 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20 77  valgrind error w
11c10 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20 62  hen the 1 or 2 b
11c20 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c 69  ytes of unitiali
11c30 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  zed .    ** data
11c40 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73 79   is passed to sy
11c50 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65 28  stem call write(
11c60 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20 74  ). So to avoid t
11c70 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a  his error,.    *
11c80 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74  * zero the first
11c90 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d 70   4 bytes of temp
11ca0 20 73 70 61 63 65 20 68 65 72 65 2e 20 20 2a 2f   space here.  */
11cb0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54  .    if( pBt->pT
11cc0 6d 70 53 70 61 63 65 20 29 20 6d 65 6d 73 65 74  mpSpace ) memset
11cd0 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c  (pBt->pTmpSpace,
11ce0 20 30 2c 20 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   0, 4);.  }.}../
11cf0 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
11d00 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
11d10 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
11d20 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
11d30 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
11d40 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61  Bt){.  sqlite3Pa
11d50 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d  geFree( pBt->pTm
11d60 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e  pSpace);.  pBt->
11d70 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d  pTmpSpace = 0;.}
11d80 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
11d90 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
11da0 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
11db0 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
11dc0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
11dd0 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
11de0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11df0 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
11e00 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
11e10 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
11e20 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
11e30 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
11e40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11e50 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
11e60 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
11e70 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11e80 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  (p);.  pCur = pB
11e90 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
11ea0 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
11eb0 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
11ec0 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
11ed0 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
11ee0 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
11ef0 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
11f00 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
11f10 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
11f20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11f30 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
11f40 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
11f50 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
11f60 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
11f70 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
11f80 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
11f90 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
11fa0 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
11fb0 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
11fc0 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
11fd0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
11fe0 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  ck(p, SQLITE_OK)
11ff0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12000 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
12010 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
12020 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
12030 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
12040 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
12050 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
12060 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
12070 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
12080 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
12090 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
120a0 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
120b0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
120c0 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
120d0 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
120e0 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
120f0 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
12100 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
12110 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
12120 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
12130 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
12140 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
12150 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
12160 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
12170 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
12180 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
12190 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
121a0 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
121b0 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
121c0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
121d0 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
121e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
121f0 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
12200 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
12210 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20  Bt->xFreeSchema 
12220 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  && pBt->pSchema 
12230 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46  ){.      pBt->xF
12240 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70  reeSchema(pBt->p
12250 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
12260 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
12270 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61  (0, pBt->pSchema
12280 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
12290 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
122a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
122b0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
122c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
122d0 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
122e0 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
122f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
12300 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
12310 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
12320 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
12330 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
12340 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
12350 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
12360 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
12370 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
12380 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
12390 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
123a0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
123b0 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
123c0 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65   of pages allowe
123d0 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  d in the cache..
123e0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  **.** The maximu
123f0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  m number of cach
12400 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20 74  e pages is set t
12410 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a  o the absolute.*
12420 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  * value of mxPag
12430 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69 73  e.  If mxPage is
12440 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 70   negative, the p
12450 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65  ager will.** ope
12460 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75  rate asynchronou
12470 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f  sly - it will no
12480 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79  t stop to do fsy
12490 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75  nc()s.** to insu
124a0 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74 74  re data is writt
124b0 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73  en to the disk s
124c0 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a  urface before.**
124d0 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72   continuing.  Tr
124e0 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c  ansactions still
124f0 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f   work if synchro
12500 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20  nous is off,.** 
12510 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
12520 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75   cannot be corru
12530 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72 6f  pted if this pro
12540 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e  gram.** crashes.
12550 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70 65    But if the ope
12560 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72  rating system cr
12570 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20 69  ashes or there i
12580 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70  s.** an abrupt p
12590 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68 65  ower failure whe
125a0 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  n synchronous is
125b0 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62 61   off, the databa
125c0 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c  se.** could be l
125d0 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
125e0 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63  istent and unrec
125f0 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a  overable state..
12600 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69  ** Synchronous i
12610 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20  s on by default 
12620 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  so database corr
12630 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a  uption is not.**
12640 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72   normally a worr
12650 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
12660 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
12670 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
12680 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
12690 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
126a0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
126b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
126c0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
126d0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
126e0 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
126f0 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
12700 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
12710 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
12720 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12730 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12740 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
12750 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
12760 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ZE>0./*.** Chang
12770 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74  e the limit on t
12780 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65  he amount of the
12790 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
127a0 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65  hat may be.** me
127b0 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a  mory mapped..*/.
127c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
127d0 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72  SetMmapLimit(Btr
127e0 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69  ee *p, sqlite3_i
127f0 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20  nt64 szMmap){.  
12800 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
12810 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
12820 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
12830 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
12840 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
12850 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12860 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
12870 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
12880 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20  ager, szMmap);. 
12890 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
128a0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
128b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
128c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41  dif /* SQLITE_MA
128d0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f  X_MMAP_SIZE>0 */
128e0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
128f0 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73  he way data is s
12900 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e  ynced to disk in
12910 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61   order to increa
12920 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a  se or decrease.*
12930 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64  * how well the d
12940 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20  atabase resists 
12950 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
12960 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77   crashes and pow
12970 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20  er.** failures. 
12980 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20   Level 1 is the 
12990 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f  same as asynchro
129a0 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29  nous (no syncs()
129b0 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68   occur and.** th
129c0 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72  ere is a high pr
129d0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
129e0 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73  age)  Level 2 is
129f0 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54   the default.  T
12a00 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72  here.** is a ver
12a10 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65  y low but non-ze
12a20 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ro probability o
12a30 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c  f damage.  Level
12a40 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a   3 reduces the.*
12a50 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  * probability of
12a60 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20   damage to near 
12a70 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20  zero but with a 
12a80 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63  write performanc
12a90 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  e reduction..*/.
12aa0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12ab0 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
12ac0 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  S.int sqlite3Btr
12ad0 65 65 53 65 74 50 61 67 65 72 46 6c 61 67 73 28  eeSetPagerFlags(
12ae0 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
12af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12b00 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74 68   btree to set th
12b10 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f  e safety level o
12b20 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  n */.  unsigned 
12b30 70 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a  pgFlags       /*
12b40 20 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a   Various PAGER_*
12b50 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42   flags */.){.  B
12b60 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
12b70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
12b80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12b90 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
12ba0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
12bb0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
12bc0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c  qlite3PagerSetFl
12bd0 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ags(pBt->pPager,
12be0 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c   pgFlags);.  sql
12bf0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12c00 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12c10 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
12c20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
12c30 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
12c40 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  btree is set to 
12c50 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20  safety level 1. 
12c60 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
12c70 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
12c80 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63  if no sync() occ
12c90 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  urs on the disk 
12ca0 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
12cb0 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
12cc0 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29  sabled(Btree *p)
12cd0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
12ce0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
12cf0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
12d00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
12d10 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
12d20 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42   );  .  sqlite3B
12d30 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12d40 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20 70  assert( pBt && p
12d50 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20  Bt->pPager );.  
12d60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
12d70 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61  rNosync(pBt->pPa
12d80 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ger);.  sqlite3B
12d90 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12da0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12db0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64  .** Change the d
12dc0 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a  efault pages siz
12dd0 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  e and the number
12de0 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
12df0 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20  es per page..** 
12e00 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  Or, if the page 
12e10 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79  size has already
12e20 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74   been fixed, ret
12e30 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
12e40 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20  NLY .** without 
12e50 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e  changing anythin
12e60 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  g..**.** The pag
12e70 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61  e size must be a
12e80 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77   power of 2 betw
12e90 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
12ea0 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a  6.  If the page.
12eb0 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64  ** size supplied
12ec0 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74   does not meet t
12ed0 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  his constraint t
12ee0 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a  hen the page siz
12ef0 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e  e is not.** chan
12f00 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ged..**.** Page 
12f10 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72  sizes are constr
12f20 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  ained to be a po
12f30 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68  wer of two so th
12f40 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a  at the region.**
12f50 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12f60 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c   file used for l
12f70 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e  ocking (beginnin
12f80 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54  g at PENDING_BYT
12f90 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  E,.** the first 
12fa0 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47  byte past the 1G
12fb0 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30  B boundary, 0x40
12fc0 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f  000000) needs to
12fd0 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65   occur.** at the
12fe0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
12ff0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  page..**.** If p
13000 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76  arameter nReserv
13010 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
13020 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ero, then the nu
13030 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
13040 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61  .** bytes per pa
13050 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ge is left uncha
13060 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nged..**.** If t
13070 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20  he iFix!=0 then 
13080 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45  the BTS_PAGESIZE
13090 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20 73  _FIXED flag is s
130a0 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  et so that the p
130b0 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20  age size.** and 
130c0 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20  autovacuum mode 
130d0 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  can no longer be
130e0 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74   changed..*/.int
130f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
13100 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
13110 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c  p, int pageSize,
13120 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69   int nReserve, i
13130 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20  nt iFix){.  int 
13140 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13150 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
13160 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
13170 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31  rt( nReserve>=-1
13180 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
13190 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  5 );.  sqlite3Bt
131a0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
131b0 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
131c0 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
131d0 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  FIXED ){.    sql
131e0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
131f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
13200 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
13210 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76   }.  if( nReserv
13220 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65  e<0 ){.    nRese
13230 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  rve = pBt->pageS
13240 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
13250 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73  eSize;.  }.  ass
13260 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
13270 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
13280 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53  5 );.  if( pageS
13290 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
132a0 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
132b0 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20  _PAGE_SIZE &&.  
132c0 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65        ((pageSize
132d0 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30  -1)&pageSize)==0
132e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
132f0 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
13300 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
13310 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26   !pBt->pPage1 &&
13320 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
13330 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  ;.    pBt->pageS
13340 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53  ize = (u32)pageS
13350 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ize;.    freeTem
13360 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d  pSpace(pBt);.  }
13370 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
13380 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
13390 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
133a0 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
133b0 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75  serve);.  pBt->u
133c0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
133d0 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36  >pageSize - (u16
133e0 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28  )nReserve;.  if(
133f0 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73   iFix ) pBt->bts
13400 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
13410 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73  ESIZE_FIXED;.  s
13420 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
13430 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
13440 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
13450 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
13460 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
13470 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
13480 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
13490 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
134a0 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
134b0 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20 64 65  eSize;.}..#if de
134c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53  fined(SQLITE_HAS
134d0 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69 6e  _CODEC) || defin
134e0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
134f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
13500 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
13510 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  to sqlite3BtreeG
13520 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63  etReserve(), exc
13530 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d  ept that it.** m
13540 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
13550 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61  d if it is guara
13560 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62  nteed that the b
13570 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61  -tree mutex is a
13580 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a  lready.** held..
13590 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  **.** This is us
135a0 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63  eful in one spec
135b0 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20  ial case in the 
135c0 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20  backup API code 
135d0 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b  where it is.** k
135e0 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68  nown that the sh
135f0 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65  ared b-tree mute
13600 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74  x is held, but t
13610 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20  he mutex on the 
13620 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
13630 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
13640 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73   is not. In this
13650 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33   case if sqlite3
13660 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20  BtreeEnter().** 
13670 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65  were to be calle
13680 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c  d, it might coll
13690 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74  ide with some ot
136a0 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  her operation on
136b0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
136c0 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
136d0 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e  s *p, causing un
136e0 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72  defined behavior
136f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13700 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
13710 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29  oMutex(Btree *p)
13720 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
13730 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
13740 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
13750 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
13760 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
13770 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
13780 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
13790 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 20 7c 7c  ITE_HAS_CODEC ||
137a0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
137b0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
137c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
137d0 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
137e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
137f0 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20  T_VACUUM)./*.** 
13800 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
13810 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
13820 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
13830 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  f every page tha
13840 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75  t.** are intentu
13850 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64  ally left unused
13860 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22  .  This is the "
13870 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20  reserved" space 
13880 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74  that is.** somet
13890 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74  imes used by ext
138a0 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20  ensions..*/.int 
138b0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
138c0 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
138d0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
138e0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
138f0 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  );.  n = p->pBt-
13900 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70  >pageSize - p->p
13910 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
13920 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
13930 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
13940 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   n;.}../*.** Set
13950 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
13960 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61  e count for a da
13970 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65  tabase if mxPage
13980 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a   is positive..**
13990 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
139a0 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69  made if mxPage i
139b0 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  s 0 or negative.
139c0 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
139d0 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  f the value of m
139e0 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
139f0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
13a00 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
13a10 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65  ite3BtreeMaxPage
13a20 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  Count(Btree *p, 
13a30 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
13a40 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
13a50 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
13a60 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  n = sqlite3Pager
13a70 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e  MaxPageCount(p->
13a80 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
13a90 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
13aa0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
13ab0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
13ac0 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f 53  ** Set the BTS_S
13ad0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61  ECURE_DELETE fla
13ae0 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20  g if newFlag is 
13af0 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46  0 or 1.  If newF
13b00 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68  lag is -1,.** th
13b10 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  en make no chang
13b20 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  es.  Always retu
13b30 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
13b40 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44  the BTS_SECURE_D
13b50 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67  ELETE.** setting
13b60 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67   after the chang
13b70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
13b80 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65  3BtreeSecureDele
13b90 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  te(Btree *p, int
13ba0 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74   newFlag){.  int
13bb0 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   b;.  if( p==0 )
13bc0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
13bd0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
13be0 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67  );.  if( newFlag
13bf0 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42  >=0 ){.    p->pB
13c00 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
13c10 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
13c20 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c  E;.    if( newFl
13c30 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73  ag ) p->pBt->bts
13c40 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
13c50 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20  URE_DELETE;.  } 
13c60 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e  .  b = (p->pBt->
13c70 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
13c80 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30  ECURE_DELETE)!=0
13c90 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13ca0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
13cb0 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn b;.}.#endif /
13cc0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
13cd0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
13ce0 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
13cf0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
13d00 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  CUUM) */../*.** 
13d10 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f  Change the 'auto
13d20 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
13d30 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
13d40 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56  e. If the 'autoV
13d50 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65  acuum'.** parame
13d60 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
13d70 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75   then auto-vacuu
13d80 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65  m mode is enable
13d90 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a  d. If zero, it.*
13da0 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54  * is disabled. T
13db0 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
13dc0 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61   for the auto-va
13dd0 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73  cuum property is
13de0 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
13df0 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45  by the SQLITE_DE
13e00 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
13e10 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73   macro..*/.int s
13e20 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75  qlite3BtreeSetAu
13e30 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
13e40 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  p, int autoVacuu
13e50 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m){.#ifdef SQLIT
13e60 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
13e70 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  M.  return SQLIT
13e80 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73  E_READONLY;.#els
13e90 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  e.  BtShared *pB
13ea0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
13eb0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13ec0 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29  ;.  u8 av = (u8)
13ed0 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73  autoVacuum;..  s
13ee0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13ef0 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d  (p);.  if( (pBt-
13f00 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
13f10 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21  PAGESIZE_FIXED)!
13f20 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21  =0 && (av ?1:0)!
13f30 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  =pBt->autoVacuum
13f40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
13f50 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
13f60 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
13f70 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20  autoVacuum = av 
13f80 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69  ?1:0;.    pBt->i
13f90 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d  ncrVacuum = av==
13fa0 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71  2 ?1:0;.  }.  sq
13fb0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
13fc0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
13fd0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
13fe0 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
13ff0 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
14000 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
14010 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
14020 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
14030 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
14040 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
14050 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
14060 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
14070 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
14080 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
14090 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
140a0 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
140b0 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
140c0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
140d0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
140e0 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
140f0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
14100 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
14110 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
14120 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
14130 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
14140 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
14150 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
14160 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
14170 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
14180 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
14190 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  if.}.../*.** Get
141a0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
141b0 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
141c0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
141d0 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
141e0 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
141f0 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
14200 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
14210 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
14220 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
14230 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
14240 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
14250 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
14260 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
14270 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
14280 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
14290 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
142a0 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
142b0 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
142c0 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
142d0 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
142e0 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
142f0 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
14300 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
14310 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
14320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
14330 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  ult code from su
14340 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  bfunctions */.  
14350 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
14360 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f       /* Page 1 o
14370 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
14380 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
14390 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
143a0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
143b0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
143c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46   */.  int nPageF
143d0 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75  ile = 0;   /* Nu
143e0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
143f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14400 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
14410 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20  eHeader;     /* 
14420 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
14430 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
14440 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72  according to hdr
14450 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
14460 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
14470 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
14480 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
14490 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72  pPage1==0 );.  r
144a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
144b0 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e  SharedLock(pBt->
144c0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
144d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
144e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
144f0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
14500 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
14510 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14520 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
14530 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  rc;..  /* Do som
14540 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
14550 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
14560 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
14570 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
14580 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
14590 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65  e. .  */.  nPage
145a0 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d   = nPageHeader =
145b0 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38   get4byte(28+(u8
145c0 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  *)pPage1->aData)
145d0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
145e0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
145f0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c  Pager, &nPageFil
14600 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d  e);.  if( nPage=
14610 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b  =0 || memcmp(24+
14620 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
14630 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67  ta, 92+(u8*)pPag
14640 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20  e1->aData,4)!=0 
14650 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  ){.    nPage = n
14660 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20  PageFile;.  }.  
14670 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
14680 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b     u32 pageSize;
14690 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53  .    u32 usableS
146a0 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67  ize;.    u8 *pag
146b0 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61  e1 = pPage1->aDa
146c0 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ta;.    rc = SQL
146d0 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
146e0 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
146f0 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
14700 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
14710 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
14720 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23  failed;.    }..#
14730 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
14740 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61  T_WAL.    if( pa
14750 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20  ge1[18]>1 ){.   
14760 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
14770 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
14780 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
14790 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a   page1[19]>1 ){.
147a0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
147b0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
147c0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
147d0 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b  ( page1[18]>2 ){
147e0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
147f0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
14800 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
14810 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32   if( page1[19]>2
14820 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
14830 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
14840 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
14850 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72  If the write ver
14860 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32  sion is set to 2
14870 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  , this database 
14880 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73  should be access
14890 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c  ed.    ** in WAL
148a0 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f   mode. If the lo
148b0 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  g is not already
148c0 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e   open, open it n
148d0 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a  ow. Then .    **
148e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
148f0 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74  K and return wit
14900 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20  hout populating 
14910 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e  BtShared.pPage1.
14920 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
14930 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20  er detects this 
14940 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66  and calls this f
14950 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54  unction again. T
14960 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  his is.    ** re
14970 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65  quired as the ve
14980 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
14990 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
149a0 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20   page1 buffer.  
149b0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
149c0 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
149d0 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62  on - there may b
149e0 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e  e a newer one in
149f0 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20   the log.    ** 
14a00 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
14a10 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d   if( page1[19]==
14a20 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  2 && (pBt->btsFl
14a30 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c  ags & BTS_NO_WAL
14a40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
14a50 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  t isOpen = 0;.  
14a60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14a70 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74  PagerOpenWal(pBt
14a80 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65  ->pPager, &isOpe
14a90 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
14aa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14ab0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
14ac0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
14ad0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
14ae0 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 23 69 66 64  sOpen==0 ){.#ifd
14af0 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
14b00 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45  T_WAL_SAFETYLEVE
14b10 4c 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66  L.        /* Def
14b20 61 75 6c 74 20 74 6f 20 73 70 65 63 69 66 69 65  ault to specifie
14b30 64 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66  d safety_level f
14b40 6f 72 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20  or WAL mode */. 
14b50 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
14b60 64 62 21 3d 30 20 26 26 20 70 42 74 2d 3e 64 62  db!=0 && pBt->db
14b70 2d 3e 61 44 62 21 3d 30 20 29 7b 0a 20 20 20 20  ->aDb!=0 ){.    
14b80 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
14b90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14ba0 20 2a 64 62 20 3d 20 70 42 74 2d 3e 64 62 3b 0a   *db = pBt->db;.
14bb0 20 20 20 20 20 20 20 20 20 20 44 62 20 2a 61 44            Db *aD
14bc0 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 20  b = db->aDb;.   
14bd0 20 20 20 20 20 20 20 75 38 20 6c 65 76 65 6c 20         u8 level 
14be0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 0;.          f
14bf0 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62  or(iDb=0; iDb<db
14c00 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20  ->nDb; iDb++){. 
14c10 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
14c20 44 62 5b 69 44 62 5d 2e 70 42 74 20 26 26 20 61  Db[iDb].pBt && a
14c30 44 62 5b 69 44 62 5d 2e 70 42 74 2d 3e 70 42 74  Db[iDb].pBt->pBt
14c40 3d 3d 70 42 74 20 29 20 62 72 65 61 6b 3b 0a 20  ==pBt ) break;. 
14c50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14c60 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62       assert( iDb
14c70 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  <db->nDb );.    
14c80 20 20 20 20 20 20 6c 65 76 65 6c 20 3d 20 64 62        level = db
14c90 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 61 66 65 74  ->aDb[iDb].safet
14ca0 79 5f 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 20  y_level;.       
14cb0 20 20 20 69 66 28 20 21 53 51 4c 49 54 45 5f 44     if( !SQLITE_D
14cc0 62 53 61 66 65 74 79 4c 65 76 65 6c 49 73 46 69  bSafetyLevelIsFi
14cd0 78 65 64 28 6c 65 76 65 6c 29 20 26 26 20 0a 20  xed(level) && . 
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
14cf0 49 54 45 5f 44 62 53 61 66 65 74 79 4c 65 76 65  ITE_DbSafetyLeve
14d00 6c 56 61 6c 75 65 28 6c 65 76 65 6c 29 20 21 3d  lValue(level) !=
14d10 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14d20 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c 29  WAL_SAFETYLEVEL)
14d30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14d40 61 44 62 5b 69 44 62 5d 2e 73 61 66 65 74 79 5f  aDb[iDb].safety_
14d50 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44  level = SQLITE_D
14d60 45 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54  EFAULT_WAL_SAFET
14d70 59 4c 45 56 45 4c 3b 0a 20 20 20 20 20 20 20 20  YLEVEL;.        
14d80 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
14d90 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70  SetSafetyLevel(p
14da0 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49  Bt->pPager, SQLI
14db0 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  TE_DEFAULT_WAL_S
14dc0 41 46 45 54 59 4c 45 56 45 4c 2c 20 0a 20 20 20  AFETYLEVEL, .   
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14df0 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73 26 53      (db->flags&S
14e00 51 4c 49 54 45 5f 46 75 6c 6c 46 53 79 6e 63 29  QLITE_FullFSync)
14e10 21 3d 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  !=0,.           
14e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e30 20 20 20 20 20 20 20 20 20 20 20 20 28 64 62 2d              (db-
14e40 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6b  >flags&SQLITE_Ck
14e50 70 74 46 75 6c 6c 46 53 79 6e 63 29 21 3d 30 29  ptFullFSync)!=0)
14e60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14e70 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
14e80 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
14e90 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
14ea0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14eb0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
14ec0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14ed0 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65  NOTADB;.    }.#e
14ee0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ndif..    /* The
14ef0 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65   maximum embedde
14f00 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
14f10 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20  be exactly 25%. 
14f20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d   And the minimum
14f30 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64  .    ** embedded
14f40 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
14f50 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68  e 12.5% for both
14f60 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e   leaf-data and n
14f70 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20  on-leaf-data..  
14f80 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
14f90 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
14fa0 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
14fb0 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
14fc0 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
14fd0 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
14fe0 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
14ff0 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
15000 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
15010 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
15020 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
15030 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
15040 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
15050 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20   }.    pageSize 
15060 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29  = (page1[16]<<8)
15070 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31   | (page1[17]<<1
15080 36 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61  6);.    if( ((pa
15090 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
150a0 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70  ze)!=0.     || p
150b0 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
150c0 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  AX_PAGE_SIZE .  
150d0 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d     || pageSize<=
150e0 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  256 .    ){.    
150f0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
15100 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
15110 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
15120 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
15130 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
15140 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
15150 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
15160 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70  (u32)pageSize!=p
15170 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
15180 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
15190 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
151a0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
151b0 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
151c0 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
151d0 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
151e0 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
151f0 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
15200 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
15210 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
15220 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
15230 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
15240 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
15250 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
15260 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
15270 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
15280 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
15290 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
152a0 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
152b0 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
152c0 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
152d0 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
152e0 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
152f0 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65       pBt->usable
15300 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
15310 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
15320 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
15330 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
15340 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
15350 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
15360 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
15370 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
15380 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  t->pageSize,.   
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153b0 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53  pageSize-usableS
153c0 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
153d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
153e0 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66   if( (pBt->db->f
153f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
15400 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26  coveryMode)==0 &
15410 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c  & nPage>nPageFil
15420 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
15430 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
15440 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
15450 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
15460 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
15470 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
15480 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
15490 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
154a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
154b0 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
154c0 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
154d0 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
154e0 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
154f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
15500 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
15510 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
15520 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
15530 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
15540 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
15550 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
15560 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
15570 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
15580 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
15590 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
155a0 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
155b0 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
155c0 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
155d0 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
155e0 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
155f0 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
15600 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
15610 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
15620 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
15630 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
15640 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
15650 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
15660 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
15670 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
15680 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
15690 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
156a0 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
156b0 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
156c0 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
156d0 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
156e0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
156f0 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
15700 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
15710 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
15720 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
15730 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
15740 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
15750 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
15760 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
15770 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
15780 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
15790 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
157a0 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
157b0 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
157c0 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
157d0 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
157e0 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
157f0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
15800 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
15810 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
15820 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
15830 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
15840 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
15850 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
15860 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
15870 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
15880 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
15890 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
158a0 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
158b0 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
158c0 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
158d0 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
158e0 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
158f0 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
15900 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
15910 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
15920 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
15930 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
15940 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
15950 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
15960 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
15970 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
15980 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
15990 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
159a0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
159b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
159c0 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
159d0 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
159e0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
159f0 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
15a00 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
15a10 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
15a20 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
15a30 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
15a40 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
15a50 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
15a60 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
15a70 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
15a80 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
15a90 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
15aa0 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
15ab0 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
15ac0 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
15ad0 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
15ae0 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
15af0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
15b00 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
15b10 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
15b20 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
15b30 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
15b40 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
15b50 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
15b60 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75  he database.  Cu
15b70 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
15b80 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
15b90 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
15ba0 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
15bb0 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
15bc0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
15bd0 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
15be0 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
15bf0 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
15c00 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
15c10 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
15c20 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
15c30 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
15c40 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
15c50 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
15c60 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
15c70 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
15c80 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43  )!=0).     && pC
15c90 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
15ca0 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
15cb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
15cc0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
15cd0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
15ce0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
15cf0 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
15d00 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
15d10 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
15d20 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
15d30 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
15d40 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
15d50 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
15d60 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
15d70 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
15d80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
15d90 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
15da0 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
15db0 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
15dc0 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
15dd0 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
15de0 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
15df0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
15e00 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
15e10 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
15e20 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
15e30 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
15e40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15e50 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
15e60 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
15e70 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
15e80 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20  rsors(pBt,0)==0 
15e90 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
15ea0 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
15eb0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
15ec0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
15ed0 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
15ee0 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
15ef0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
15f00 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
15f10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
15f20 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
15f30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15f40 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
15f50 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
15f60 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
15f70 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  1 = 0;.    relea
15f80 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
15f90 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
15fa0 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  pBt points to an
15fb0 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e   empty file then
15fc0 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d   convert that em
15fd0 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f  pty file.** into
15fe0 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74   a new empty dat
15ff0 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
16000 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
16010 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64  page of.** the d
16020 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
16030 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
16040 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
16050 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
16060 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
16070 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
16080 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
16090 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
160a0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
160b0 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67  .  if( pBt->nPag
160c0 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e>0 ){.    retur
160d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
160e0 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
160f0 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20  age1;.  assert( 
16100 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61  pP1!=0 );.  data
16110 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20   = pP1->aData;. 
16120 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
16130 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62  erWrite(pP1->pDb
16140 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
16150 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
16160 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67  emcpy(data, zMag
16170 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66  icHeader, sizeof
16180 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b  (zMagicHeader));
16190 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
161a0 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d  f(zMagicHeader)=
161b0 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36  =16 );.  data[16
161c0 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70  ] = (u8)((pBt->p
161d0 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66  ageSize>>8)&0xff
161e0 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20  );.  data[17] = 
161f0 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
16200 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a  ize>>16)&0xff);.
16210 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a    data[18] = 1;.
16220 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a    data[19] = 1;.
16230 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
16240 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e  sableSize<=pBt->
16250 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d  pageSize && pBt-
16260 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e  >usableSize+255>
16270 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  =pBt->pageSize);
16280 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75  .  data[20] = (u
16290 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
162a0 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
162b0 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20  ze);.  data[21] 
162c0 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d  = 64;.  data[22]
162d0 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33   = 32;.  data[23
162e0 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74  ] = 32;.  memset
162f0 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
16300 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
16310 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
16320 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
16330 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
16340 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
16350 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
16360 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
16370 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
16380 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  M.  assert( pBt-
16390 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c  >autoVacuum==1 |
163a0 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  | pBt->autoVacuu
163b0 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
163c0 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ( pBt->incrVacuu
163d0 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63  m==1 || pBt->inc
163e0 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  rVacuum==0 );.  
163f0 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
16400 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
16410 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75  utoVacuum);.  pu
16420 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
16430 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63  + 7*4], pBt->inc
16440 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66  rVacuum);.#endif
16450 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
16460 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20  1;.  data[31] = 
16470 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
16480 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16490 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66  Initialize the f
164a0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
164b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
164c0 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61 62  creating a datab
164d0 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e  ase.** consistin
164e0 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  g of a single pa
164f0 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61  ge and no schema
16500 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72   objects). Retur
16510 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  n SQLITE_OK.** i
16520 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
16530 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
16540 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
16550 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16560 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65 20  treeNewDb(Btree 
16570 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
16580 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16590 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
165a0 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63  >nPage = 0;.  rc
165b0 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
165c0 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65  ->pBt);.  sqlite
165d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
165e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
165f0 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
16600 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61   start a new tra
16610 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74  nsaction. A writ
16620 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e-transaction.**
16630 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74   is started if t
16640 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
16650 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f  nt is nonzero, o
16660 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d  therwise a read-
16670 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
16680 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
16690 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72  argument is 2 or
166a0 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73   more and exclus
166b0 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
166c0 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d  on is started, m
166d0 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f  eaning that no o
166e0 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
166f0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63  allowed.** to ac
16700 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
16710 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e  e.  A preexistin
16720 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  g transaction ma
16730 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72  y not be.** upgr
16740 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  aded to exclusiv
16750 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  e by calling thi
16760 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f  s routine a seco
16770 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a  nd time - the.**
16780 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61   exclusivity fla
16790 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  g only works for
167a0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
167b0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74  on..**.** A writ
167c0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
167d0 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
167e0 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
167f0 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  any .** changes 
16800 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
16810 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f    None of the fo
16820 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
16830 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75   .** will work u
16840 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74  nless a transact
16850 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66  ion is started f
16860 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  irst:.**.**     
16870 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
16880 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ateTable().**   
16890 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
168a0 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20  reateIndex().** 
168b0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
168c0 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a  eClearTable().**
168d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
168e0 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a  eeDropTable().**
168f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
16900 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20  eeInsert().**   
16910 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
16920 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20  elete().**      
16930 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
16940 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49  teMeta().**.** I
16950 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74  f an initial att
16960 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20  empt to acquire 
16970 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62  the lock fails b
16980 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63  ecause of lock c
16990 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64  ontention.** and
169a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
169b0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c  s previously unl
169c0 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f  ocked, then invo
169d0 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
169e0 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ler.** if there 
169f0 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20  is one.  But if 
16a00 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f  there was previo
16a10 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  usly a read-lock
16a20 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f  , do not.** invo
16a30 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
16a40 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72  ler - just retur
16a50 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
16a60 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a  SQLITE_BUSY is .
16a70 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e  ** returned when
16a80 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
16a90 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e  y a read-lock in
16aa0 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
16ab0 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  a deadlock..**.*
16ac0 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20  * Suppose there 
16ad0 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  are two processe
16ae0 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61  s A and B.  A ha
16af0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e  s a read lock an
16b00 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73  d B has.** a res
16b10 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74  erved lock.  B t
16b20 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
16b30 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74  to exclusive but
16b40 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61   is blocked beca
16b50 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65  use.** of A's re
16b60 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65  ad lock.  A trie
16b70 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
16b80 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20  reserved but is 
16b90 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a  blocked by B..**
16ba0 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65   One or the othe
16bb0 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f  r of the two pro
16bc0 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65  cesses must give
16bd0 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61   way or there ca
16be0 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72  n be.** no progr
16bf0 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69  ess.  By returni
16c00 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ng SQLITE_BUSY a
16c10 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20  nd not invoking 
16c20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
16c30 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65  k.** when A alre
16c40 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c  ady has a read l
16c50 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67  ock, we encourag
16c60 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61  e A to give up a
16c70 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63  nd let B.** proc
16c80 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  eed..*/.int sqli
16c90 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
16ca0 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ns(Btree *p, int
16cb0 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69   wrflag){.  sqli
16cc0 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b  te3 *pBlock = 0;
16cd0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16ce0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
16cf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16d00 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
16d10 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
16d20 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
16d30 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
16d40 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
16d50 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
16d60 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
16d70 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
16d80 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
16d90 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
16da0 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
16db0 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
16dc0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
16dd0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
16de0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
16df0 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
16e00 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
16e10 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
16e20 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
16e30 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
16e40 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
16e50 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
16e60 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
16e70 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30  >bDoTruncate)==0
16e80 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
16e90 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
16ea0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
16eb0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
16ec0 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28  abase */.  if( (
16ed0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
16ee0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
16ef0 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  0 && wrflag ){. 
16f00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
16f10 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
16f20 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
16f30 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
16f40 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
16f50 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f  ACHE.  /* If ano
16f60 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
16f70 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
16f80 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
16f90 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
16fa0 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
16fb0 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
16fc0 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
16fd0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
16fe0 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65  is.  ** requeste
16ff0 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
17000 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20  _LOCKED..  */.  
17010 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70  if( (wrflag && p
17020 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
17030 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a  n==TRANS_WRITE).
17040 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46     || (pBt->btsF
17050 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
17060 4e 47 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  NG)!=0.  ){.    
17070 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
17080 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c  riter->db;.  }el
17090 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20  se if( wrflag>1 
170a0 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
170b0 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49  Iter;.    for(pI
170c0 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
170d0 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
170e0 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
170f0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
17100 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
17110 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72    pBlock = pIter
17120 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
17130 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17140 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
17150 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20   if( pBlock ){. 
17160 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
17170 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
17180 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  b, pBlock);.    
17190 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
171a0 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
171b0 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
171c0 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  egun;.  }.#endif
171d0 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d  ..  /* Any read-
171e0 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69  only or read-wri
171f0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
17200 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f  mplies a read-lo
17210 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65  ck on .  ** page
17220 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f   1. So if some o
17230 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
17240 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79  e client already
17250 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63   has a write-loc
17260 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20  k .  ** on page 
17270 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  1, the transacti
17280 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  on cannot be ope
17290 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71  ned. */.  rc = q
172a0 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
172b0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54  ableLock(p, MAST
172c0 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f  ER_ROOT, READ_LO
172d0 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  CK);.  if( SQLIT
172e0 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20  E_OK!=rc ) goto 
172f0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20  trans_begun;..  
17300 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
17310 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f   ~BTS_INITIALLY_
17320 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74  EMPTY;.  if( pBt
17330 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74  ->nPage==0 ) pBt
17340 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
17350 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
17360 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  Y;.  do {.    /*
17370 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
17380 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
17390 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
173a0 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
173b0 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
173c0 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
173d0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
173e0 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
173f0 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
17400 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
17410 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
17420 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
17430 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
17440 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
17450 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
17460 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
17470 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
17480 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
17490 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
174a0 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
174b0 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
174c0 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
174d0 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
174e0 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
174f0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
17500 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
17510 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
17520 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
17530 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
17540 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
17550 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17560 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
17570 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
17580 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
17590 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)!=0 ){.     
175a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
175b0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
175c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
175d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
175e0 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72  egin(pBt->pPager
175f0 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65  ,wrflag>1,sqlite
17600 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d  3TempInMemory(p-
17610 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69  >db));.        i
17620 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
17640 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
17650 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Bt);.        }. 
17660 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
17670 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17680 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
17690 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
176a0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
176b0 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46   }while( (rc&0xF
176c0 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  F)==SQLITE_BUSY 
176d0 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
176e0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
176f0 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62  E &&.          b
17700 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
17710 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20  ndler(pBt) );.. 
17720 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17730 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
17740 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
17750 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42  NONE ){.      pB
17760 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b  t->nTransaction+
17770 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
17780 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
17790 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d  CHE.      if( p-
177a0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
177b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
177c0 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26  lock.pBtree==p &
177d0 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65  & p->lock.iTable
177e0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==1 );.        p
177f0 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52  ->lock.eLock = R
17800 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  EAD_LOCK;.      
17810 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20    p->lock.pNext 
17820 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  = pBt->pLock;.  
17830 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b        pBt->pLock
17840 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20   = &p->lock;.   
17850 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
17860 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
17870 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
17880 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
17890 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
178a0 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
178b0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
178c0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
178d0 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
178e0 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ns;.    }.    if
178f0 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrflag ){.    
17900 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
17910 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
17920 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17930 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
17940 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  E.      assert( 
17950 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b  !pBt->pWriter );
17960 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69  .      pBt->pWri
17970 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ter = p;.      p
17980 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
17990 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a  ~BTS_EXCLUSIVE;.
179a0 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
179b0 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  >1 ) pBt->btsFla
179c0 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53  gs |= BTS_EXCLUS
179d0 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  IVE;.#endif..   
179e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d     /* If the db-
179f0 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c  size header fiel
17a00 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28  d is incorrect (
17a10 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20  as it may be if 
17a20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20  an old.      ** 
17a30 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20  client has been 
17a40 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
17a50 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61  base file), upda
17a60 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67  te it now. Doing
17a70 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73  .      ** this s
17a80 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
17a90 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68  n later means th
17aa0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
17ab0 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20  can safely .    
17ac0 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65    ** re-read the
17ad0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
17ae0 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20  rom page 1 if a 
17af0 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61  savepoint or tra
17b00 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  nsaction.      *
17b10 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  * rollback occur
17b20 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61  s within the tra
17b30 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
17b40 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
17b50 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74  ->nPage!=get4byt
17b60 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
17b70 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  [28]) ){.       
17b80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
17b90 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
17ba0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
17bb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17bc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
17bd0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
17be0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
17bf0 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  t->nPage);.     
17c00 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
17c10 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62   }.  }...trans_b
17c20 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d  egun:.  if( rc==
17c30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
17c40 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  lag ){.    /* Th
17c50 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75  is call makes su
17c60 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  re that the page
17c70 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63  r has the correc
17c80 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  t number of.    
17c90 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ** open savepoin
17ca0 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e  ts. If the secon
17cb0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67  d parameter is g
17cc0 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e  reater than 0 an
17cd0 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62  d.    ** the sub
17ce0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20  -journal is not 
17cf0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
17d00 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70  en it will be op
17d10 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a  ened here..    *
17d20 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
17d30 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
17d40 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
17d50 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  , p->db->nSavepo
17d60 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  int);.  }..  btr
17d70 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
17d80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17d90 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
17da0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
17db0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
17dc0 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65  VACUUM../*.** Se
17dd0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
17de0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
17df0 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61  l children of pa
17e00 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20  ge pPage. Also, 
17e10 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74  if.** pPage cont
17e20 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20  ains cells that 
17e30 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
17e40 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65  w pages, set the
17e50 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
17e60 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
17e70 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
17e80 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  s well..*/.stati
17e90 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74  c int setChildPt
17ea0 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70  rmaps(MemPage *p
17eb0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
17ee0 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20  ounter variable 
17ef0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
17f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17f20 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61  r of cells in pa
17f30 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  ge pPage */.  in
17f40 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
17f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f60 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
17f70 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
17f80 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
17f90 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67  .  u8 isInitOrig
17fa0 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
17fb0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
17fc0 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pPage->pgno;..  
17fd0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
17fe0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
17ff0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
18000 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69  .  rc = btreeIni
18010 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
18020 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18030 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  K ){.    goto se
18040 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
18050 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c  out;.  }.  nCell
18060 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
18070 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
18080 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
18090 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
180a0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
180b0 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76  .    ptrmapPutOv
180c0 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
180d0 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69  ll, &rc);..    i
180e0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
180f0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
18100 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
18110 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  te(pCell);.     
18120 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
18130 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
18140 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
18150 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
18160 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
18170 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
18180 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
18190 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
181a0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
181b0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d  et+8]);.    ptrm
181c0 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
181d0 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
181e0 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
181f0 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70    }..set_child_p
18200 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50  trmaps_out:.  pP
18210 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
18220 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75  InitOrig;.  retu
18230 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18240 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
18250 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ge is a pointer 
18260 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20  to page iFrom.  
18270 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
18280 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ter so.** that i
18290 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e  t points to iTo.
182a0 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
182b0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
182c0 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
182d0 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64  o.** be modified
182e0 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  , as  follows:.*
182f0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
18300 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
18310 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
18320 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
18330 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
18340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18350 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
18360 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
18370 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
18380 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
18390 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
183a0 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
183b0 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
183c0 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
183d0 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
183e0 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
183f0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
18400 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
18410 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
18420 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
18430 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
18440 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
18450 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
18460 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
18470 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
18480 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
18490 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
184a0 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
184b0 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
184c0 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  eType){.  assert
184d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
184e0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
184f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
18500 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
18510 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
18520 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
18530 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
18540 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b  MAP_OVERFLOW2 ){
18550 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  .    /* The poin
18560 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68  ter is always th
18570 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
18580 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  of the page in t
18590 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
185a0 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
185b0 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46  Page->aData)!=iF
185c0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rom ){.      ret
185d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
185e0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
185f0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
18600 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a  e->aData, iTo);.
18610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20    }else{.    u8 
18620 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
18630 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20  ge->isInit;.    
18640 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
18650 43 65 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65  Cell;..    btree
18660 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
18670 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  .    nCell = pPa
18680 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  ge->nCell;..    
18690 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
186a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38  ; i++){.      u8
186b0 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
186c0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
186d0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
186e0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
186f0 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  ){.        CellI
18700 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
18710 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
18720 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
18730 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
18740 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
18750 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 20 26 26  flow.         &&
18760 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65   pCell+info.iOve
18770 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e  rflow+3<=pPage->
18780 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73  aData+pPage->mas
18790 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20 20 26  kPage.         &
187a0 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74  & iFrom==get4byt
187b0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
187c0 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20  verflow]).      
187d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
187e0 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  ut4byte(&pCell[i
187f0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20  nfo.iOverflow], 
18800 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
18810 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
18820 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18830 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
18840 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
18850 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
18860 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
18870 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
18880 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
18890 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
188a0 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
188b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
188c0 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
188d0 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
188e0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
188f0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
18900 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
18910 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
18920 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
18930 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
18940 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
18950 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
18960 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
18970 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a  8], iTo);.    }.
18980 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
18990 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
189a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
189b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
189c0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e  ** Move the open
189d0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
189e0 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69  DbPage to locati
189f0 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20  on iFreePage in 
18a00 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
18a10 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65  . The pDbPage re
18a20 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20  ference remains 
18a30 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  valid..**.** The
18a40 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69   isCommit flag i
18a50 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
18a60 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
18a70 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a  o remember that.
18a80 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  ** the journal n
18a90 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
18aa0 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62  )ed before datab
18ab0 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
18ac0 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62  ->pgno .** can b
18ad0 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68  e written to. Th
18ae0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
18af0 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f  eady promised no
18b00 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
18b10 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73  at.** page..*/.s
18b20 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61  tatic int reloca
18b30 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  tePage(.  BtShar
18b40 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
18b50 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20     /* Btree */. 
18b60 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67   MemPage *pDbPag
18b70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  e,        /* Ope
18b80 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  n page to move *
18b90 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18bb0 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70  Pointer map 'typ
18bc0 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  e' entry for pDb
18bd0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
18be0 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20  PtrPage,        
18bf0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
18c00 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72  p 'page-no' entr
18c10 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
18c20 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
18c30 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
18c40 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d  he location to m
18c50 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a  ove pDbPage to *
18c60 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
18c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18c80 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61  isCommit flag pa
18c90 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50  ssed to sqlite3P
18ca0 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a  agerMovepage */.
18cb0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
18cc0 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  trPage;   /* The
18cd0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
18ce0 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
18cf0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
18d00 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62  no iDbPage = pDb
18d10 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61  Page->pgno;.  Pa
18d20 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
18d30 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  t->pPager;.  int
18d40 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
18d50 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
18d60 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65  ERFLOW2 || eType
18d70 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
18d80 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79  W1 || .      eTy
18d90 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
18da0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
18db0 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
18dc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
18dd0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
18de0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
18df0 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74  rt( pDbPage->pBt
18e00 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ==pBt );..  /* M
18e10 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65  ove page iDbPage
18e20 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e   from its curren
18e30 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61  t location to pa
18e40 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50  ge number iFreeP
18e50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28  age */.  TRACE((
18e60 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76  "AUTOVACUUM: Mov
18e70 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70  ing %d to free p
18e80 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65  age %d (ptr page
18e90 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c   %d type %d)\n",
18ea0 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c   .      iDbPage,
18eb0 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72   iFreePage, iPtr
18ec0 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20  Page, eType));. 
18ed0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
18ee0 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65  erMovepage(pPage
18ef0 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50  r, pDbPage->pDbP
18f00 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
18f10 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28  isCommit);.  if(
18f20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18f30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
18f40 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e  .  }.  pDbPage->
18f50 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65  pgno = iFreePage
18f60 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61  ;..  /* If pDbPa
18f70 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70  ge was a btree-p
18f80 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  age, then it may
18f90 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65   have child page
18fa0 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20  s and/or cells. 
18fb0 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
18fc0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
18fd0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  . The pointer ma
18fe0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
18ff0 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67  l these.  ** pag
19000 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  es need to be ch
19010 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  anged..  **.  **
19020 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61   If pDbPage is a
19030 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
19040 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
19050 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72  4 bytes may stor
19060 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  e a.  ** pointer
19070 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74   to a subsequent
19080 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
19090 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
190a0 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74  ase, then.  ** t
190b0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e  he pointer map n
190c0 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
190d0 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65  ed for the subse
190e0 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
190f0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
19100 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
19110 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
19120 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
19130 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
19140 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67  ldPtrmaps(pDbPag
19150 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
19160 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19170 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19180 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
19190 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d   Pgno nextOvfl =
191a0 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67   get4byte(pDbPag
191b0 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  e->aData);.    i
191c0 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29  f( nextOvfl!=0 )
191d0 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
191e0 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c  t(pBt, nextOvfl,
191f0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
19200 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72  2, iFreePage, &r
19210 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
19220 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19230 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
19240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19250 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
19260 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74  e database point
19270 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50  er on page iPtrP
19280 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64  age that pointed
19290 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20   at iDbPage so. 
192a0 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e   ** that it poin
192b0 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e  ts at iFreePage.
192c0 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f   Also fix the po
192d0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
192e0 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67  for.  ** iPtrPag
192f0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
19300 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
19310 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
19320 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
19330 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50  t, iPtrPage, &pP
19340 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  trPage, 0);.    
19350 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19360 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
19370 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
19380 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
19390 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d  rWrite(pPtrPage-
193a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
193b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
193c0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
193d0 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
193e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
193f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
19400 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
19410 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62  er(pPtrPage, iDb
19420 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
19430 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c   eType);.    rel
19440 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
19450 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
19460 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19470 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
19480 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
19490 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72  pe, iPtrPage, &r
194a0 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  c);.    }.  }.  
194b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
194c0 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
194d0 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
194e0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
194f0 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ). */.static int
19500 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
19510 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d  ge(BtShared *, M
19520 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20  emPage **, Pgno 
19530 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f  *, Pgno, u8);../
19540 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73  *.** Perform a s
19550 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e  ingle step of an
19560 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
19570 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66  uum. If successf
19580 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ul, return.** SQ
19590 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72  LITE_OK. If ther
195a0 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20  e is no work to 
195b0 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  do (and therefor
195c0 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a  e no point in .*
195d0 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  * calling this f
195e0 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
195f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
19600 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  NE. Or, if an er
19610 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
19620 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65  return some othe
19630 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  r error code..**
19640 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69  .** More specifi
19650 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  cally, this func
19660 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
19670 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
19680 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a   database so .**
19690 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
196a0 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
196b0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
196c0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
196d0 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61   use..**.** Para
196e0 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68  meter nFin is th
196f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
19700 73 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61  s that this data
19710 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61  base would conta
19720 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20  in.** were this 
19730 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
19740 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
19750 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a   SQLITE_DONE..**
19760 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d  .** If the bComm
19770 69 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  it parameter is 
19780 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66  non-zero, this f
19790 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
197a0 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c  that the .** cal
197b0 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61  ler will keep ca
197c0 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d  lling incrVacuum
197d0 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20  Step() until it 
197e0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
197f0 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72  ONE .** or an er
19800 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20  ror. bCommit is 
19810 70 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20  passed true for 
19820 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f  an auto-vacuum-o
19830 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65  n-commit .** ope
19840 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65  ration, or false
19850 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e   for an incremen
19860 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73  tal vacuum..*/.s
19870 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
19880 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
19890 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
198a0 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c  n, Pgno iLastPg,
198b0 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20   int bCommit){. 
198c0 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b   Pgno nFreeList;
198d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
198e0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
198f0 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ill on the free-
19900 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  list */.  int rc
19910 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
19920 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
19930 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
19940 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67   assert( iLastPg
19950 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20  >nFin );..  if( 
19960 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  !PTRMAP_ISPAGE(p
19970 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20  Bt, iLastPg) && 
19980 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47  iLastPg!=PENDING
19990 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
199a0 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  ){.    u8 eType;
199b0 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61  .    Pgno iPtrPa
199c0 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69  ge;..    nFreeLi
199d0 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  st = get4byte(&p
199e0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
199f0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  a[36]);.    if( 
19a00 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a  nFreeList==0 ){.
19a10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19a20 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
19a30 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
19a40 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67  Get(pBt, iLastPg
19a50 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50  , &eType, &iPtrP
19a60 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
19a70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19a80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19a90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54      }.    if( eT
19aa0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
19ab0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65  PAGE ){.      re
19ac0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
19ad0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
19ae0 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
19af0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
19b00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f  ){.      if( bCo
19b10 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mmit==0 ){.     
19b20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
19b30 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
19b40 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
19b50 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
19b60 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
19b70 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f  if bCommit is no
19b80 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20  n-zero. In that 
19b90 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c  case, the free-l
19ba0 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ist will be.    
19bb0 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64      ** truncated
19bc0 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74   to zero after t
19bd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
19be0 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73  urns, so it does
19bf0 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  n't .        ** 
19c00 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69  matter if it sti
19c10 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  ll contains some
19c20 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73   garbage entries
19c30 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
19c40 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
19c50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  g;.        MemPa
19c60 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
19c70 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
19c80 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
19c90 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
19ca0 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54  ePg, iLastPg, BT
19cb0 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20  ALLOC_EXACT);.  
19cc0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
19cd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19ce0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19cf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19d00 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
19d10 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  g==iLastPg );.  
19d20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
19d30 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
19d40 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
19d50 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65  .      Pgno iFre
19d60 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  ePg;            
19d70 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65   /* Index of fre
19d80 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70  e page to move p
19d90 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20  LastPg to */.   
19da0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73     MemPage *pLas
19db0 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d  tPg;.      u8 eM
19dc0 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e  ode = BTALLOC_AN
19dd0 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72  Y;   /* Mode par
19de0 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63  ameter for alloc
19df0 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a  ateBtreePage() *
19e00 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65  /.      Pgno iNe
19e10 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
19e20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61    /* nearby para
19e30 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
19e40 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
19e50 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ..      rc = btr
19e60 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
19e70 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67  LastPg, &pLastPg
19e80 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
19e90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19ea0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
19eb0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
19ec0 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74     /* If bCommit
19ed0 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c   is zero, this l
19ee0 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79  oop runs exactly
19ef0 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70   once and page p
19f00 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20  LastPg.      ** 
19f10 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20  is swapped with 
19f20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
19f30 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74  age pulled off t
19f40 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20  he free list..  
19f50 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
19f60 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
19f70 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73  d, if bCommit is
19f80 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
19f90 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20  ro, then keep.  
19fa0 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75      ** looping u
19fb0 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65  ntil a free-page
19fc0 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20   located within 
19fd0 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70  the first nFin p
19fe0 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ages.      ** of
19ff0 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75   the file is fou
1a000 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
1a010 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d     if( bCommit==
1a020 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
1a030 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b  de = BTALLOC_LE;
1a040 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d  .        iNear =
1a050 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   nFin;.      }. 
1a060 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20       do {.      
1a070 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
1a080 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
1a090 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1a0a0 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
1a0b0 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61  , &iFreePg, iNea
1a0c0 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20  r, eMode);.     
1a0d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a0e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1a0f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
1a100 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20  astPg);.        
1a110 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1a120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
1a130 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
1a140 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  Pg);.      }whil
1a150 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46  e( bCommit && iF
1a160 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20  reePg>nFin );.  
1a170 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
1a180 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20  ePg<iLastPg );. 
1a190 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d       .      rc =
1a1a0 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
1a1b0 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70  t, pLastPg, eTyp
1a1c0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72  e, iPtrPage, iFr
1a1d0 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a  eePg, bCommit);.
1a1e0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1a1f0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
1a200 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a210 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1a220 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1a230 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
1a240 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1a250 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
1a260 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d  iLastPg--;.    }
1a270 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d  while( iLastPg==
1a280 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1a290 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50  E(pBt) || PTRMAP
1a2a0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
1a2b0 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74  stPg) );.    pBt
1a2c0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
1a2d0 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  1;.    pBt->nPag
1a2e0 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d  e = iLastPg;.  }
1a2f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a300 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1a310 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
1a320 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61  d by the first a
1a330 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75  rgument is an au
1a340 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1a350 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65  se.** nOrig page
1a360 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69  s in size contai
1a370 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20  ning nFree free 
1a380 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68  pages. Return th
1a390 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73  e expected .** s
1a3a0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1a3b0 61 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c  ase in pages fol
1a3c0 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76  lowing an auto-v
1a3d0 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e  acuum operation.
1a3e0 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
1a3f0 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68  finalDbSize(BtSh
1a400 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
1a410 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65  nOrig, Pgno nFre
1a420 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  e){.  int nEntry
1a430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a440 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1a450 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e  of entries on on
1a460 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f  e ptrmap page */
1a470 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b  .  Pgno nPtrmap;
1a480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a490 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a4a0 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20  PtrMap pages to 
1a4b0 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67  be freed */.  Pg
1a4c0 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
1a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a4e0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
1a4f0 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74  ..  nEntry = pBt
1a500 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a  ->usableSize/5;.
1a510 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72    nPtrmap = (nFr
1a520 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f  ee-nOrig+PTRMAP_
1a530 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69  PAGENO(pBt, nOri
1a540 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72  g)+nEntry)/nEntr
1a550 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69  y;.  nFin = nOri
1a560 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
1a570 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67  map;.  if( nOrig
1a580 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  >PENDING_BYTE_PA
1a590 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c  GE(pBt) && nFin<
1a5a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1a5b0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
1a5c0 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  in--;.  }.  whil
1a5d0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
1a5e0 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
1a5f0 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
1a600 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1a610 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a     nFin--;.  }..
1a620 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d    return nFin;.}
1a630 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ../*.** A write-
1a640 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1a650 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72   be opened befor
1a660 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
1a670 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70  unction..** It p
1a680 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65  erforms a single
1a690 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f   unit of work to
1a6a0 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65  wards an increme
1a6b0 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a  ntal vacuum..**.
1a6c0 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d  ** If the increm
1a6d0 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20  ental vacuum is 
1a6e0 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74  finished after t
1a6f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
1a700 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f   run,.** SQLITE_
1a710 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
1a720 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66  . If it is not f
1a730 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20  inished, but no 
1a740 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a  error occurred,.
1a750 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1a760 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
1a770 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ise an SQLite er
1a780 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e  ror code. .*/.in
1a790 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
1a7a0 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  crVacuum(Btree *
1a7b0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
1a7c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1a7d0 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
1a7e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1a7f0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1a800 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1a810 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d  RANS_WRITE && p-
1a820 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1a830 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21  WRITE );.  if( !
1a840 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1a850 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1a860 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
1a870 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67  {.    Pgno nOrig
1a880 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
1a890 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f  t(pBt);.    Pgno
1a8a0 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
1a8b0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1a8c0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1a8d0 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61  Pgno nFin = fina
1a8e0 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72  lDbSize(pBt, nOr
1a8f0 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20  ig, nFree);..   
1a900 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20   if( nOrig<nFin 
1a910 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1a920 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1a930 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
1a940 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
1a950 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
1a960 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
1a970 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1a980 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a990 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41       invalidateA
1a9a0 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
1a9b0 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  pBt);.        rc
1a9c0 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
1a9d0 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72  p(pBt, nFin, nOr
1a9e0 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ig, 0);.      }.
1a9f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1aa00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1aa10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1aa20 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
1aa30 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1aa40 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
1aa50 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1aa60 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
1aa70 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nPage);.      }.
1aa80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1aa90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
1aaa0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  E;.    }.  }.  s
1aab0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1aac0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1aad0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1aae0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1aaf0 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
1ab00 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
1ab10 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
1ab20 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  .** is committed
1ab30 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
1ab40 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  uum database..**
1ab50 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
1ab60 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
1ab70 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73  en *pnTrunc is s
1ab80 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
1ab90 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65   of pages.** the
1aba0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1abb0 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74  hould be truncat
1abc0 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65  ed to during the
1abd0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
1abe0 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61   .** i.e. the da
1abf0 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
1ac00 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74  reorganized so t
1ac10 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72  hat only the fir
1ac20 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70  st *pnTrunc.** p
1ac30 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e  ages are in use.
1ac40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1ac50 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
1ac60 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1ac70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1ac80 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
1ac90 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
1aca0 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ger;.  VVA_ONLY(
1acb0 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69   int nRef = sqli
1acc0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1acd0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61  (pPager) );..  a
1ace0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1acf0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1ad00 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c  utex) );.  inval
1ad10 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
1ad20 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73  Cache(pBt);.  as
1ad30 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61  sert(pBt->autoVa
1ad40 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42  cuum);.  if( !pB
1ad50 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b  t->incrVacuum ){
1ad60 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  .    Pgno nFin; 
1ad70 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ad80 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
1ad90 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74  tabase after aut
1ada0 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20  ovacuuming */.  
1adb0 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20    Pgno nFree;   
1adc0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1add0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
1ade0 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c  reelist initiall
1adf0 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46  y */.    Pgno iF
1ae00 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ree;        /* T
1ae10 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20  he next page to 
1ae20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
1ae30 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
1ae40 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
1ae50 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69  ize before freei
1ae60 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67  ng */..    nOrig
1ae70 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
1ae80 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  t(pBt);.    if( 
1ae90 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1aea0 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72  t, nOrig) || nOr
1aeb0 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ig==PENDING_BYTE
1aec0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1aed0 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74      /* It is not
1aee0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65   possible to cre
1aef0 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
1af00 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e  or which the fin
1af10 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  al page.      **
1af20 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69   is either a poi
1af30 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72  nter-map page or
1af40 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74   the pending-byt
1af50 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20  e page. If one. 
1af60 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75       ** is encou
1af70 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64  ntered, this ind
1af80 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f  icates corruptio
1af90 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1afa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1afb0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1afc0 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d    }..    nFree =
1afd0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1afe0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1aff0 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66  ]);.    nFin = f
1b000 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20  inalDbSize(pBt, 
1b010 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20  nOrig, nFree);. 
1b020 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69     if( nFin>nOri
1b030 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  g ) return SQLIT
1b040 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1b050 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72      if( nFin<nOr
1b060 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ig ){.      rc =
1b070 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
1b080 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
1b090 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  }.    for(iFree=
1b0a0 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
1b0b0 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
1b0c0 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
1b0d0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
1b0e0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
1b0f0 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20  n, iFree, 1);.  
1b100 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d    }.    if( (rc=
1b110 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20  =SQLITE_DONE || 
1b120 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
1b130 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  & nFree>0 ){.   
1b140 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1b150 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
1b160 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1b170 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1b180 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1b190 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
1b1a0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1b1b0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1b1c0 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  36], 0);.      p
1b1d0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1b1e0 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
1b1f0 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42   nFin);.      pB
1b200 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
1b210 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   1;.      pBt->n
1b220 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  Page = nFin;.   
1b230 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
1b240 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b250 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
1b260 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
1b270 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
1b280 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74  ert( nRef>=sqlit
1b290 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
1b2a0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
1b2b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
1b2c0 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54   /* ifndef SQLIT
1b2d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1b2e0 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65  M */.# define se
1b2f0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29  tChildPtrmaps(x)
1b300 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
1b310 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
1b320 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
1b330 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20  irst phase of a 
1b340 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
1b350 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
1b360 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c  ** causes a roll
1b370 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  back journal to 
1b380 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69  be created (if i
1b390 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
1b3a0 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64  dy exist).** and
1b3b0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1b3c0 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69  enough informati
1b3d0 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20  on so that if a 
1b3e0 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72  power loss occur
1b3f0 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
1b400 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  e can be restore
1b410 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
1b420 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69  l state by playi
1b430 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a  ng back.** the j
1b440 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68  ournal.  Then th
1b450 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1b460 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c  e journal are fl
1b470 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20  ushed out to.** 
1b480 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72  the disk.  After
1b490 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1b4a0 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c  safely on oxide,
1b4b0 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
1b4c0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1b4d0 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
1b4e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b4f0 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74  le and flushed t
1b500 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74  o oxide..** At t
1b510 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63  he end of this c
1b520 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  all, the rollbac
1b530 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20  k journal still 
1b540 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a  exists on the.**
1b550 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65   disk and we are
1b560 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
1b570 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65  ll locks, so the
1b580 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1b590 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   not.** committe
1b5a0 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42  d.  See sqlite3B
1b5b0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
1b5c0 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63  wo() for the sec
1b5d0 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65  ond phase of the
1b5e0 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  .** commit proce
1b5f0 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ss..**.** This c
1b600 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  all is a no-op i
1b610 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  f no write-trans
1b620 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e  action is curren
1b630 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42  tly active on pB
1b640 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
1b650 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  se, sync the dat
1b660 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
1b670 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d  he btree pBt. zM
1b680 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a  aster points to.
1b690 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ** the name of a
1b6a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b6b0 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
1b6c0 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
1b6d0 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
1b6e0 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  al journal file,
1b6f0 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64   or is NULL, ind
1b700 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65  icating no maste
1b710 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  r journal file .
1b720 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62  ** (single datab
1b730 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
1b740 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1b750 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  s is called, the
1b760 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b770 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68  should already h
1b780 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61  ave been.** crea
1b790 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77  ted, populated w
1b7a0 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ith this journal
1b7b0 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e   pointer and syn
1b7c0 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
1b7d0 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  ** Once this is 
1b7e0 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75  routine has retu
1b7f0 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74  rned, the only t
1b800 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f  hing required to
1b810 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77   commit.** the w
1b820 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1b830 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
1b840 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65  se file is to de
1b850 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
1b860 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b870 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1b880 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f  One(Btree *p, co
1b890 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
1b8a0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
1b8b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1b8c0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1b8d0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
1b8e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1b8f0 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
1b900 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1b910 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b920 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1b930 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
1b940 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
1b950 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d   rc = autoVacuum
1b960 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20  Commit(pBt);.   
1b970 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b980 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b990 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1b9a0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
1b9b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1b9c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1b9d0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1b9e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1b9f0 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
1ba00 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ge(pBt->pPager, 
1ba10 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
1ba20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63   }.#endif.    rc
1ba30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
1ba40 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
1ba50 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
1ba60 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  er, 0);.    sqli
1ba70 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1ba80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1ba90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1baa0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1bab0 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74  led from both Bt
1bac0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1bad0 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c  o() and BtreeRol
1bae0 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68  lback().** at th
1baf0 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
1bb00 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  a transaction..*
1bb10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
1bb20 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
1bb30 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  n(Btree *p){.  B
1bb40 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1bb50 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
1bb60 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
1bb70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1bb80 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
1bb90 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) );..#ifndef SQ
1bba0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1bbb0 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54  CUUM.  pBt->bDoT
1bbc0 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e  runcate = 0;.#en
1bbd0 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  dif.  if( p->inT
1bbe0 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
1bbf0 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  && db->nVdbeRead
1bc00 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  >1 ){.    /* If 
1bc10 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20  there are other 
1bc20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
1bc30 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  s that belong to
1bc40 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20   this database. 
1bc50 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f     ** handle, do
1bc60 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61  wngrade to a rea
1bc70 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
1bc80 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74  on. The other st
1bc90 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  atements.    ** 
1bca0 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61  may still be rea
1bcb0 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
1bcc0 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  tabase.  */.    
1bcd0 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72  downgradeAllShar
1bce0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1bcf0 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54  s(p);.    p->inT
1bd00 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41  rans = TRANS_REA
1bd10 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
1bd20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
1bd30 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66   had any kind of
1bd40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1bd50 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
1bd60 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63   .    ** transac
1bd70 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68  tion count of th
1bd80 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20  e shared btree. 
1bd90 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
1bda0 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a  on count .    **
1bdb0 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20   reaches 0, set 
1bdc0 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
1bdd0 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20   to TRANS_NONE. 
1bde0 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  The unlockBtreeI
1bdf0 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a  fUnused().    **
1be00 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c   call below will
1be10 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
1be20 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  r.  */.    if( p
1be30 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
1be40 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63  _NONE ){.      c
1be50 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
1be60 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
1be70 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
1be80 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
1be90 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
1bea0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
1beb0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
1bec0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1bed0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _NONE;.      }. 
1bee0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
1bef0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
1bf00 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
1bf10 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
1bf20 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20   unlock the .   
1bf30 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69   ** pager if thi
1bf40 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
1bf50 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
1bf60 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1bf70 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54  .  */.    p->inT
1bf80 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
1bf90 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  E;.    unlockBtr
1bfa0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
1bfb0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
1bfc0 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a  egrity(p);.}../*
1bfd0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
1bfe0 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
1bff0 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
1c000 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1c010 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
1c020 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
1c030 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
1c040 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
1c050 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1c060 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69  PhaseOne() routi
1c070 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
1c080 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
1c090 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ld.** be invoked
1c0a0 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
1c0b0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
1c0c0 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
1c0d0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1c0e0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64  ).** routine did
1c0f0 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
1c100 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
1c110 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
1c120 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
1c130 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
1c140 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
1c150 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
1c160 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
1c170 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
1c180 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
1c190 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
1c1a0 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68  te or zero the h
1c1b0 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  eader in the.** 
1c1c0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1c1d0 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73  rnal (which caus
1c1e0 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
1c1f0 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
1c200 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e  d.** drop locks.
1c210 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
1c220 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
1c230 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61  urs while the pa
1c240 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74  ger layer is att
1c250 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66  empting to .** f
1c260 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  inalize the unde
1c270 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  rlying journal f
1c280 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ile, this functi
1c290 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
1c2a0 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75  ror and.** the u
1c2b0 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
1c2c0 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61  attempt a rollba
1c2d0 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ck. However, if 
1c2e0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1c2f0 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  ent.** is non-ze
1c300 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74  ro then this b-t
1c310 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ree transaction 
1c320 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  is part of a mul
1c330 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e  ti-file .** tran
1c340 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
1c350 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73   case, the trans
1c360 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
1c370 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  dy been committe
1c380 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69  d .** (by deleti
1c390 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
1c3a0 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
1c3b0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67  e caller will ig
1c3c0 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  nore this .** fu
1c3d0 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63  nctions return c
1c3e0 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66  ode. So, even if
1c3f0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1c400 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61   in the pager la
1c410 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68  yer,.** reset th
1c420 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73  e b-tree objects
1c430 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
1c440 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
1c450 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72   the write.** tr
1c460 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
1c470 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  en closed. This 
1c480 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61  is quite safe, a
1c490 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  s the pager will
1c4a0 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74   have.** transit
1c4b0 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72  ioned to the err
1c4c0 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  or state..**.** 
1c4d0 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
1c4e0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
1c4f0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1c500 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
1c510 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
1c520 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
1c530 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
1c540 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
1c550 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1c560 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
1c570 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61  ee *p, int bClea
1c580 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e  nup){..  if( p->
1c590 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
1c5a0 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ONE ) return SQL
1c5b0 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
1c5c0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1c5d0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1c5e0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
1c5f0 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
1c600 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1c610 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
1c620 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
1c630 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
1c640 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
1c650 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
1c660 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
1c670 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1c680 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1c690 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1c6a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1c6b0 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
1c6c0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1c6d0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1c6e0 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ITE );.    asser
1c6f0 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
1c700 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63  tion>0 );.    rc
1c710 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
1c720 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
1c730 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
1c740 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c750 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30  K && bCleanup==0
1c760 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1c770 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1c780 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c790 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
1c7a0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1c7b0 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
1c7c0 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
1c7d0 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
1c7e0 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
1c7f0 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
1c800 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1c810 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1c820 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
1c830 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66  o both phases of
1c840 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e   a commit..*/.in
1c850 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1c860 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  mmit(Btree *p){.
1c870 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1c880 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1c890 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1c8a0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1c8b0 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  One(p, 0);.  if(
1c8c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c8d0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1c8e0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1c8f0 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d  seTwo(p, 0);.  }
1c900 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1c910 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1c920 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1c930 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
1c940 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55   the state to CU
1c950 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74  RSOR_FAULT and t
1c960 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
1c970 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20   to errCode for 
1c980 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20  every cursor on 
1c990 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42  BtShared that pB
1c9a0 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  tree.** referenc
1c9b0 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20  es..**.** Every 
1c9c0 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70 65  cursor is trippe
1c9d0 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
1c9e0 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  sors that belong
1c9f0 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74  .** to other dat
1ca00 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1ca10 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
1ca20 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74   be sharing.** t
1ca30 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
1ca40 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
1ca50 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
1ca60 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
1ca70 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20  back occurs..** 
1ca80 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e  All cursors usin
1ca90 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  g the same cache
1caa0 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65 64   must be tripped
1cab0 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74  .** to prevent t
1cac0 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20  hem from trying 
1cad0 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65 65  to use the btree
1cae0 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f   after.** the ro
1caf0 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c  llback.  The rol
1cb00 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
1cb10 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a  eleted tables.**
1cb20 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70   or moved root p
1cb30 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e  ages, so it is n
1cb40 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  ot sufficient to
1cb50 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74 61  .** save the sta
1cb60 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  te of the cursor
1cb70 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  .  The cursor mu
1cb80 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  st be.** invalid
1cb90 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
1cba0 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
1cbb0 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a  lCursors(Btree *
1cbc0 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43  pBtree, int errC
1cbd0 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ode){.  BtCursor
1cbe0 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65   *p;.  if( pBtre
1cbf0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
1cc00 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1cc10 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f  er(pBtree);.  fo
1cc20 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
1cc30 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
1cc40 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
1cc50 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t i;.    sqlite3
1cc60 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
1cc70 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61  (p);.    p->eSta
1cc80 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
1cc90 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65  T;.    p->skipNe
1cca0 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
1ccb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d    for(i=0; i<=p-
1ccc0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
1ccd0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1cce0 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  p->apPage[i]);. 
1ccf0 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69       p->apPage[i
1cd00 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
1cd10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1cd20 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a  eave(pBtree);.}.
1cd30 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
1cd40 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1cd50 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
1cd60 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
1cd70 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
1cd80 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
1cd90 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
1cda0 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
1cdb0 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
1cdc0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
1cdd0 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
1cde0 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
1cdf0 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
1ce00 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
1ce10 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
1ce20 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1ce30 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
1ce40 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1ce50 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
1ce60 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
1ce70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1ce80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1ce90 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
1cea0 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f  e *p, int tripCo
1ceb0 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  de){.  int rc;. 
1cec0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1ced0 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
1cee0 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73  ge *pPage1;..  s
1cef0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1cf00 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43  (p);.  if( tripC
1cf10 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
1cf20 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43  {.    rc = tripC
1cf30 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  ode = saveAllCur
1cf40 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1cf50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1cf60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1cf70 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  }.  if( tripCode
1cf80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
1cf90 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
1cfa0 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 29 3b  rs(p, tripCode);
1cfb0 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65  .  }.  btreeInte
1cfc0 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28  grity(p);..  if(
1cfd0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1cfe0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1cff0 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73  int rc2;..    as
1d000 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
1d010 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
1d020 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
1d030 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
1d040 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
1d050 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
1d060 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
1d070 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
1d080 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
1d090 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
1d0a0 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
1d0b0 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
1d0c0 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
1d0d0 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50  * call btreeGetP
1d0e0 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
1d0f0 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
1d100 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
1d110 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
1d120 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
1d130 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67   if( btreeGetPag
1d140 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
1d150 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, 0)==SQLITE_OK
1d160 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
1d170 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
1d180 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
1d190 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73  Data);.      tes
1d1a0 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20  tcase( nPage==0 
1d1b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  );.      if( nPa
1d1c0 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50  ge==0 ) sqlite3P
1d1d0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1d1e0 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
1d1f0 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1d200 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  se( pBt->nPage!=
1d210 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70  nPage );.      p
1d220 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
1d230 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  e;.      release
1d240 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
1d250 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1d260 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
1d270 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a  s(pBt, 1)==0 );.
1d280 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1d290 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
1d2a0 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
1d2b0 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
1d2c0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1d2d0 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1d2e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1d2f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1d300 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d310 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
1d320 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
1d330 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
1d340 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c  ction can be rol
1d350 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65  led.** back inde
1d360 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
1d370 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
1d380 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  n. You must star
1d390 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
1d3a0 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74  .** before start
1d3b0 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
1d3c0 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
1d3d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
1d3e0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
1d3f0 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20  .** if the main 
1d400 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
1d410 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
1d420 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  k..**.** Stateme
1d430 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
1d440 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
1d450 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
1d460 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
1d470 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
1d480 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
1d490 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
1d4a0 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
1d4b0 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
1d4c0 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
1d4d0 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
1d4e0 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
1d4f0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
1d500 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1d510 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1d520 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
1d530 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
1d540 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65  n..**.** A state
1d550 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63  ment sub-transac
1d560 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
1d570 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d  ted as an anonym
1d580 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54  ous savepoint. T
1d590 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73  he.** value pass
1d5a0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1d5b0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
1d5c0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1d5d0 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a  f savepoints,.**
1d5e0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
1d5f0 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  ew anonymous sav
1d600 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20  epoint, open on 
1d610 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e  the B-Tree. i.e.
1d620 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
1d630 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70   no active savep
1d640 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  oints and no oth
1d650 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  er statement-tra
1d660 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a  nsactions open,.
1d670 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73  ** iStatement is
1d680 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f   1. This anonymo
1d690 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  us savepoint can
1d6a0 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20   be released or 
1d6b0 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75  rolled back.** u
1d6c0 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
1d6d0 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29  BtreeSavepoint()
1d6e0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
1d6f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
1d700 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
1d710 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74  , int iStatement
1d720 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1d730 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1d740 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
1d750 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1d760 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
1d770 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1d780 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
1d790 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1d7a0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30  TS_READ_ONLY)==0
1d7b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1d7c0 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
1d7d0 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
1d7e0 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  nt>p->db->nSavep
1d7f0 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  oint );.  assert
1d800 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1d810 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1d820 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65  E );.  /* At the
1d830 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20   pager level, a 
1d840 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1d850 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70  ction is a savep
1d860 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61  oint with.  ** a
1d870 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
1d880 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69  than all savepoi
1d890 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c  nts created expl
1d8a0 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a  icitly using.  *
1d8b0 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
1d8c0 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  . It is illegal 
1d8d0 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65  to open, release
1d8e0 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79   or rollback any
1d8f0 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70  .  ** such savep
1d900 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20  oints while the 
1d910 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1d920 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
1d930 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a  is active..  */.
1d940 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1d950 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
1d960 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53  (pBt->pPager, iS
1d970 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c  tatement);.  sql
1d980 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1d990 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1d9a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  }../*.** The sec
1d9b0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
1d9c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  this function, o
1d9d0 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56  p, is always SAV
1d9e0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a  EPOINT_ROLLBACK.
1d9f0 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  ** or SAVEPOINT_
1da00 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75  RELEASE. This fu
1da10 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65  nction either re
1da20 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20  leases or rolls 
1da30 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65  back the.** save
1da40 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64  point identified
1da50 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53   by parameter iS
1da60 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64  avepoint, depend
1da70 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  ing on the value
1da80 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a   .** of op..**.*
1da90 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76  * Normally, iSav
1daa0 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
1dab0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
1dac0 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72  to zero. However
1dad0 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41  , if op is.** SA
1dae0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1daf0 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e  , then iSavepoin
1db00 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31  t may also be -1
1db10 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
1db20 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
1db30 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  of the entire tr
1db40 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f  ansaction are ro
1db50 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
1db60 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  is different.** 
1db70 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72  from a normal tr
1db80 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
1db90 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20  ck, as no locks 
1dba0 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64  are released and
1dbb0 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
1dbc0 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e  ion remains open
1dbd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1dbe0 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42  BtreeSavepoint(B
1dbf0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  tree *p, int op,
1dc00 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
1dc10 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1dc20 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
1dc30 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
1dc40 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1dc50 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1dc60 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
1dc70 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
1dc80 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
1dc90 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
1dca0 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  LBACK );.    ass
1dcb0 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
1dcc0 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e  =0 || (iSavepoin
1dcd0 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56  t==-1 && op==SAV
1dce0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
1dcf0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
1dd00 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1dd10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1dd20 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
1dd30 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
1dd40 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  avepoint);.    i
1dd50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dd60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53   ){.      if( iS
1dd70 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70  avepoint<0 && (p
1dd80 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1dd90 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1dda0 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  TY)!=0 ){.      
1ddb0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30    pBt->nPage = 0
1ddc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ddd0 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1dde0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74  (pBt);.      pBt
1ddf0 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  ->nPage = get4by
1de00 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61  te(28 + pBt->pPa
1de10 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ge1->aData);..  
1de20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1de30 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69  ase size was wri
1de40 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66  tten into the of
1de50 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68  fset 28 of the h
1de60 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  eader.      ** w
1de70 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
1de80 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20  ion started, so 
1de90 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
1dea0 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74   value at offset
1deb0 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20  .      ** 28 is 
1dec0 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20  nonzero. */.    
1ded0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
1dee0 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Page>0 );.    }.
1def0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1df00 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
1df10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1df20 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1df30 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1df40 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
1df50 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
1df60 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
1df70 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
1df80 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
1df90 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1dfa0 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
1dfb0 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
1dfc0 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
1dfd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1dfe0 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
1dff0 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
1e000 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
1e010 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
1e020 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
1e030 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
1e040 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
1e050 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1e060 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
1e070 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
1e080 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
1e090 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
1e0a0 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
1e0b0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1e0c0 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
1e0d0 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
1e0e0 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
1e0f0 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
1e100 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
1e110 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
1e120 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
1e130 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
1e140 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
1e150 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
1e160 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
1e170 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
1e180 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
1e190 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
1e1a0 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
1e1b0 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
1e1c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
1e1d0 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
1e1e0 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
1e1f0 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
1e200 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
1e210 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
1e220 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
1e230 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
1e240 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
1e250 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
1e260 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
1e270 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
1e280 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
1e290 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
1e2a0 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
1e2b0 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
1e2c0 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
1e2d0 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
1e2e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
1e2f0 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
1e300 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
1e310 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
1e320 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
1e330 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
1e340 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
1e350 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1e360 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
1e370 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
1e380 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
1e390 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
1e3a0 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
1e3b0 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
1e3c0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
1e3d0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
1e3e0 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
1e3f0 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
1e400 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
1e410 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
1e420 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1e430 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e  rZero() has been
1e440 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43   called.** on pC
1e450 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ur to initialize
1e460 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63   the memory spac
1e470 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  e prior to invok
1e480 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1e490 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e4a0 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
1e4b0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
1e4e0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
1e4f0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1e500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e510 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
1e520 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
1e530 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
1e540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e550 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1e560 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1e570 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1e580 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1e590 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1e5a0 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1e5b0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1e5c0 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
1e5d0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1e5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5f0 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
1e600 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
1e610 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1e620 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
1e630 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1e640 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   b-tree handle *
1e650 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
1e660 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1e670 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1e680 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1e690 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20   wrFlag==1 );.. 
1e6a0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1e6b0 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
1e6c0 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
1e6d0 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
1e6e0 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
1e6f0 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
1e700 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
1e710 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
1e720 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
1e730 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
1e740 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
1e750 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
1e760 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
1e770 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
1e780 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
1e790 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
1e7a0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1e7b0 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
1e7c0 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61  eyInfo!=0, wrFla
1e7d0 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  g+1) );.  assert
1e7e0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
1e7f0 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
1e800 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
1e810 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
1e820 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1e830 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
1e840 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
1e850 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
1e860 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1e870 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
1e880 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
1e890 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1e8a0 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
1e8b0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
1e8c0 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
1e8d0 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e  Data );..  if( N
1e8e0 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20 28  EVER(wrFlag && (
1e8f0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1e900 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1e910 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1e920 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1e930 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 72 46 6c  ;.  }.  if( wrFl
1e940 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61  ag ){.    alloca
1e950 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
1e960 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
1e970 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  TmpSpace==0 ) re
1e980 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1e990 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  M;.  }.  if( iTa
1e9a0 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
1e9b0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
1e9c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1e9d0 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  wrFlag==0 );.   
1e9e0 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d   iTable = 0;.  }
1e9f0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
1ea00 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
1ea10 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
1ea20 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
1ea30 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
1ea40 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
1ea50 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
1ea60 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
1ea70 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
1ea80 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
1ea90 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
1eaa0 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
1eab0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
1eac0 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
1ead0 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
1eae0 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
1eaf0 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
1eb00 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d  ag==0 || wrFlag=
1eb10 3d 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20  =BTCF_WriteFlag 
1eb20 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  );.  pCur->curFl
1eb30 61 67 73 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20  ags = wrFlag;.  
1eb40 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
1eb50 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  t->pCursor;.  if
1eb60 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
1eb70 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  .    pCur->pNext
1eb80 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a  ->pPrev = pCur;.
1eb90 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73    }.  pBt->pCurs
1eba0 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
1ebb0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1ebc0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65  OR_INVALID;.  re
1ebd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ebe0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
1ebf0 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
1ec00 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
1ec30 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
1ec40 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec60 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
1ec70 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
1ec80 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
1ec90 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecb0 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
1ecc0 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
1ecd0 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
1ece0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
1ed10 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
1ed20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
1ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ed50 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72  Write new cursor
1ed60 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
1ed70 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1ed80 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1ed90 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
1eda0 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c  (p, iTable, wrFl
1edb0 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
1edc0 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ur);.  sqlite3Bt
1edd0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1ede0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1edf0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
1ee00 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
1ee10 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
1ee20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
1ee30 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
1ee40 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
1ee50 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
1ee60 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
1ee70 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
1ee80 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
1ee90 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
1eea0 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
1eeb0 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
1eec0 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
1eed0 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
1eee0 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
1eef0 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
1ef00 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
1ef10 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1ef20 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
1ef30 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73   return ROUND8(s
1ef40 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
1ef50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
1ef60 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61  alize memory tha
1ef70 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  t will be conver
1ef80 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72  ted into a BtCur
1ef90 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  sor object..**.*
1efa0 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70  * The simple app
1efb0 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64  roach here would
1efc0 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20   be to memset() 
1efd0 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63  the entire objec
1efe0 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42  t.** to zero.  B
1eff0 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20  ut it turns out 
1f000 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b  that the apPage[
1f010 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72  ] and aiIdx[] ar
1f020 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e  rays.** do not n
1f030 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64  eed to be zeroed
1f040 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61   and they are la
1f050 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  rge, so we can s
1f060 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20  ave a lot.** of 
1f070 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70  run-time by skip
1f080 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
1f090 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65  ization of those
1f0a0 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f   elements..*/.vo
1f0b0 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
1f0c0 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73  ursorZero(BtCurs
1f0d0 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  or *p){.  memset
1f0e0 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28  (p, 0, offsetof(
1f0f0 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29  BtCursor, iPage)
1f100 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
1f110 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
1f120 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
1f130 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f140 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
1f150 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
1f160 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
1f170 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1f180 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
1f190 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1f1a0 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
1f1b0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
1f1c0 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
1f1d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
1f1e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
1f1f0 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
1f200 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1f210 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69  Btree);.    sqli
1f220 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
1f230 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69  sor(pCur);.    i
1f240 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29  f( pCur->pPrev )
1f250 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50  {.      pCur->pP
1f260 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
1f270 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
1f280 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  lse{.      pBt->
1f290 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
1f2a0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
1f2b0 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
1f2c0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1f2d0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
1f2e0 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  Cur->pPrev;.    
1f2f0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
1f300 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
1f310 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
1f320 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
1f330 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  age[i]);.    }. 
1f340 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
1f350 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
1f360 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
1f370 42 74 72 65 65 2d 3e 64 62 2c 20 70 43 75 72 2d  Btree->db, pCur-
1f380 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20  >aOverflow);.   
1f390 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65   /* sqlite3_free
1f3a0 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73  (pCur); */.    s
1f3b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1f3c0 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
1f3d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f3e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1f3f0 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f  sure the BtCurso
1f400 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  r* given in the 
1f410 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76  argument has a v
1f420 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72  alid.** BtCursor
1f430 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  .info structure.
1f440 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61    If it is not a
1f450 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61  lready valid, ca
1f460 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  ll.** btreeParse
1f470 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69  Cell() to fill i
1f480 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75  t in..**.** BtCu
1f490 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63  rsor.info is a c
1f4a0 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f  ache of the info
1f4b0 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63  rmation in the c
1f4c0 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20  urrent cell..** 
1f4d0 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65  Using this cache
1f4e0 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d   reduces the num
1f4f0 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20  ber of calls to 
1f500 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
1f510 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d  ..**.** 2007-06-
1f520 32 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20  25:  There is a 
1f530 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73  bug in some vers
1f540 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61  ions of MSVC tha
1f550 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63  t cause the.** c
1f560 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68  ompiler to crash
1f570 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66   when getCellInf
1f580 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  o() is implement
1f590 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a  ed as a macro..*
1f5a0 2a 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61  * But there is a
1f5b0 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65   measureable spe
1f5c0 65 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20  ed advantage to 
1f5d0 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20  using the macro 
1f5e0 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20  on gcc.** (when 
1f5f0 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70  less compiler op
1f600 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65  timizations like
1f610 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20   -Os or -O0 are 
1f620 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  used and the.** 
1f630 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20  compiler is not 
1f640 64 6f 69 6e 67 20 61 67 67 72 65 73 73 69 76 65  doing aggressive
1f650 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20   inlining.)  So 
1f660 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66 75  we use a real fu
1f670 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53  nction.** for MS
1f680 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66  VC and a macro f
1f690 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c  or everything el
1f6a0 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35  se.  Ticket #245
1f6b0 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  7..*/.#ifndef ND
1f6c0 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
1f6d0 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  id assertCellInf
1f6e0 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
1f6f0 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
1f700 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50  info;.    int iP
1f710 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
1f720 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  e;.    memset(&i
1f730 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  nfo, 0, sizeof(i
1f740 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65  nfo));.    btree
1f750 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
1f760 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70  apPage[iPage], p
1f770 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
1f780 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  ], &info);.    a
1f790 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
1f7a0 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66  B || memcmp(&inf
1f7b0 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
1f7c0 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
1f7d0 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
1f7e0 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
1f7f0 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
1f800 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52  .#ifdef _MSC_VER
1f810 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c  .  /* Use a real
1f820 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56   function in MSV
1f830 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  C to work around
1f840 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f   bugs in that co
1f850 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61  mpiler. */.  sta
1f860 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  tic void getCell
1f870 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
1f880 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43  Cur){.    if( pC
1f890 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
1f8a0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
1f8b0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
1f8c0 67 65 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50  ge;.      btreeP
1f8d0 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
1f8e0 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
1f8f0 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
1f900 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
1f910 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
1f920 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
1f930 4e 4b 65 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NKey;.    }else{
1f940 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c  .      assertCel
1f950 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
1f960 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20   }.  }.#else /* 
1f970 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20  if not _MSC_VER 
1f980 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61  */.  /* Use a ma
1f990 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72  cro in all other
1f9a0 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68   compilers so th
1f9b0 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  at the function 
1f9c0 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64  is inlined */.#d
1f9d0 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66  efine getCellInf
1f9e0 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20  o(pCur)         
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1fa20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1fa30 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20  nSize==0 ){     
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1fa70 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1fa80 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20  pCur->iPage;    
1fa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1fac0 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
1fad0 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
1fae0 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69  [iPage],pCur->ai
1faf0 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72  Idx[iPage],&pCur
1fb00 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20 20 20 20  ->info);        
1fb10 5c 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46  \.    pCur->curF
1fb20 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
1fb30 69 64 4e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  idNKey;         
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb60 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20   \.  }else{     
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbb0 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65    \.    assertCe
1fbc0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20  llInfo(pCur);   
1fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc00 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20     \.  }.#endif 
1fc10 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a  /* _MSC_VER */..
1fc20 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20  #ifndef NDEBUG  
1fc30 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74  /* The next rout
1fc40 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69  ine used only wi
1fc50 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
1fc60 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a  atements */./*.*
1fc70 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1fc80 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72   the given BtCur
1fc90 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41  sor is valid.  A
1fca0 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73   valid cursor is
1fcb0 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20   one.** that is 
1fcc0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
1fcd0 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61  ng to a row in a
1fce0 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62   (non-empty) tab
1fcf0 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  le..** This is a
1fd00 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f   verification ro
1fd10 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e  utine is used on
1fd20 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
1fd30 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
1fd40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1fd50 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
1fd60 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1fd70 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26  .  return pCur &
1fd80 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  & pCur->eState==
1fd90 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
1fda0 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47  #endif /* NDEBUG
1fdb0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a   */../*.** Set *
1fdc0 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  pSize to the siz
1fdd0 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
1fde0 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74  needed to hold t
1fdf0 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  he value of.** t
1fe00 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63  he key for the c
1fe10 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49  urrent entry.  I
1fe20 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1fe30 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  not pointing.** 
1fe40 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
1fe50 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  , *pSize is set 
1fe60 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  to 0. .**.** For
1fe70 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
1fe80 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65  e INTKEY flag se
1fe90 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
1fea0 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a  returns the key.
1feb0 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74  ** itself, not t
1fec0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1fed0 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a  es in the key..*
1fee0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
1fef0 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68  must position th
1ff00 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74  e cursor prior t
1ff10 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  o invoking this 
1ff20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20  routine..** .** 
1ff30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
1ff40 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c  not fail.  It al
1ff50 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c  ways returns SQL
1ff60 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74  ITE_OK.  .*/.int
1ff70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1ff80 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
1ff90 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  Cur, i64 *pSize)
1ffa0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
1ffb0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1ffc0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1ffd0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1ffe0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
1fff0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
20000 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
20010 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
20020 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
20030 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30  {.    *pSize = 0
20040 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67  ;.  }else{.    g
20050 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
20060 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70  ;.    *pSize = p
20070 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
20080 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
20090 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
200a0 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
200b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
200c0 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  es of data in th
200d0 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63  e entry the.** c
200e0 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
200f0 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a  points to..**.**
20100 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
20110 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
20120 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
20130 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d  inting to a non-
20140 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e  NULL.** valid en
20150 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  try.  In other w
20160 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ords, the callin
20170 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74  g procedure must
20180 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68   guarantee.** th
20190 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  at the cursor ha
201a0 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d  s Cursor.eState=
201b0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a  =CURSOR_VALID..*
201c0 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20  *.** Failure is 
201d0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 54  not possible.  T
201e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
201f0 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
20200 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67  TE_OK..** It mig
20210 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20  ht just as well 
20220 62 65 20 61 20 70 72 6f 63 65 64 75 72 65 20 28  be a procedure (
20230 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29 20  returning void) 
20240 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a  but we continue.
20250 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ** to return an 
20260 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20 63  integer result c
20270 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69 63  ode for historic
20280 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69  al reasons..*/.i
20290 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
202a0 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72  ataSize(BtCursor
202b0 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69   *pCur, u32 *pSi
202c0 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ze){.  assert( c
202d0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
202e0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
202f0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
20300 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
20310 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
20320 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
20330 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  age]->intKeyLeaf
20340 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  ==1 );.  getCell
20350 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70  Info(pCur);.  *p
20360 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
20370 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  o.nPayload;.  re
20380 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20390 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
203a0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
203b0 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
203c0 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
203d0 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
203e0 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
203f0 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
20400 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
20410 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
20420 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
20430 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
20440 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
20450 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
20460 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
20470 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
20480 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
20490 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
204a0 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
204b0 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
204c0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
204d0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
204e0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
204f0 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
20500 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  ** The page numb
20510 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  er of the next o
20520 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
20530 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
20540 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  is .** written t
20550 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66  o *pPgnoNext. If
20560 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68   page ovfl is th
20570 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69  e last page in i
20580 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69  ts linked .** li
20590 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69  st, *pPgnoNext i
205a0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a  s set to zero. .
205b0 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20  **.** If ppPage 
205c0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
205d0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
205e0 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
205f0 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
20600 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  .** to page numb
20610 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74  er pOvfl was obt
20620 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50  ained, then *ppP
20630 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f  age is set to po
20640 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72  int to that.** r
20650 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20  eference. It is 
20660 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
20670 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
20680 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
20690 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70  Page().** on *pp
206a0 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65  Page to free the
206b0 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e   reference. In n
206c0 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
206d0 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73  obtained (becaus
206e0 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  e.** the pointer
206f0 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f  -map was used to
20700 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75   obtain the valu
20710 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74  e for *pPgnoNext
20720 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61  ), then.** *ppPa
20730 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ge is set to zer
20740 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
20750 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
20760 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
20770 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
20780 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
20790 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
207a0 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
207b0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
207c0 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
207d0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d   number */.  Mem
207e0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
207f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
20800 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65  : MemPage handle
20810 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a   (may be NULL) *
20820 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e  /.  Pgno *pPgnoN
20830 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
20840 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76   /* OUT: Next ov
20850 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
20860 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  er */.){.  Pgno 
20870 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  next = 0;.  MemP
20880 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
20890 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
208a0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
208b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
208c0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
208d0 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e  );.  assert(pPgn
208e0 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66  oNext);..#ifndef
208f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
20900 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79  OVACUUM.  /* Try
20910 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78   to find the nex
20920 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
20930 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e  erflow list usin
20940 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76  g the.  ** autov
20950 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61  acuum pointer-ma
20960 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74  p pages. Guess t
20970 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67  hat the next pag
20980 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f  e in .  ** the o
20990 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20  verflow list is 
209a0 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66  page number (ovf
209b0 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75  l+1). If that gu
209c0 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20  ess turns .  ** 
209d0 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c  out to be wrong,
209e0 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f   fall back to lo
209f0 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f  ading the data o
20a00 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d  f page .  ** num
20a10 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65  ber ovfl to dete
20a20 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70  rmine the next p
20a30 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f  age number..  */
20a40 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
20a50 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
20a60 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e  no pgno;.    Pgn
20a70 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b  o iGuess = ovfl+
20a80 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  1;.    u8 eType;
20a90 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52  ..    while( PTR
20aa0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
20ab0 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73  iGuess) || iGues
20ac0 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  s==PENDING_BYTE_
20ad0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
20ae0 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20     iGuess++;.   
20af0 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65   }..    if( iGue
20b00 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75  ss<=btreePagecou
20b10 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
20b20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
20b30 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54  pBt, iGuess, &eT
20b40 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20  ype, &pgno);.   
20b50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20b60 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50  E_OK && eType==P
20b70 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
20b80 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b  && pgno==ovfl ){
20b90 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20  .        next = 
20ba0 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20  iGuess;.        
20bb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
20bc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20bd0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
20be0 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c  sert( next==0 ||
20bf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
20c00 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
20c10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
20c20 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
20c30 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
20c40 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20  ge, (ppPage==0) 
20c50 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
20c60 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61  ONLY : 0);.    a
20c70 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
20c80 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
20c90 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
20ca0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20cb0 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
20cc0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
20cd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
20ce0 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
20cf0 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29  ;.  if( ppPage )
20d00 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
20d10 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pPage;.  }else{.
20d20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
20d30 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
20d40 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
20d50 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f  _DONE ? SQLITE_O
20d60 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  K : rc);.}../*.*
20d70 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
20d80 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70   a buffer to a p
20d90 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70  age, or from a p
20da0 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e  age to a buffer.
20db0 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20  .**.** pPayload 
20dc0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
20dd0 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64  data stored on d
20de0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
20df0 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75  Page..** If argu
20e00 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73  ment eOp is fals
20e10 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79  e, then nByte by
20e20 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20  tes of data are 
20e30 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70  copied.** from p
20e40 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62  Payload to the b
20e50 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74  uffer pointed at
20e60 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70   by pBuf. If eOp
20e70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65   is true,.** the
20e80 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
20e90 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
20ea0 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e  on pDbPage and n
20eb0 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Byte bytes.** of
20ec0 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
20ed0 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
20ee0 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61   pBuf to pPayloa
20ef0 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
20f00 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
20f10 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72  n success, other
20f20 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  wise an error co
20f30 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
20f40 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20  t copyPayload(. 
20f50 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c   void *pPayload,
20f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
20f70 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61  inter to page da
20f80 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  ta */.  void *pB
20f90 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
20fa0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
20fb0 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
20fc0 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
20fd0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20fe0 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79  of bytes to copy
20ff0 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20   */.  int eOp,  
21000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21010 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f  /* 0 -> copy fro
21020 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70  m page, 1 -> cop
21030 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44  y to page */.  D
21040 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20  bPage *pDbPage  
21050 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
21060 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79   containing pPay
21070 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  load */.){.  if(
21080 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43   eOp ){.    /* C
21090 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75  opy data from bu
210a0 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20  ffer to page (a 
210b0 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29  write operation)
210c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
210d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
210e0 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
210f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21100 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
21110 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
21120 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
21130 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
21140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
21150 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70  Copy data from p
21160 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61  age to buffer (a
21170 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29   read operation)
21180 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   */.    memcpy(p
21190 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e  Buf, pPayload, n
211a0 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Byte);.  }.  ret
211b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
211c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
211d0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
211e0 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69   read or overwri
211f0 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  te payload infor
21200 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68  mation.** for th
21210 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
21220 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
21230 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65  pointing to. The
21240 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   eOp.** argument
21250 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
21260 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
21270 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61  *   0: The opera
21280 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20  tion is a read. 
21290 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
212a0 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20  rflow cache..** 
212b0 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69    1: The operati
212c0 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20 50  on is a write. P
212d0 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
212e0 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20  flow cache..**  
212f0 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   2: The operatio
21300 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44 6f 20  n is a read. Do 
21310 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74 68 65  not populate the
21320 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
21330 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
21340 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
21350 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
21360 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
21370 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
21380 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
21390 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
213a0 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  Buf..**.** The c
213b0 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61  ontent being rea
213c0 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67  d or written mig
213d0 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ht appear on the
213e0 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72   main page.** or
213f0 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75   be scattered ou
21400 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76  t on multiple ov
21410 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
21420 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
21430 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  nt cursor entry 
21440 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
21450 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
21460 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20 61  and the.** eOp a
21470 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 32  rgument is not 2
21480 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
21490 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  may allocate spa
214a0 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
214b0 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 73 20  y .** populates 
214c0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
214d0 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72 72  e-list cache arr
214e0 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
214f0 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62  erflow). .** Sub
21500 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73  sequent calls us
21510 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f 20  e this cache to 
21520 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20  make seeking to 
21530 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66  the supplied off
21540 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66  set .** more eff
21550 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  icient..**.** On
21560 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce an overflow p
21570 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
21580 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
21590 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20  d, it may be.** 
215a0 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73  invalidated if s
215b0 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  ome other cursor
215c0 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73   writes to the s
215d0 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66  ame table, or if
215e0 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
215f0 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66  s moved to a dif
21600 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69  ferent row. Addi
21610 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74  tionally, in aut
21620 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65  o-vacuum.** mode
21630 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
21640 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c  events may inval
21650 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f  idate an overflo
21660 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
21670 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20  e..**.**   * An 
21680 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
21690 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d  um,.**   * A com
216a0 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75  mit in auto_vacu
216b0 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a  um="full" mode,.
216c0 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20  **   * Creating 
216d0 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71  a table (may req
216e0 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f  uire moving an o
216f0 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a  verflow page)..*
21700 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63  /.static int acc
21710 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  essPayload(.  Bt
21720 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
21730 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
21740 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
21750 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
21760 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
21770 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
21780 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
21790 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
217a0 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20    u32 amt,      
217b0 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
217c0 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
217d0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
217e0 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
217f0 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
21800 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
21810 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
21820 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
21830 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
21840 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
21850 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
21860 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
21870 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21880 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  K;.  int iIdx = 
21890 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
218a0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
218b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
218c0 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
218d0 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
218e0 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
218f0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20  Bt = pCur->pBt; 
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21910 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
21920 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
21930 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
21940 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
21950 57 5f 52 45 41 44 0a 20 20 69 6e 74 20 62 45 6e  W_READ.  int bEn
21960 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
21970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21980 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
21990 61 64 69 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20  ading to end of 
219a0 64 61 74 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  data */.#endif..
219b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
219c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
219d0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
219e0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
219f0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
21a00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
21a10 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
21a20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
21a30 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
21a40 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 21  ;.  assert( eOp!
21a50 3d 32 20 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20  =2 || offset==0 
21a60 29 3b 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  );    /* Always 
21a70 73 74 61 72 74 20 66 72 6f 6d 20 62 65 67 69 6e  start from begin
21a80 6e 69 6e 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20  ning for eOp==2 
21a90 2a 2f 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  */..  getCellInf
21aa0 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
21ab0 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
21ac0 2e 70 50 61 79 6c 6f 61 64 3b 0a 23 69 66 64 65  .pPayload;.#ifde
21ad0 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
21ae0 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
21af0 62 45 6e 64 20 3d 20 6f 66 66 73 65 74 2b 61 6d  bEnd = offset+am
21b00 74 3d 3d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  t==pCur->info.nP
21b10 61 79 6c 6f 61 64 3b 0a 23 65 6e 64 69 66 0a 20  ayload;.#endif. 
21b20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b   assert( offset+
21b30 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66  amt <= pCur->inf
21b40 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20  o.nPayload );.. 
21b50 20 69 66 28 20 26 61 50 61 79 6c 6f 61 64 5b 70   if( &aPayload[p
21b60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
21b70 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74  ] > &pPage->aDat
21b80 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
21b90 65 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79  e] ){.    /* Try
21ba0 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ing to read or w
21bb0 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  rite past the en
21bc0 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73  d of the data is
21bd0 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
21be0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
21bf0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
21c00 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
21c10 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61  data must be rea
21c20 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f  d/written to/fro
21c30 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65  m the btree page
21c40 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66   itself. */.  if
21c50 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69  ( offset<pCur->i
21c60 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
21c70 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
21c80 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e     if( a+offset>
21c90 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
21ca0 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70  l ){.      a = p
21cb0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
21cc0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d   - offset;.    }
21cd0 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61  .    rc = copyPa
21ce0 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
21cf0 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
21d00 2c 20 28 65 4f 70 20 26 20 30 78 30 31 29 2c 20  , (eOp & 0x01), 
21d10 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
21d20 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b  .    offset = 0;
21d30 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a  .    pBuf += a;.
21d40 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
21d50 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65  }else{.    offse
21d60 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t -= pCur->info.
21d70 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69  nLocal;.  }..  i
21d80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21d90 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
21da0 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53   const u32 ovflS
21db0 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
21dc0 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42  eSize - 4;  /* B
21dd0 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72  ytes content per
21de0 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20   ovfl page */.  
21df0 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b    Pgno nextPage;
21e00 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  ..    nextPage =
21e10 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
21e20 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
21e30 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a  Local]);..    /*
21e40 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72   If the BtCursor
21e50 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73  .aOverflow[] has
21e60 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
21e70 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
21e80 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63   now..    ** Exc
21e90 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f  ept, do not allo
21ea0 63 61 74 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d  cate aOverflow[]
21eb0 20 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20   for eOp==2..   
21ec0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61   **.    ** The a
21ed0 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
21ee0 20 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65   is sized at one
21ef0 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
21f00 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
21f10 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72    ** in the over
21f20 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
21f30 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
21f40 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
21f50 77 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a  w page is.    **
21f60 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72   stored in aOver
21f70 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20  flow[0], etc. A 
21f80 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68  value of 0 in th
21f90 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
21fa0 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73  ray.    ** means
21fb0 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22   "not yet known"
21fc0 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c   (the cache is l
21fd0 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29  azily populated)
21fe0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
21ff0 20 65 4f 70 21 3d 32 20 26 26 20 28 70 43 75 72   eOp!=2 && (pCur
22000 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
22010 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
22020 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
22030 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
22040 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
22050 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
22060 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
22070 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66  ;.      if( nOvf
22080 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c  l>pCur->nOvflAll
22090 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  oc ){.        Pg
220a0 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f  no *aNew = (Pgno
220b0 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  *)sqlite3DbReall
220c0 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  oc(.            
220d0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
220e0 2c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  , pCur->aOverflo
220f0 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f  w, nOvfl*2*sizeo
22100 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20  f(Pgno).        
22110 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
22120 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
22130 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22140 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d  NOMEM;.        }
22150 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
22160 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63  pCur->nOvflAlloc
22170 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20 20   = nOvfl*2;.    
22180 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
22190 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20  rflow = aNew;.  
221a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
221b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
221c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
221d0 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e     memset(pCur->
221e0 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f  aOverflow, 0, nO
221f0 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29  vfl*sizeof(Pgno)
22200 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
22210 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
22220 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20  F_ValidOvfl;.   
22230 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
22240 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c  /* If the overfl
22250 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
22260 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
22270 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20  cated and the.  
22280 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
22290 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
222a0 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
222b0 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
222c0 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74     ** directly t
222d0 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o it..    */.   
222e0 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46   if( (pCur->curF
222f0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
22300 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20 20 20 26  dOvfl)!=0.     &
22310 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
22320 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a  w[offset/ovflSiz
22330 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e].    ){.      
22340 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f  iIdx = (offset/o
22350 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
22360 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
22370 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
22380 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d  ;.      offset =
22390 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a   (offset%ovflSiz
223a0 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  e);.    }..    f
223b0 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45  or( ; rc==SQLITE
223c0 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20  _OK && amt>0 && 
223d0 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b  nextPage; iIdx++
223e0 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  ){..      /* If 
223f0 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61  required, popula
22400 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
22410 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
22420 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70   */.      if( (p
22430 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
22440 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21  BTCF_ValidOvfl)!
22450 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
22460 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65  sert(!pCur->aOve
22470 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70  rflow[iIdx] || p
22480 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
22490 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b  Idx]==nextPage);
224a0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61  .        pCur->a
224b0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d  Overflow[iIdx] =
224c0 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20   nextPage;.     
224d0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66   }..      if( of
224e0 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29  fset>=ovflSize )
224f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
22500 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20   only reason to 
22510 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69  read this page i
22520 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  s to obtain the 
22530 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
22540 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e  number for the n
22550 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
22560 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
22570 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  The page.       
22580 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20   ** data is not 
22590 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72  required. So fir
225a0 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70  st try to lookup
225b0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20   the overflow.  
225c0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69        ** page-li
225d0 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79  st cache, if any
225e0 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b  , then fall back
225f0 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66   to the getOverf
22600 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20  lowPage().      
22610 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20    ** function.. 
22620 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
22630 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
22640 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
22650 72 72 61 79 20 6d 75 73 74 20 62 65 20 61 6c 6c  rray must be all
22660 6f 63 61 74 65 64 20 62 65 63 61 75 73 65 20 65  ocated because e
22670 4f 70 21 3d 32 0a 20 20 20 20 20 20 20 20 2a 2a  Op!=2.        **
22680 20 68 65 72 65 2e 20 20 49 66 20 65 4f 70 3d 3d   here.  If eOp==
22690 32 2c 20 74 68 65 6e 20 6f 66 66 73 65 74 3d 3d  2, then offset==
226a0 30 20 61 6e 64 20 74 68 69 73 20 62 72 61 6e 63  0 and this branc
226b0 68 20 69 73 20 6e 65 76 65 72 20 74 61 6b 65 6e  h is never taken
226c0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
226d0 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70       assert( eOp
226e0 21 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 61  !=2 );.        a
226f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72  ssert( pCur->cur
22700 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
22710 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20  idOvfl );.      
22720 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
22730 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b  rflow[iIdx+1] ){
22740 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
22750 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
22760 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20  rflow[iIdx+1];. 
22770 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22780 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
22790 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
227a0 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26  , nextPage, 0, &
227b0 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
227c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66     }.        off
227d0 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b  set -= ovflSize;
227e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
227f0 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f        /* Need to
22800 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
22810 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e  properly. It con
22820 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68  tains some of th
22830 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e  e.        ** ran
22840 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ge of data that 
22850 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65  is being read (e
22860 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65  Op==0) or writte
22870 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20  n (eOp!=0)..    
22880 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
22890 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
228a0 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
228b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
228c0 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  fd;.#endif.     
228d0 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
228e0 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20          if( a + 
228f0 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a  offset > ovflSiz
22900 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  e ){.          a
22910 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66   = ovflSize - of
22920 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fset;.        }.
22930 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
22940 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
22950 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  EAD.        /* I
22960 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77  f all the follow
22970 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
22980 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
22990 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73   **   1) this is
229a0 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
229b0 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20  n, and .        
229c0 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20  **   2) data is 
229d0 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68  required from th
229e0 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  e start of this 
229f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61  overflow page, a
22a00 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
22a10 33 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  3) the database 
22a20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20  is file-backed, 
22a30 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
22a40 20 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20   4) there is no 
22a50 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73  open write-trans
22a60 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
22a70 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20      **   5) the 
22a80 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
22a90 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a  a WAL database,.
22aa0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20          **   6) 
22ab0 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  all data from th
22ac0 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
22ad0 72 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a  read..        **
22ae0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
22af0 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61   data can be rea
22b00 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20  d directly from 
22b10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22b20 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  e into the.     
22b30 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66     ** output buf
22b40 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74  fer, bypassing t
22b50 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c  he page-cache al
22b60 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73  together. This s
22b70 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a  peeds.        **
22b80 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67   up loading larg
22b90 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73  e records that s
22ba0 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f  pan many overflo
22bb0 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20  w pages..       
22bc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
22bd0 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20 20  (eOp&0x01)==0   
22be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c00 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20     /* (1) */.   
22c10 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d        && offset=
22c20 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
22c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
22c50 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  2) */.         &
22c60 26 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76  & (bEnd || a==ov
22c70 66 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20 20  flSize)         
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c90 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20       /* (6) */. 
22ca0 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e          && pBt->
22cb0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
22cc0 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20  RANS_READ       
22cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ce0 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (4) */.        
22cf0 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65   && (fd = sqlite
22d00 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
22d10 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f  pPager))->pMetho
22d20 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f  ds     /* (3) */
22d30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74  .         && pBt
22d40 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
22d50 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20  19]==0x01       
22d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d70 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20  /* (5) */.      
22d80 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75    ){.          u
22d90 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20  8 aSave[4];.    
22da0 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74 65        u8 *aWrite
22db0 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20   = &pBuf[-4];.  
22dc0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
22dd0 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29  Save, aWrite, 4)
22de0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
22df0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
22e00 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20  d, aWrite, a+4, 
22e10 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69  (i64)pBt->pageSi
22e20 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29  ze*(nextPage-1))
22e30 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
22e40 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
22e50 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20  aWrite);.       
22e60 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65     memcpy(aWrite
22e70 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20  , aSave, 4);.   
22e80 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
22e90 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  f..        {.   
22ea0 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
22eb0 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
22ec0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
22ed0 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e  gerAcquire(pBt->
22ee0 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
22ef0 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20  , &pDbPage,.    
22f00 20 20 20 20 20 20 20 20 20 20 28 28 65 4f 70 26            ((eOp&
22f10 30 78 30 31 29 3d 3d 30 20 3f 20 50 41 47 45 52  0x01)==0 ? PAGER
22f20 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
22f30 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  0).          );.
22f40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
22f50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22f60 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c             aPayl
22f70 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
22f80 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
22f90 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
22fa0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
22fb0 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
22fc0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
22fd0 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
22fe0 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
22ff0 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 26 30   pBuf, a, (eOp&0
23000 78 30 31 29 2c 20 70 44 62 50 61 67 65 29 3b 0a  x01), pDbPage);.
23010 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23020 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
23030 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
23040 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
23050 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23060 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d      }.        am
23070 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
23080 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
23090 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
230a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
230b0 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
230c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
230d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
230e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
230f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
23100 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73  t of the key ass
23110 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
23120 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
23130 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
23140 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
23150 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  erred into pBuf[
23160 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
23170 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
23180 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68  ffset"..**.** Th
23190 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
231a0 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
231b0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
231c0 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20  valid row.** in 
231d0 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
231e0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
231f0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
23200 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
23210 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
23220 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
23230 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
23240 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
23250 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
23260 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
23270 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
23280 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42  qlite3BtreeKey(B
23290 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
232a0 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
232b0 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
232c0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
232d0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
232e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
232f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
23300 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
23310 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
23320 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
23330 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
23340 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
23350 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
23360 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
23370 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
23380 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72  e]->nCell );.  r
23390 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
233a0 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
233b0 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
233c0 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b   char*)pBuf, 0);
233d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
233e0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
233f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
23400 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
23410 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
23420 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
23430 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
23440 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
23450 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
23460 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
23470 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
23480 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
23490 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
234a0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
234b0 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
234c0 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
234d0 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
234e0 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
234f0 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
23500 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
23510 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42  lite3BtreeData(B
23520 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
23530 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
23540 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
23550 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e  .  int rc;..#ifn
23560 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23570 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20  INCRBLOB.  if ( 
23580 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23590 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
235a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
235b0 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e  E_ABORT;.  }.#en
235c0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63  dif..  assert( c
235d0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
235e0 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
235f0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
23600 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
23610 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23620 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
23630 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23640 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
23650 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23660 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
23670 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23680 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73  Page] );.    ass
23690 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
236a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
236b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
236c0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
236d0 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
236e0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
236f0 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
23700 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
23710 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23720 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
23730 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
23740 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
23750 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
23760 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
23770 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
23780 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
23790 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
237a0 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
237b0 66 20 69 6e 64 65 78 20 62 74 72 65 65 73 20 28  f index btrees (
237c0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pPage->intKey==0
237d0 29 20 61 6e 64 20 69 73 20 74 68 65 20 64 61 74  ) and is the dat
237e0 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62  a for.** table b
237f0 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
23800 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75  tKey==1). The nu
23810 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
23820 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65   available.** ke
23830 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
23840 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  n into *pAmt.  I
23850 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
23860 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65   the value.** re
23870 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
23880 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  be a valid point
23890 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
238a0 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
238b0 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
238c0 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
238d0 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
238e0 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
238f0 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
23900 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
23910 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
23920 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
23930 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
23940 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
23950 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
23960 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
23970 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
23980 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
23990 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
239a0 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
239b0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
239c0 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79  , then accessPay
239d0 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75  load() must be u
239e0 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c  sed to reassembl
239f0 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74  e.** the key/dat
23a00 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e  a and copy it in
23a10 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  to a preallocate
23a20 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
23a30 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
23a40 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  rned by this rou
23a50 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63  tine looks direc
23a60 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63  tly into the cac
23a70 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74  hed.** page of t
23a80 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
23a90 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61  e data might cha
23aa0 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20  nge or move the 
23ab0 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79  next time.** any
23ac0 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69   btree routine i
23ad0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
23ae0 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  tic const void *
23af0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
23b00 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
23b10 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
23b20 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
23b30 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
23b40 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20  .  u32 *pAmt    
23b50 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
23b60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
23b70 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
23b80 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ere */.){.  asse
23b90 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
23ba0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
23bb0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
23bc0 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61  ur->iPage]);.  a
23bd0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
23be0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
23bf0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  D );.  assert( s
23c00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
23c10 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
23c20 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
23c30 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
23c40 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
23c50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23c60 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
23c70 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
23c80 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
23c90 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
23ca0 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
23cb0 69 7a 65 3e 30 20 29 3b 0a 20 20 2a 70 41 6d 74  ize>0 );.  *pAmt
23cc0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
23cd0 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 28  ocal;.  return (
23ce0 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f  void*)pCur->info
23cf0 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f  .pPayload;.}.../
23d00 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
23d10 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
23d20 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
23d30 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
23d40 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
23d50 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
23d60 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
23d70 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
23d80 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
23d90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
23da0 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
23db0 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
23dc0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
23dd0 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
23de0 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
23df0 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
23e00 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
23e10 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
23e20 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
23e30 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  ine,.** includin
23e40 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68  g calls from oth
23e50 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e  er threads again
23e60 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  st the same cach
23e70 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d  e..** Hence, a m
23e80 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
23e90 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68  ared should be h
23ea0 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  eld prior to cal
23eb0 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ling.** this rou
23ec0 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
23ed0 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
23ee0 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
23ef0 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
23f00 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
23f10 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
23f20 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
23f30 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
23f40 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
23f50 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74  lite3BtreeKeyFet
23f60 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
23f70 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20  r, u32 *pAmt){. 
23f80 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79   return fetchPay
23f90 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29  load(pCur, pAmt)
23fa0 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.}.const void *
23fb0 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
23fc0 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
23fd0 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29  pCur, u32 *pAmt)
23fe0 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68  {.  return fetch
23ff0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
24000 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  mt);.}.../*.** M
24010 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
24020 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
24030 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
24040 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
24050 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
24060 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
24070 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
24080 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  o..**.** This fu
24090 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
240a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
240b0 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72   the page-header
240c0 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a   flags field of.
240d0 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  ** the new child
240e0 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d   page does not m
240f0 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66  atch the flags f
24100 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65  ield of the pare
24110 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61  nt (i.e..** if a
24120 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70  n intkey page ap
24130 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20  pears to be the 
24140 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d  parent of a non-
24150 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a  intkey page, or.
24160 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a  ** vice-versa)..
24170 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
24180 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73  veToChild(BtCurs
24190 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65  or *pCur, u32 ne
241a0 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63  wPgno){.  int rc
241b0 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72  ;.  int i = pCur
241c0 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61  ->iPage;.  MemPa
241d0 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20  ge *pNewPage;.  
241e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
241f0 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
24200 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
24210 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
24220 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24230 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
24240 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
24250 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54  ( pCur->iPage<BT
24260 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
24270 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
24280 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a  ur->iPage>=0 );.
24290 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
242a0 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58  e>=(BTCURSOR_MAX
242b0 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20  _DEPTH-1) ){.   
242c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
242d0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
242e0 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
242f0 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
24300 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c 0a  gno, &pNewPage,.
24310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
24320 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
24330 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
24340 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  ==0 ? PAGER_GET_
24350 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20  READONLY : 0);. 
24360 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
24370 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50   rc;.  pCur->apP
24380 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50  age[i+1] = pNewP
24390 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49  age;.  pCur->aiI
243a0 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70  dx[i+1] = 0;.  p
243b0 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20  Cur->iPage++;.. 
243c0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
243d0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
243e0 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
243f0 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
24400 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69  _ValidOvfl);.  i
24410 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65  f( pNewPage->nCe
24420 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67 65  ll<1 || pNewPage
24430 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e  ->intKey!=pCur->
24440 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65  apPage[i]->intKe
24450 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
24460 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
24470 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
24480 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
24490 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 50 61 67 65  #if 0./*.** Page
244a0 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69   pParent is an i
244b0 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61  nternal (non-lea
244c0 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68  f) tree page. Th
244d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
244e0 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67  asserts that pag
244f0 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
24500 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c  is the left-chil
24510 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68  d if the iIdx'th
24520 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65  .** cell in page
24530 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66   pParent. Or, if
24540 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74   iIdx is equal t
24550 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  o the total numb
24560 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69  er of.** cells i
24570 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20  n pParent, that 
24580 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
24590 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ld is the right-
245a0 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  child of.** the 
245b0 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
245c0 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e  void assertParen
245d0 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a  tIndex(MemPage *
245e0 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64  pParent, int iId
245f0 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b  x, Pgno iChild){
24600 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c  .  assert( iIdx<
24610 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
24620 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70  );.  if( iIdx==p
24630 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
24640 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
24650 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
24660 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
24670 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43  drOffset+8])==iC
24680 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  hild );.  }else{
24690 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
246a0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
246b0 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d  Parent, iIdx))==
246c0 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a  iChild );.  }.}.
246d0 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
246e0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
246f0 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66  x(x,y,z) .#endif
24700 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
24710 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68   cursor up to th
24720 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a  e parent page..*
24730 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69  *.** pCur->idx i
24740 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  s set to the cel
24750 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  l index that con
24760 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65  tains the pointe
24770 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65  r.** to the page
24780 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
24790 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20  rom.  If we are 
247a0 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a  coming from the.
247b0 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68  ** right-most ch
247c0 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43  ild page then pC
247d0 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
247e0 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a  o one more than.
247f0 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63  ** the largest c
24800 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ell index..*/.st
24810 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f  atic void moveTo
24820 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20  Parent(BtCursor 
24830 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
24840 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
24850 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
24860 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
24870 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
24880 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
24890 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20  ur->iPage>0 );. 
248a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
248b0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
248c0 65 5d 20 29 3b 0a 0a 20 20 2f 2a 20 55 50 44 41  e] );..  /* UPDA
248d0 54 45 3a 20 49 74 20 69 73 20 61 63 74 75 61 6c  TE: It is actual
248e0 6c 79 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ly possible for 
248f0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 74 65  the condition te
24900 73 74 65 64 20 62 79 20 74 68 65 20 61 73 73 65  sted by the asse
24910 72 74 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 74 6f  rt.  ** below to
24920 20 62 65 20 75 6e 74 72 75 65 20 69 66 20 74 68   be untrue if th
24930 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24940 69 73 20 63 6f 72 72 75 70 74 2e 20 54 68 69 73  is corrupt. This
24950 20 63 61 6e 20 6f 63 63 75 72 20 69 66 0a 20 20   can occur if.  
24960 2a 2a 20 6f 6e 65 20 63 75 72 73 6f 72 20 68 61  ** one cursor ha
24970 73 20 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20  s modified page 
24980 70 50 61 72 65 6e 74 20 77 68 69 6c 65 20 61 20  pParent while a 
24990 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 20  reference to it 
249a0 69 73 20 68 65 6c 64 20 0a 20 20 2a 2a 20 62 79  is held .  ** by
249b0 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72   a second cursor
249c0 2e 20 57 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79  . Which can only
249d0 20 68 61 70 70 65 6e 20 69 66 20 61 20 73 69 6e   happen if a sin
249e0 67 6c 65 20 70 61 67 65 20 69 73 20 6c 69 6e 6b  gle page is link
249f0 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 6d 6f 72  ed.  ** into mor
24a00 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65  e than one b-tre
24a10 65 20 73 74 72 75 63 74 75 72 65 20 69 6e 20 61  e structure in a
24a20 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
24a30 65 2e 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  e.  */.#if 0.  a
24a40 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
24a50 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  (.    pCur->apPa
24a60 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
24a70 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ], .    pCur->ai
24a80 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
24a90 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
24aa0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
24ab0 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 23 65  e]->pgno.  );.#e
24ac0 6e 64 69 66 0a 20 20 74 65 73 74 63 61 73 65 28  ndif.  testcase(
24ad0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
24ae0 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43  r->iPage-1] > pC
24af0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24b00 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c  >iPage-1]->nCell
24b10 20 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61   );..  releasePa
24b20 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
24b30 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
24b40 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a   pCur->iPage--;.
24b50 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
24b60 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
24b70 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
24b80 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
24b90 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 7d 0a  F_ValidOvfl);.}.
24ba0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
24bb0 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
24bc0 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
24bd0 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73   of its b-tree s
24be0 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
24bf0 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  If the table has
24c00 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   a virtual root 
24c10 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63  page, then the c
24c20 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
24c30 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68  o point.** to th
24c40 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  e virtual root p
24c50 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74  age instead of t
24c60 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
24c70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73  age. A table has
24c80 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f   a.** virtual ro
24c90 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65  ot page when the
24ca0 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
24cb0 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
24cc0 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69  lls and a .** si
24cd0 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e  ngle child page.
24ce0 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68   This can only h
24cf0 61 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74  appen with the t
24d00 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70  able rooted at p
24d10 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age 1..**.** If 
24d20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  the b-tree struc
24d30 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ture is empty, t
24d40 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20  he cursor state 
24d50 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55  is set to .** CU
24d60 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74  RSOR_INVALID. Ot
24d70 68 65 72 77 69 73 65 2c 20 74 68 65 20 63 75 72  herwise, the cur
24d80 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f  sor is set to po
24d90 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  int to the first
24da0 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64  .** cell located
24db0 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72   on the root (or
24dc0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70   virtual root) p
24dd0 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73  age and the curs
24de0 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73  or state.** is s
24df0 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c  et to CURSOR_VAL
24e00 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ID..**.** If thi
24e10 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
24e20 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ns successfully,
24e30 20 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d   it may be assum
24e40 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70  ed that the.** p
24e50 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73  age-header flags
24e60 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
24e70 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f  he [virtual] roo
24e80 74 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78  t-page is the ex
24e90 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20  pected .** kind 
24ea0 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28  of b-tree page (
24eb0 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65  i.e. if when ope
24ec0 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
24ed0 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e  the caller did n
24ee0 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20  ot.** specify a 
24ef0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
24f00 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
24f10 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20   is set to 0x05 
24f20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69  or 0x0D,.** indi
24f30 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62  cating a table b
24f40 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65  -tree, or if the
24f50 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63   caller did spec
24f60 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a  ify a KeyInfo .*
24f70 2a 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20  * structure the 
24f80 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65  flags byte is se
24f90 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30  t to 0x02 or 0x0
24fa0 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e  A, indicating an
24fb0 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65   index.** b-tree
24fc0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
24fd0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75   moveToRoot(BtCu
24fe0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
24ff0 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
25000 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
25010 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
25020 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
25030 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
25040 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  rt( CURSOR_INVAL
25050 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  ID < CURSOR_REQU
25060 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
25070 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
25080 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  D   < CURSOR_REQ
25090 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
250a0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55  sert( CURSOR_FAU
250b0 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45  LT   > CURSOR_RE
250c0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
250d0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  f( pCur->eState>
250e0 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
250f0 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  EEK ){.    if( p
25100 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
25110 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
25120 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
25130 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54  >skipNext!=SQLIT
25140 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65  E_OK );.      re
25150 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
25160 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ext;.    }.    s
25170 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
25180 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
25190 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  }..  if( pCur->i
251a0 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 77  Page>=0 ){.    w
251b0 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67  hile( pCur->iPag
251c0 65 20 29 20 72 65 6c 65 61 73 65 50 61 67 65 28  e ) releasePage(
251d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
251e0 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20  r->iPage--]);.  
251f0 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e  }else if( pCur->
25200 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  pgnoRoot==0 ){. 
25210 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
25220 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
25230 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
25240 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
25250 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
25260 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70  InitPage(pCur->p
25270 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72  Btree->pBt, pCur
25280 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75  ->pgnoRoot, &pCu
25290 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20  r->apPage[0],.  
252a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
252b0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
252c0 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
252d0 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  ==0 ? PAGER_GET_
252e0 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20  READONLY : 0);. 
252f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25300 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43  E_OK ){.      pC
25310 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
25320 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
25330 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
25340 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
25350 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  age = 0;.  }.  p
25360 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  Root = pCur->apP
25370 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74  age[0];.  assert
25380 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70  ( pRoot->pgno==p
25390 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b  Cur->pgnoRoot );
253a0 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e  ..  /* If pCur->
253b0 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20  pKeyInfo is not 
253c0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63  NULL, then the c
253d0 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65  aller that opene
253e0 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20  d this cursor.  
253f0 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f  ** expected to o
25400 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64  pen it on an ind
25410 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72  ex b-tree. Other
25420 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66  wise, if pKeyInf
25430 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20  o is.  ** NULL, 
25440 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63  the caller expec
25450 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ts a table b-tre
25460 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  e. If this is no
25470 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a  t the case,.  **
25480 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
25490 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e  E_CORRUPT error.
254a0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c   .  **.  ** Earl
254b0 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ier versions of 
254c0 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74  SQLite assumed t
254d0 68 61 74 20 74 68 69 73 20 74 65 73 74 20 63 6f  hat this test co
254e0 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a  uld not fail.  *
254f0 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61  * if the root pa
25500 67 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c  ge was already l
25510 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69 73 20  oaded when this 
25520 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
25530 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69  led (i.e..  ** i
25540 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  f pCur->iPage>=0
25550 29 2e 20 42 75 74 20 74 68 69 73 20 69 73 20 6e  ). But this is n
25560 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64 61 74  ot so if the dat
25570 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
25580 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68  ed .  ** in such
25590 20 61 20 77 61 79 20 74 68 61 74 20 70 61 67 65   a way that page
255a0 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64   pRoot is linked
255b0 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62   into a second b
255c0 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a  -tree table .  *
255d0 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69  * (or the freeli
255e0 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  st).  */.  asser
255f0 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  t( pRoot->intKey
25600 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e  ==1 || pRoot->in
25610 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28  tKey==0 );.  if(
25620 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d   pRoot->isInit==
25630 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79  0 || (pCur->pKey
25640 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d  Info==0)!=pRoot-
25650 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72  >intKey ){.    r
25660 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
25670 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
25680 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
25690 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
256a0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
256b0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
256c0 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
256d0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
256e0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
256f0 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
25700 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75  ell>0 ){.    pCu
25710 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
25720 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
25730 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65  e if( !pRoot->le
25740 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73  af ){.    Pgno s
25750 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20  ubpage;.    if( 
25760 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29  pRoot->pgno!=1 )
25770 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
25780 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
25790 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62   subpage = get4b
257a0 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
257b0 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
257c0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
257d0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
257e0 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  R_VALID;.    rc 
257f0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
25800 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20  ur, subpage);.  
25810 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
25820 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
25830 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20  _INVALID;.  }.  
25840 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25850 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
25860 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
25870 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
25880 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
25890 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
258a0 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
258b0 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
258c0 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
258d0 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
258e0 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
258f0 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
25900 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
25910 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
25920 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
25930 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
25940 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
25950 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
25960 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
25970 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
25980 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
25990 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
259a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
259b0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
259c0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
259d0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
259e0 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
259f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
25a00 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
25a10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
25a20 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
25a30 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43  iPage]<pPage->nC
25a40 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20  ell );.    pgno 
25a50 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
25a60 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
25a70 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
25a80 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ge]));.    rc = 
25a90 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
25aa0 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
25ab0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25ac0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
25ad0 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72  or down to the r
25ae0 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  ight-most leaf e
25af0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
25b00 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63  .** page to whic
25b10 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
25b20 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74  y pointing.  Not
25b30 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e  ice the differen
25b40 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f  ce.** between mo
25b50 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61  veToLeftmost() a
25b60 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nd moveToRightmo
25b70 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66  st().  moveToLef
25b80 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
25b90 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65   the left-most e
25ba0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
25bb0 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73   *entry* whereas
25bc0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
25bd0 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
25be0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
25bf0 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61   beneath the *pa
25c00 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ge*..**.** The r
25c10 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
25c20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
25c30 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
25c40 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65  - the last.** ke
25c50 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  y in ascending o
25c60 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
25c70 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  int moveToRightm
25c80 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
25c90 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
25ca0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
25cb0 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
25cc0 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20  e *pPage = 0;.. 
25cd0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
25ce0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
25cf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
25d00 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
25d10 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
25d20 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43  le( !(pPage = pC
25d30 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
25d40 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
25d50 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
25d60 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
25d70 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
25d80 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
25d90 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
25da0 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
25db0 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
25dc0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
25dd0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  , pgno);.    if(
25de0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
25df0 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49  .  }.  pCur->aiI
25e00 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
25e10 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
25e20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
25e30 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
25e40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
25e50 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
25e60 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d  TCF_ValidNKey)==
25e70 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
25e80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d  LITE_OK;.}../* M
25e90 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
25ea0 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
25eb0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
25ec0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
25ed0 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
25ee0 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
25ef0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
25f00 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
25f10 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
25f20 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
25f30 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
25f40 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
25f50 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74  qlite3BtreeFirst
25f60 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
25f70 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
25f80 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
25f90 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
25fa0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
25fb0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
25fc0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
25fd0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
25fe0 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
25ff0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
26000 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26010 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
26020 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
26030 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
26040 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
26050 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
26060 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26070 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
26080 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
26090 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
260a0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
260b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
260c0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
260d0 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  l>0 );.      *pR
260e0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
260f0 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
26100 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
26110 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
26120 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
26130 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73  ursor to the las
26140 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
26150 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
26160 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
26170 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
26180 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
26190 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
261a0 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
261b0 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
261c0 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
261d0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
261e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
261f0 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a  eLast(BtCursor *
26200 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
26210 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20  {.  int rc;. .  
26220 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
26230 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
26240 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
26250 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
26260 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
26270 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
26280 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   If the cursor a
26290 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f  lready points to
262a0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c   the last entry,
262b0 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
262c0 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f  . */.  if( CURSO
262d0 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
262e0 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e  State && (pCur->
262f0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
26300 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69  AtLast)!=0 ){.#i
26310 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
26320 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
26330 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
26340 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
26350 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
26360 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
26370 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
26380 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
26390 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
263a0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
263b0 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
263c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
263d0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
263e0 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
263f0 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
26400 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
26410 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
26420 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72  ur->iPage]==pCur
26430 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26440 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29  Page]->nCell-1 )
26450 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
26460 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26470 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b  >iPage]->leaf );
26480 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
26490 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
264a0 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
264b0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
264c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
264d0 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f  ){.    if( CURSO
264e0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
264f0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
26500 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
26510 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
26520 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26530 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
26540 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
26550 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
26560 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26570 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26580 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
26590 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
265a0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
265b0 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
265c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
265d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
265e0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
265f0 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74  s |= BTCF_AtLast
26600 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
26610 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
26620 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41  Flags &= ~BTCF_A
26630 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  tLast;.      }. 
26640 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72    .    }.  }.  r
26650 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
26660 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
26670 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
26680 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
26690 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
266a0 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
266b0 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
266c0 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
266d0 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
266e0 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
266f0 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
26700 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
26710 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
26720 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
26730 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
26740 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
26750 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
26760 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
26770 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
26780 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
26790 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
267a0 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
267b0 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
267c0 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
267d0 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
267e0 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
267f0 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
26800 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
26810 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
26820 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
26830 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
26840 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74  ey..**.** An int
26850 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  eger is written 
26860 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68  into *pRes which
26870 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   is the result o
26880 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74  f.** comparing t
26890 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
268a0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
268b0 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a  he cursor is .**
268c0 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20   pointing.  The 
268d0 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69  meaning of the i
268e0 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69  nteger written i
268f0 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20  nto.** *pRes is 
26900 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
26910 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
26920 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
26930 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
26940 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
26950 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
26960 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
26970 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
26980 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
26990 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
269a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269b0 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
269c0 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
269d0 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
269e0 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
269f0 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
26a00 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
26a10 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
26a20 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
26a30 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
26a40 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65  ly matches intKe
26a50 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
26a60 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
26a70 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
26a80 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
26a90 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
26aa0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
26ab0 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
26ac0 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
26ad0 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ..**.*/.int sqli
26ae0 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
26af0 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  packed(.  BtCurs
26b00 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
26b10 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
26b20 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a   to be moved */.
26b30 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
26b40 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e   *pIdxKey, /* Un
26b50 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
26b60 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79   */.  i64 intKey
26b70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
26b80 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20  * The table key 
26b90 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67  */.  int biasRig
26ba0 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
26bb0 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74   If true, bias t
26bc0 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  he search to the
26bd0 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
26be0 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
26bf0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
26c00 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
26c10 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
26c20 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d   rc;.  RecordCom
26c30 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70  pare xRecordComp
26c40 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  are;..  assert( 
26c50 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
26c60 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
26c70 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
26c80 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
26c90 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
26ca0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
26cb0 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  s );.  assert( (
26cc0 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  pIdxKey==0)==(pC
26cd0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
26ce0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
26cf0 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
26d00 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74  dy positioned at
26d10 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72   the point we ar
26d20 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f  e trying.  ** to
26d30 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a   move to, then j
26d40 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f  ust return witho
26d50 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
26d60 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d  k */.  if( pCur-
26d70 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
26d80 56 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e  VALID && (pCur->
26d90 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
26da0 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20  ValidNKey)!=0.  
26db0 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
26dc0 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29  [0]->intKey .  )
26dd0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
26de0 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
26df0 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
26e00 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
26e10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
26e20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 43 75    }.    if( (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 41 74 4c 61 73 74 29 21 3d 30 20 26 26  CF_AtLast)!=0 &&
26e50 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
26e60 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
26e70 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
26e80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26e90 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
26ea0 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b    if( pIdxKey ){
26eb0 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70  .    xRecordComp
26ec0 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  are = sqlite3Vdb
26ed0 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64  eFindCompare(pId
26ee0 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b  xKey);.    pIdxK
26ef0 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  ey->errCode = 0;
26f00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
26f10 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
26f20 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==1 .         ||
26f30 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
26f40 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20  t_rc==0 .       
26f50 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65    || pIdxKey->de
26f60 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20  fault_rc==-1.   
26f70 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
26f80 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
26f90 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73  = 0; /* All keys
26fa0 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f   are integers */
26fb0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
26fc0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
26fd0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
26fe0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
26ff0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
27000 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
27010 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
27020 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
27030 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
27040 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
27050 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27060 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  e]->isInit );.  
27070 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
27080 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
27090 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70  ALID || pCur->ap
270a0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
270b0 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  ]->nCell>0 );.  
270c0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
270d0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
270e0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
270f0 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
27100 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
27110 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
27120 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
27130 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
27140 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27150 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
27160 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
27170 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b  >intKey || pIdxK
27180 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b  ey );.  for(;;){
27190 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70  .    int lwr, up
271a0 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50  r, idx, c;.    P
271b0 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20  gno chldPg;.    
271c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
271d0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
271e0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
271f0 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20  u8 *pCell;      
27200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27210 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
27220 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69  o current cell i
27230 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20  n pPage */..    
27240 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  /* pPage->nCell 
27250 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20  must be greater 
27260 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68  than zero. If th
27270 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70  is is the root-p
27280 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  age.    ** the c
27290 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65  ursor would have
272a0 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62   been INVALID ab
272b0 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72  ove and this for
272c0 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a  (;;) loop.    **
272d0 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69   not run. If thi
272e0 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f  s is not the roo
272f0 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t-page, then the
27300 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72   moveToChild() r
27310 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f  outine.    ** wo
27320 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
27330 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f 72   detected db cor
27340 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72  ruption. Similar
27350 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20  ly, pPage must. 
27360 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67     ** be the rig
27370 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f  ht kind (index o
27380 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72  r table) of b-tr
27390 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  ee page. Otherwi
273a0 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65  se.    ** a move
273b0 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76  ToChild() or mov
273c0 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77  eToRoot() call w
273d0 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74  ould have detect
273e0 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  ed corruption.  
273f0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
27400 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
27410 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
27420 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64  ge->intKey==(pId
27430 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20  xKey==0) );.    
27440 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72  lwr = 0;.    upr
27450 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
27460 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62  1;.    assert( b
27470 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62  iasRight==0 || b
27480 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20  iasRight==1 );. 
27490 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31     idx = upr>>(1
274a0 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20  -biasRight); /* 
274b0 69 64 78 20 3d 20 62 69 61 73 52 69 67 68 74 20  idx = biasRight 
274c0 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72  ? upr : (lwr+upr
274d0 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72  )/2; */.    pCur
274e0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
274f0 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
27500 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f 72 64  .    if( xRecord
27510 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20  Compare==0 ){.  
27520 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
27530 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65       i64 nCellKe
27540 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  y;.        pCell
27550 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
27560 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d  e, idx) + pPage-
27570 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
27580 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
27590 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a  ->intKeyLeaf ){.
275a0 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
275b0 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c   0x80 <= *(pCell
275c0 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ++) ){.         
275d0 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50     if( pCell>=pP
275e0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 20  age->aDataEnd ) 
275f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
27600 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
27610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27620 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
27630 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a  int(pCell, (u64*
27640 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
27650 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
27660 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
27670 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
27680 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
27690 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20   lwr>upr ){ c = 
276a0 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20  -1; break; }.   
276b0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
276c0 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29  CellKey>intKey )
276d0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  {.          upr 
276e0 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20  = idx-1;.       
276f0 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
27700 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b  { c = +1; break;
27710 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
27720 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
27730 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e  rt( nCellKey==in
27740 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  tKey );.        
27750 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
27760 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b   |= BTCF_ValidNK
27770 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  ey;.          pC
27780 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
27790 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
277a0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
277b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
277c0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
277d0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
277e0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
277f0 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20     lwr = idx;.  
27800 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
27810 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72  oveto_next_layer
27820 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
27830 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e{.            *
27840 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
27850 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27860 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
27870 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
27880 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
27890 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
278a0 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b      assert( lwr+
278b0 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  upr>=0 );.      
278c0 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72    idx = (lwr+upr
278d0 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20  )>>1;  /* idx = 
278e0 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
278f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
27900 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29  e{.      for(;;)
27910 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
27920 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65  ell;.        pCe
27930 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
27940 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67  age, idx) + pPag
27950 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
27960 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ..        /* The
27970 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74   maximum support
27980 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20  ed page-size is 
27990 36 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69  65536 bytes. Thi
279a0 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20  s means that.   
279b0 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69       ** the maxi
279c0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  mum number of re
279d0 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65  cord bytes store
279e0 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d  d on an index B-
279f0 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  Tree.        ** 
27a00 70 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61  page is less tha
27a10 6e 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e  n 16384 bytes an
27a20 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  d may be stored 
27a30 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20  as a 2-byte.    
27a40 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54      ** varint. T
27a50 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
27a60 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d  is used to attem
27a70 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73  pt to avoid pars
27a80 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ing .        ** 
27a90 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20  the entire cell 
27aa0 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  by checking for 
27ab0 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20  the cases where 
27ac0 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20  the record is . 
27ad0 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64         ** stored
27ae0 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e   entirely within
27af0 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65   the b-tree page
27b00 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74   by inspecting t
27b10 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20  he first .      
27b20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20    ** 2 bytes of 
27b30 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20  the cell..      
27b40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65    */.        nCe
27b50 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20  ll = pCell[0];. 
27b60 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
27b70 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74  <=pPage->max1byt
27b80 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  ePayload ){.    
27b90 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
27ba0 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65  anch runs if the
27bb0 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
27bc0 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69  ld of the cell i
27bd0 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  s a.          **
27be0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72   single byte var
27bf0 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
27c00 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  rd fits entirely
27c10 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20   on the main.   
27c20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65         ** b-tree
27c30 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
27c40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
27c50 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50  Cell+nCell+1==pP
27c60 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
27c70 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
27c80 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
27c90 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
27ca0 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[1], pIdxKey);
27cb0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
27cc0 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20  f( !(pCell[1] & 
27cd0 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20  0x80) .         
27ce0 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e   && (nCell = ((n
27cf0 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b  Cell&0x7f)<<7) +
27d00 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67   pCell[1])<=pPag
27d10 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20  e->maxLocal.    
27d20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
27d30 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73   /* The record-s
27d40 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32  ize field is a 2
27d50 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
27d60 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20   the record .   
27d70 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65         ** fits e
27d80 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
27d90 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ain b-tree page.
27da0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74    */.          t
27db0 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e  estcase( pCell+n
27dc0 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61  Cell+2==pPage->a
27dd0 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20  DataEnd );.     
27de0 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
27df0 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28  Compare(nCell, (
27e00 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c  void*)&pCell[2],
27e10 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
27e20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27e30 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
27e40 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74  d flows over ont
27e50 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  o one or more ov
27e60 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e  erflow pages. In
27e70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
27e80 69 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c  is case the whol
27e90 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20  e cell needs to 
27ea0 62 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66  be parsed, a buf
27eb0 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  fer allocated.  
27ec0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61          ** and a
27ed0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75  ccessPayload() u
27ee0 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20  sed to retrieve 
27ef0 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  the record into 
27f00 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
27f10 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56   buffer before V
27f20 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
27f30 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  () can be called
27f40 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76  . */.          v
27f50 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20  oid *pCellKey;. 
27f60 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f           u8 * co
27f70 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20  nst pCellBody = 
27f80 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63  pCell - pPage->c
27f90 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
27fa0 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73         btreePars
27fb0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
27fc0 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72  pCellBody, &pCur
27fd0 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ->info);.       
27fe0 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29     nCell = (int)
27ff0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
28000 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
28010 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
28020 6c 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20  loc( nCell );.  
28030 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
28040 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lKey==0 ){.     
28050 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
28060 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
28070 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
28080 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
28090 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
280a0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
280b0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
280c0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72  idx;.          r
280d0 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
280e0 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  d(pCur, 0, nCell
280f0 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
28100 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a  *)pCellKey, 2);.
28110 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
28120 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
28130 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
28140 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
28150 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
28160 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
28170 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20    }.          c 
28180 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
28190 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79  (nCell, pCellKey
281a0 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
281b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
281c0 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  ee(pCellKey);.  
281d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
281e0 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 20  assert( .       
281f0 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65       (pIdxKey->e
28200 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43  rrCode!=SQLITE_C
28210 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a  ORRUPT || c==0).
28220 20 20 20 20 20 20 20 20 20 26 26 20 28 70 49 64           && (pId
28230 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53  xKey->errCode!=S
28240 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70  QLITE_NOMEM || p
28250 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
28260 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20  >mallocFailed). 
28270 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
28280 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20    if( c<0 ){.   
28290 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
282a0 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  +1;.        }els
282b0 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20  e if( c>0 ){.   
282c0 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78         upr = idx
282d0 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
282e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
282f0 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20  ert( c==0 );.   
28300 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
28310 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
28320 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
28330 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
28340 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
28350 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
28360 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79       if( pIdxKey
28370 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d  ->errCode ) rc =
28380 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
28390 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
283a0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
283b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
283c0 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62   if( lwr>upr ) b
283d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73  reak;.        as
283e0 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30  sert( lwr+upr>=0
283f0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20   );.        idx 
28400 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20  = (lwr+upr)>>1; 
28410 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75   /* idx = (lwr+u
28420 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d  pr)/2 */.      }
28430 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
28440 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c  t( lwr==upr+1 ||
28450 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
28460 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29  && !pPage->leaf)
28470 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
28480 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
28490 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
284a0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73  leaf ){.      as
284b0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
284c0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
284d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
284e0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
284f0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
28500 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
28510 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
28520 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20      *pRes = c;. 
28530 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
28540 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  _OK;.      goto 
28550 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
28560 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74     }.moveto_next
28570 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20  _layer:.    if( 
28580 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  lwr>=pPage->nCel
28590 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  l ){.      chldP
285a0 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  g = get4byte(&pP
285b0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
285c0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
285d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
285e0 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
285f0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
28600 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d  ge, lwr));.    }
28610 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
28620 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
28630 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63  (u16)lwr;.    rc
28640 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
28650 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
28660 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
28670 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e  ;.  }.moveto_fin
28680 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ish:.  pCur->inf
28690 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
286a0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
286b0 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
286c0 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
286d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
286e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
286f0 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72   TRUE if the cur
28700 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
28710 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
28720 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
28730 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65  .** TRUE will be
28740 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20   returned after 
28750 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
28760 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76  3BtreeNext() mov
28770 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c  es.** past the l
28780 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
28790 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65   table or sqlite
287a0 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76  3BtreePrev() mov
287b0 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66  es past.** the f
287c0 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55  irst entry.  TRU
287d0 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  E is also return
287e0 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ed if the table 
287f0 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
28800 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66   sqlite3BtreeEof
28810 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
28820 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
28830 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  t if the cursor 
28840 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51  is in CURSOR_REQ
28850 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c  UIRESEEK but all
28860 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20   table entries. 
28870 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65   ** have been de
28880 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20  leted? This API 
28890 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61  will need to cha
288a0 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  nge to return an
288b0 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
288c0 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
288d0 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76  boolean result v
288e0 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  alue..  */.  ret
288f0 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49  urn (CURSOR_VALI
28900 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29  D!=pCur->eState)
28910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
28920 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
28930 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
28940 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
28950 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
28960 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
28970 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
28980 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
28990 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
289a0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
289b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
289c0 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
289d0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
289e0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
289f0 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  1..**.** The mai
28a00 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
28a10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
28a20 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69  t().  That routi
28a30 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a  ne is optimized.
28a40 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  ** for the commo
28a50 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79  n case of merely
28a60 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   incrementing th
28a70 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42  e cell counter B
28a80 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a  tCursor.aiIdx.**
28a90 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c   to the next cel
28aa0 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  l on the current
28ab0 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f   page.  The (slo
28ac0 77 65 72 29 20 62 74 72 65 65 4e 65 78 74 28 29  wer) btreeNext()
28ad0 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69   helper.** routi
28ae0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
28af0 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  n it is necessar
28b00 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64  y to move to a d
28b10 69 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72  ifferent page or
28b20 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74  .** to restore t
28b30 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  he cursor..**.**
28b40 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
28b50 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a  ction will set *
28b60 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20  pRes to 0 or 1. 
28b70 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52   The initial *pR
28b80 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c  es value.** will
28b90 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72   be 1 if the cur
28ba0 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65  sor being steppe
28bb0 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  d corresponds to
28bc0 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e   an SQL index an
28bd0 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75  d.** if this rou
28be0 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20  tine could have 
28bf0 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20  been skipped if 
28c00 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68  that SQL index h
28c10 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69  ad been.** a uni
28c20 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65  que index.  Othe
28c30 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72  rwise the caller
28c40 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a   will have set *
28c50 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  pRes to zero..**
28c60 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d   Zero is the com
28c70 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74  mon case. The bt
28c80 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
28c90 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73  on is free to us
28ca0 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c  e the.** initial
28cb0 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20   *pRes value as 
28cc0 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76  a hint to improv
28cd0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62  e performance, b
28ce0 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  ut the current.*
28cf0 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69  * SQLite btree i
28d00 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
28d10 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68  es not. (Note th
28d20 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74  at the comdb2 bt
28d30 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ree.** implement
28d40 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74  ation does use t
28d50 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65  his hint, howeve
28d60 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  r.).*/.static SQ
28d70 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
28d80 74 20 62 74 72 65 65 4e 65 78 74 28 42 74 43 75  t btreeNext(BtCu
28d90 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
28da0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
28db0 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d  ;.  int idx;.  M
28dc0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
28dd0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
28de0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
28df0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28e00 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
28e10 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
28e20 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
28e30 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
28e40 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ==0 );.  if( pCu
28e50 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
28e60 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61  R_VALID ){.    a
28e70 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
28e80 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
28e90 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20  lidOvfl)==0 );. 
28ea0 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43     rc = restoreC
28eb0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
28ec0 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ur);.    if( rc!
28ed0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28ee0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
28ef0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52     }.    if( CUR
28f00 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
28f10 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
28f20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
28f30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28f40 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
28f50 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
28f60 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  xt ){.      asse
28f70 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
28f80 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
28f90 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
28fa0 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
28fb0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  );.      pCur->e
28fc0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
28fd0 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20  ALID;.      if( 
28fe0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30  pCur->skipNext>0
28ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
29000 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
29010 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
29020 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
29030 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b  }.      pCur->sk
29040 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
29050 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d  }.  }..  pPage =
29060 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29070 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64  ur->iPage];.  id
29080 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64  x = ++pCur->aiId
29090 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
290a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
290b0 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a  >isInit );..  /*
290c0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
290d0 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
290e0 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
290f0 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f   for the value o
29100 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62  f idx .  ** to b
29110 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20  e invalid here. 
29120 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63  This can only oc
29130 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20  cur if a second 
29140 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a  cursor modifies.
29150 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68    ** the page wh
29160 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72 20  ile cursor pCur 
29170 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66  is holding a ref
29180 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68  erence to it. Wh
29190 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c  ich can.  ** onl
291a0 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
291b0 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72  database is corr
291c0 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77 61  upt in such a wa
291d0 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  y as to link the
291e0 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20  .  ** page into 
291f0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d  more than one b-
29200 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20  tree structure. 
29210 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 69  */.  testcase( i
29220 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx>pPage->nCell 
29230 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70  );..  if( idx>=p
29240 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
29250 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
29260 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
29270 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
29280 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  ur, get4byte(&pP
29290 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
292a0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
292b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
292c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
292d0 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c    return moveToL
292e0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
292f0 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
29300 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
29310 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
29320 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
29330 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
29340 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
29350 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
29360 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
29370 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
29380 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
29390 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
293a0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
293b0 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69  iPage];.    }whi
293c0 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
293d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50  pCur->iPage]>=pP
293e0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
293f0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
29400 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
29410 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65  urn sqlite3Btree
29420 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
29430 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29440 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29450 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
29460 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
29470 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
29480 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
29490 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  e{.    return mo
294a0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
294b0 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71  r);.  }.}.int sq
294c0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42  lite3BtreeNext(B
294d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
294e0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d  nt *pRes){.  Mem
294f0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  Page *pPage;.  a
29500 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
29510 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
29520 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
29530 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
29540 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65  *pRes==0 || *pRe
29550 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  s==1 );.  assert
29560 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
29570 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
29580 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
29590 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  D );.  pCur->inf
295a0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
295b0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
295c0 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
295d0 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
295e0 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  );.  *pRes = 0;.
295f0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
29600 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
29610 20 29 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e   ) return btreeN
29620 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
29630 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
29640 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29650 61 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70  age];.  if( (++p
29660 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
29670 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61 67 65 2d  >iPage])>=pPage-
29680 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43  >nCell ){.    pC
29690 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
296a0 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72 65  iPage]--;.    re
296b0 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70  turn btreeNext(p
296c0 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a  Cur, pRes);.  }.
296d0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
296e0 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
296f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
29700 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  se{.    return m
29710 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
29720 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ur);.  }.}../*.*
29730 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
29740 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
29750 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
29760 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
29770 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
29780 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
29790 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
297a0 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
297b0 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
297c0 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
297d0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
297e0 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
297f0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
29800 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
29810 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68  pRes=1..**.** Th
29820 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69  e main entry poi
29830 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72  nt is sqlite3Btr
29840 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54  eePrevious().  T
29850 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  hat routine is o
29860 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20  ptimized.** for 
29870 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
29880 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d  of merely decrem
29890 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  enting the cell 
298a0 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72  counter BtCursor
298b0 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65  .aiIdx.** to the
298c0 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f   previous cell o
298d0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
298e0 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
298f0 29 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  ) btreePrevious(
29900 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74  ).** helper rout
29910 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
29920 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  en it is necessa
29930 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20  ry to move to a 
29940 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a  different page.*
29950 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20  * or to restore 
29960 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  the cursor..**.*
29970 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
29980 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20  nction will set 
29990 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e  *pRes to 0 or 1.
299a0 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70    The initial *p
299b0 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c  Res value.** wil
299c0 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75  l be 1 if the cu
299d0 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70  rsor being stepp
299e0 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ed corresponds t
299f0 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61  o an SQL index a
29a00 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f  nd.** if this ro
29a10 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
29a20 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66   been skipped if
29a30 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20   that SQL index 
29a40 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e  had been.** a un
29a50 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68  ique index.  Oth
29a60 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65  erwise the calle
29a70 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20  r will have set 
29a80 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pRes to zero..*
29a90 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f  * Zero is the co
29aa0 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62  mmon case. The b
29ab0 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
29ac0 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75  ion is free to u
29ad0 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61  se the.** initia
29ae0 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73  l *pRes value as
29af0 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f   a hint to impro
29b00 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20  ve performance, 
29b10 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a  but the current.
29b20 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  ** SQLite btree 
29b30 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
29b40 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74  oes not. (Note t
29b50 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62  hat the comdb2 b
29b60 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tree.** implemen
29b70 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20  tation does use 
29b80 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76  this hint, howev
29b90 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53  er.).*/.static S
29ba0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
29bb0 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  nt btreePrevious
29bc0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
29bd0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
29be0 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
29bf0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
29c00 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
29c10 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
29c20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
29c30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  );.  assert( *pR
29c40 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  es==0 );.  asser
29c50 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
29c60 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
29c70 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
29c80 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
29c90 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
29ca0 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42  & (BTCF_AtLast|B
29cb0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54  TCF_ValidOvfl|BT
29cc0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d  CF_ValidNKey))==
29cd0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
29ce0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
29cf0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  =0 );.  if( pCur
29d00 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
29d10 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63  _VALID ){.    rc
29d20 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
29d30 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
29d40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29d50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
29d60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
29d70 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
29d80 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
29d90 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70  tate ){.      *p
29da0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  Res = 1;.      r
29db0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29dc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
29dd0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b  Cur->skipNext ){
29de0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29df0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
29e00 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
29e10 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
29e20 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20  R_SKIPNEXT );.  
29e30 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
29e40 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
29e50 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
29e60 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20  >skipNext<0 ){. 
29e70 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69         pCur->ski
29e80 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20  pNext = 0;.     
29e90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29ea0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
29eb0 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
29ec0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
29ed0 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
29ee0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29ef0 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
29f00 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
29f10 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
29f20 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  leaf ){.    int 
29f30 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
29f40 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
29f50 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
29f60 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
29f70 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
29f80 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20  ge, idx)));.    
29f90 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
29fa0 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  rc;.    rc = mov
29fb0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
29fc0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
29fd0 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69   while( pCur->ai
29fe0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
29ff0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
2a000 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2a010 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2a020 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2a030 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
2a040 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2a050 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2a060 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2a070 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
2a080 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
2a090 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2a0a0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
2a0b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
2a0c0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2a0d0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2a0e0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29  BTCF_ValidOvfl))
2a0f0 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72  ==0 );..    pCur
2a100 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2a110 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67  age]--;.    pPag
2a120 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2a130 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2a140 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
2a150 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
2a160 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
2a170 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
2a180 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
2a190 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
2a1a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2a1b0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
2a1c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
2a1d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
2a1e0 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
2a1f0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2a200 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  s){.  assert( cu
2a210 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2a220 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2a230 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
2a240 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
2a250 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20  || *pRes==1 );. 
2a260 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2a270 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2a280 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2a290 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70  OR_VALID );.  *p
2a2a0 52 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Res = 0;.  pCur-
2a2b0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2a2c0 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
2a2d0 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56  ValidOvfl|BTCF_V
2a2e0 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75  alidNKey);.  pCu
2a2f0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2a300 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  0;.  if( pCur->e
2a310 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2a320 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e  LID.   || pCur->
2a330 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2a340 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72  e]==0.   || pCur
2a350 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2a360 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20  Page]->leaf==0. 
2a370 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
2a380 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
2a390 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20  r, pRes);.  }.  
2a3a0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2a3b0 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65  ->iPage]--;.  re
2a3c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2a3d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
2a3e0 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f  e a new page fro
2a3f0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
2a400 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ile..**.** The n
2a410 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  ew page is marke
2a420 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e  d as dirty.  (In
2a430 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71   other words, sq
2a440 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2a450 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
2a460 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
2a470 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
2a480 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
2a490 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
2a4a0 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
2a4b0 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
2a4c0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2a4d0 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
2a4e0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2a4f0 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  () on the new pa
2a500 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
2a510 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ne..**.** SQLITE
2a520 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2a530 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79  on success.  Any
2a540 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
2a550 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  lue indicates.**
2a560 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50   an error.  *ppP
2a570 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61  age and *pPgno a
2a580 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  re undefined in 
2a590 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
2a5a0 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  error..** Do not
2a5b0 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50   invoke sqlite3P
2a5c0 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a  agerUnref() on *
2a5d0 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72  ppPage if an err
2a5e0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  or is returned..
2a5f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
2a600 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
2a610 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
2a620 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  n effort is made
2a630 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61   to .** locate a
2a640 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74   page close to t
2a650 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22  he page number "
2a660 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63  nearby".  This c
2a670 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e  an be used in an
2a680 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b  .** attempt to k
2a690 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65  eep related page
2a6a0 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20  s close to each 
2a6b0 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74  other in the dat
2a6c0 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77  abase file,.** w
2a6d0 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e  hich in turn can
2a6e0 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61   make database a
2a6f0 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a  ccess faster..**
2a700 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65  .** If the eMode
2a710 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 42 54   parameter is BT
2a720 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20  ALLOC_EXACT and 
2a730 74 68 65 20 6e 65 61 72 62 79 20 70 61 67 65 20  the nearby page 
2a740 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65  exists.** anywhe
2a750 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
2a760 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ist, then it is 
2a770 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
2a780 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a   returned.  If.*
2a790 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c  * eMode is BTALL
2a7a0 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70  OC_LT then the p
2a7b0 61 67 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c  age returned wil
2a7c0 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f  l be less than o
2a7d0 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65  r equal.** to ne
2a7e0 61 72 62 79 20 69 66 20 61 6e 79 20 73 75 63 68  arby if any such
2a7f0 20 70 61 67 65 20 65 78 69 73 74 73 2e 20 20 49   page exists.  I
2a800 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c  f eMode is BTALL
2a810 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72  OC_ANY then ther
2a820 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74  e.** are no rest
2a830 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63  rictions on whic
2a840 68 20 70 61 67 65 20 69 73 20 72 65 74 75 72 6e  h page is return
2a850 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2a860 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
2a870 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
2a880 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pBt,         /*
2a890 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
2a8a0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
2a8b0 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ,      /* Store 
2a8c0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
2a8d0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 65  llocated page he
2a8e0 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  re */.  Pgno *pP
2a8f0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
2a900 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61 67 65  * Store the page
2a910 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a   number here */.
2a920 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20    Pgno nearby,  
2a930 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72           /* Sear
2a940 63 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65  ch for a page ne
2a950 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  ar this one */. 
2a960 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20   u8 eMode       
2a970 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c          /* BTALL
2a980 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f  OC_EXACT, BTALLO
2a990 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43  C_LT, or BTALLOC
2a9a0 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  _ANY */.){.  Mem
2a9b0 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
2a9c0 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b  int rc;.  u32 n;
2a9d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2a9e0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
2a9f0 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32  reelist */.  u32
2aa00 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   k;     /* Numbe
2aa10 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74  r of leaves on t
2aa20 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20  he trunk of the 
2aa30 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65  freelist */.  Me
2aa40 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
2aa50 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
2aa60 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
2aa70 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20  Pgno mxPage;    
2aa80 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
2aa90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2aaa0 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ile */..  assert
2aab0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2aac0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
2aad0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d   );.  assert( eM
2aae0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59  ode==BTALLOC_ANY
2aaf0 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26   || (nearby>0 &&
2ab00 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74   IfNotOmitAV(pBt
2ab10 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29  ->autoVacuum)) )
2ab20 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74  ;.  pPage1 = pBt
2ab30 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61  ->pPage1;.  mxPa
2ab40 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ge = btreePageco
2ab50 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20  unt(pBt);.  n = 
2ab60 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2ab70 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
2ab80 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50  testcase( n==mxP
2ab90 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e  age-1 );.  if( n
2aba0 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  >=mxPage ){.    
2abb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2abc0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
2abd0 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
2abe0 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61   /* There are pa
2abf0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2ac00 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20  ist.  Reuse one 
2ac10 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20  of those pages. 
2ac20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75  */.    Pgno iTru
2ac30 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63  nk;.    u8 searc
2ac40 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66  hList = 0; /* If
2ac50 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d   the free-list m
2ac60 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20  ust be searched 
2ac70 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a  for 'nearby' */.
2ac80 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65      .    /* If e
2ac90 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
2aca0 41 43 54 20 61 6e 64 20 61 20 71 75 65 72 79 20  ACT and a query 
2acb0 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  of the pointer-m
2acc0 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20  ap.    ** shows 
2acd0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e  that the page 'n
2ace0 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68  earby' is somewh
2acf0 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
2ad00 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a  list, then.    *
2ad10 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73  * the entire-lis
2ad20 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  t will be search
2ad30 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ed for that page
2ad40 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
2ad50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2ad60 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
2ad70 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
2ad80 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66  XACT ){.      if
2ad90 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65  ( nearby<=mxPage
2ada0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65   ){.        u8 e
2adb0 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73  Type;.        as
2adc0 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29  sert( nearby>0 )
2add0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2ade0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2adf0 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  m );.        rc 
2ae00 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
2ae10 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c   nearby, &eType,
2ae20 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
2ae30 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2ae40 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54 79  .        if( eTy
2ae50 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
2ae60 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AGE ){.         
2ae70 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
2ae80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ae90 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
2aea0 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2aeb0 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72  LE ){.      sear
2aec0 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
2aed0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
2aee0 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Decrement the f
2aef0 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62  ree-list count b
2af00 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20  y 1. Set iTrunk 
2af10 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
2af20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
2af30 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
2af40 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e   page. iPrevTrun
2af50 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31  k is initially 1
2af60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2af70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2af80 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
2af90 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2afa0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2afb0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2afc0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
2afd0 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  -1);..    /* The
2afe0 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69   code within thi
2aff0 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e  s loop is run on
2b000 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27  ly once if the '
2b010 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69  searchList' vari
2b020 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  able.    ** is n
2b030 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69  ot true. Otherwi
2b040 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65  se, it runs once
2b050 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d   for each trunk-
2b060 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20  page on the.    
2b070 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74  ** free-list unt
2b080 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  il the page 'nea
2b090 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
2b0a0 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
2b0b0 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72  EXACT).    ** or
2b0c0 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65   until a page le
2b0d0 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27  ss than 'nearby'
2b0e0 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f   is located (eMo
2b0f0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a  de==BTALLOC_LT).
2b100 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a      */.    do {.
2b110 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
2b120 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
2b130 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20   if( pPrevTrunk 
2b140 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  ){.        iTrun
2b150 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
2b160 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
2b170 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
2b180 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  {.        iTrunk
2b190 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2b1a0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
2b1b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
2b1c0 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d  estcase( iTrunk=
2b1d0 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
2b1e0 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61   if( iTrunk>mxPa
2b1f0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ge ){.        rc
2b200 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2b210 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65  T_BKPT;.      }e
2b220 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
2b230 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
2b240 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
2b250 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  unk, 0);.      }
2b260 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
2b270 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
2b280 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
2b290 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2b2a0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
2b2b0 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
2b2c0 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  k!=0 );.      as
2b2d0 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44  sert( pTrunk->aD
2b2e0 61 74 61 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20  ata!=0 );..     
2b2f0 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   k = get4byte(&p
2b300 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
2b310 3b 20 2f 2a 20 23 20 6f 66 20 6c 65 61 76 65 73  ; /* # of leaves
2b320 20 6f 6e 20 74 68 69 73 20 74 72 75 6e 6b 20 70   on this trunk p
2b330 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
2b340 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
2b350 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
2b360 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
2b370 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
2b380 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
2b390 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
2b3a0 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
2b3b0 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
2b3c0 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
2b3d0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
2b3e0 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
2b3f0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
2b400 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
2b410 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
2b420 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2b430 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2b440 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
2b450 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2b460 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2b470 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2b480 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2b490 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
2b4a0 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
2b4b0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2b4c0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
2b4d0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2b4e0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
2b4f0 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
2b500 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
2b510 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
2b520 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
2b530 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
2b540 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
2b550 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
2b560 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
2b570 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
2b580 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
2b590 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
2b5a0 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
2b5b0 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
2b5c0 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
2b5d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2b5e0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2b5f0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
2b600 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2b610 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b620 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2b630 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2b640 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20  searchList .    
2b650 20 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72          && (near
2b660 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69  by==iTrunk || (i
2b670 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20  Trunk<nearby && 
2b680 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2b690 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  E)) .      ){.  
2b6a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73        /* The lis
2b6b0 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  t is being searc
2b6c0 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75  hed and this tru
2b6d0 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nk page is the p
2b6e0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  age.        ** t
2b6f0 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61  o allocate, rega
2b700 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
2b710 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e  r it has leaves.
2b720 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2b730 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
2b740 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  unk;.        *pp
2b750 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
2b760 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
2b770 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
2b780 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2b790 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2b7a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2b7b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2b7c0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2b7d0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2b7e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2b7f0 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( k==0 ){.      
2b800 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
2b810 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
2b820 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2b830 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
2b840 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2b850 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
2b860 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2b870 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2b880 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
2b890 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2b8a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2b8b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
2b8d0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2b8e0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2b8f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2b900 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75  memcpy(&pPrevTru
2b910 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
2b920 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2b930 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
2b940 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2b950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b960 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72   trunk page is r
2b970 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63  equired by the c
2b980 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e  aller but it con
2b990 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20  tains .         
2b9a0 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   ** pointers to 
2b9b0 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73  free-list leaves
2b9c0 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66  . The first leaf
2b9d0 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b   becomes a trunk
2b9e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
2b9f0 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
2ba00 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
2ba10 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
2ba20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20  *pNewTrunk;.    
2ba30 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54        Pgno iNewT
2ba40 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2ba50 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
2ba60 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
2ba70 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61  ( iNewTrunk>mxPa
2ba80 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  ge ){ .         
2ba90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2baa0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2bab0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2bac0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2bad0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2bae0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2baf0 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61   iNewTrunk==mxPa
2bb00 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge );.          
2bb10 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2bb20 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
2bb30 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
2bb40 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2bb50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2bb60 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2bb70 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2bb80 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
2bb90 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2bba0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2bbb0 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
2bbc0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2bbd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2bbe0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2bbf0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
2bc00 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
2bc10 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2bc20 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2bc30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bc40 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
2bc50 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2bc60 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2bc70 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
2bc80 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
2bc90 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
2bca0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
2bcb0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
2bcc0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
2bcd0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
2bce0 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
2bcf0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2bd00 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
2bd10 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
2bd20 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
2bd30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
2bd40 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2bd50 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
2bd60 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
2bd70 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2bd80 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2bd90 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
2bda0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2bdb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2bdc0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2bdd0 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
2bde0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2bdf0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2be00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
2be10 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2be20 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2be30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2be40 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
2be50 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2be60 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
2be70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2be80 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
2be90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
2bea0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
2beb0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
2bec0 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
2bed0 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
2bee0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
2bef0 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20  lse if( k>0 ){. 
2bf00 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
2bf10 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
2bf20 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
2bf30 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a     u32 closest;.
2bf40 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
2bf50 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
2bf60 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
2bf70 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
2bf80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
2bf90 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
2bfa0 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
2bfb0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
2bfc0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2bfd0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2bfe0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
2bff0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
2c000 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2c010 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
2c020 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
2c030 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
2c040 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61    if( iPage<=nea
2c050 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
2c060 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
2c070 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
2c080 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2c090 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c0a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c0b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c0c0 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a        int dist;.
2c0d0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
2c0e0 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
2c0f0 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
2c100 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29  ta[8]) - nearby)
2c110 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
2c120 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
2c130 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c140 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
2c150 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
2c160 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
2c170 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
2c180 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
2c190 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
2c1a0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
2c1b0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
2c1c0 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
2c1d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2c1e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2c1f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c210 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
2c220 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2c230 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
2c240 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
2c250 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
2c260 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
2c270 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
2c280 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
2c290 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
2c2a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c2b0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2c2c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2c2d0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2c2e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c2f0 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
2c300 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
2c310 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
2c320 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c  List .         |
2c330 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  | (iPage==nearby
2c340 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62   || (iPage<nearb
2c350 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
2c360 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
2c370 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
2c380 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
2c390 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
2c3a0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
2c3b0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2c3c0 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
2c3d0 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
2c3e0 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
2c3f0 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
2c400 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
2c410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c420 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
2c430 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
2c440 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
2c450 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2c460 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2c470 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2c480 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2c490 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f   ) goto end_allo
2c4a0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2c4b0 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
2c4c0 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
2c4d0 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
2c4e0 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
2c4f0 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
2c500 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2c510 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
2c520 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
2c530 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
2c540 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
2c550 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
2c560 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52  , *pPgno)? PAGER
2c570 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a  _GET_NOCONTENT :
2c580 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
2c590 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2c5a0 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
2c5b0 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
2c5c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2c5d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c5e0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2c5f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2c600 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
2c610 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2c620 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2c630 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c640 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2c650 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
2c660 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c680 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
2c690 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c6a0 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
2c6b0 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
2c6c0 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  ;.      pPrevTru
2c6d0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  nk = 0;.    }whi
2c6e0 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29  le( searchList )
2c6f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
2c700 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70  * There are no p
2c710 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
2c720 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20  list, so append 
2c730 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
2c740 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
2c750 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a  e image..    **.
2c760 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c      ** Normally,
2c770 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63   new pages alloc
2c780 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f  ated by this blo
2c790 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73  ck can be reques
2c7a0 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  ted from the.   
2c7b0 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20   ** pager layer 
2c7c0 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
2c7d0 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
2c7e0 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68  This prevents th
2c7f0 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66  e pager.    ** f
2c800 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65  rom trying to re
2c810 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e  ad the pages con
2c820 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20  tent from disk. 
2c830 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a  However, if the.
2c840 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74      ** current t
2c850 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
2c860 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f  lready run one o
2c870 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74  r more increment
2c880 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a  al-vacuum.    **
2c890 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65   steps, then the
2c8a0 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f   page we are abo
2c8b0 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ut to allocate m
2c8c0 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65  ay contain conte
2c8d0 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69  nt.    ** that i
2c8e0 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68  s required in th
2c8f0 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c  e event of a rol
2c900 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63  lback. In this c
2c910 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e  ase, do.    ** n
2c920 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f  ot set the no-co
2c930 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73  ntent flag. This
2c940 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65   causes the page
2c950 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f  r to load and jo
2c960 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65  urnal.    ** the
2c970 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
2c980 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65  ntent before ove
2c990 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20  rwriting it..   
2c9a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20   **.    ** Note 
2c9b0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
2c9c0 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ill not actually
2c9d0 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64   attempt to load
2c9e0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20   or journal .   
2c9f0 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20   ** content for 
2ca00 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65  any page that re
2ca10 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61  ally does lie pa
2ca20 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
2ca30 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
2ca40 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  * file on disk. 
2ca50 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f  So the effects o
2ca60 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20  f disabling the 
2ca70 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d  no-content optim
2ca80 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  ization.    ** h
2ca90 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64  ere are confined
2caa0 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20   to those pages 
2cab0 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e  that lie between
2cac0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
2cad0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2cae0 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e  image and the en
2caf0 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
2cb00 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
2cb10 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e     int bNoConten
2cb20 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69  t = (0==IfNotOmi
2cb30 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e  tAV(pBt->bDoTrun
2cb40 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45  cate))? PAGER_GE
2cb50 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a  T_NOCONTENT:0;..
2cb60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2cb70 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
2cb80 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
2cb90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2cba0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42  eturn rc;.    pB
2cbb0 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  t->nPage++;.    
2cbc0 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
2cbd0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2cbe0 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50  E(pBt) ) pBt->nP
2cbf0 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20  age++;..#ifndef 
2cc00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2cc10 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
2cc20 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
2cc30 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  & PTRMAP_ISPAGE(
2cc40 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  pBt, pBt->nPage)
2cc50 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
2cc60 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f  *pPgno refers to
2cc70 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
2cc80 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77  age, allocate tw
2cc90 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20  o new pages.    
2cca0 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20    ** at the end 
2ccb0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74  of the file inst
2ccc0 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20  ead of one. The 
2ccd0 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
2cce0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
2ccf0 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e  comes a new poin
2cd00 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68  ter-map page, th
2cd10 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64  e second is used
2cd20 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
2cd30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d        */.      M
2cd40 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b  emPage *pPg = 0;
2cd50 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41  .      TRACE(("A
2cd60 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
2cd70 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f   end of file (po
2cd80 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c  inter-map page)\
2cd90 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29  n", pBt->nPage))
2cda0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2cdb0 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44  pBt->nPage!=PEND
2cdc0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2cdd0 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  t) );.      rc =
2cde0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2cdf0 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26  t, pBt->nPage, &
2ce00 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29  pPg, bNoContent)
2ce10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2ce20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ce30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ce40 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d  3PagerWrite(pPg-
2ce50 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2ce60 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2ce70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
2ce80 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2ce90 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74  rn rc;.      pBt
2cea0 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20  ->nPage++;.     
2ceb0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
2cec0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2ced0 47 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e  GE(pBt) ){ pBt->
2cee0 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d  nPage++; }.    }
2cef0 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34  .#endif.    put4
2cf00 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70  byte(28 + (u8*)p
2cf10 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
2cf20 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  a, pBt->nPage);.
2cf30 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74      *pPgno = pBt
2cf40 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73  ->nPage;..    as
2cf50 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
2cf60 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2cf70 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  pBt) );.    rc =
2cf80 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2cf90 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
2cfa0 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  e, bNoContent);.
2cfb0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2cfc0 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
2cfd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2cfe0 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
2cff0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2d000 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d010 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2d020 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
2d030 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
2d040 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
2d050 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
2d060 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
2d070 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
2d080 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
2d090 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
2d0a0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
2d0b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2d0c0 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
2d0d0 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
2d0e0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2d0f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
2d100 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
2d110 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
2d120 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20  ge)->pDbPage)>1 
2d130 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
2d140 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
2d150 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
2d160 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2d170 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2d180 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a  PT;.    }.    (*
2d190 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20  ppPage)->isInit 
2d1a0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
2d1b0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
2d1c0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
2d1d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71  =SQLITE_OK || sq
2d1e0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2d1f0 65 61 62 6c 65 28 28 2a 70 70 50 61 67 65 29 2d  eable((*ppPage)-
2d200 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  >pDbPage) );.  r
2d210 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2d220 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2d230 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20   is used to add 
2d240 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68  page iPage to th
2d250 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2d260 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49  free-list. .** I
2d270 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
2d280 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
2d290 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74  t already a part
2d2a0 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   of the free-lis
2d2b0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  t..**.** The val
2d2c0 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
2d2d0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2d2e0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2d2f0 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a  n is optional..*
2d300 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
2d310 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20  happens to have 
2d320 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2d330 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
2d340 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
2d350 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20  g to page iPage 
2d360 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61  handy, it may pa
2d370 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63  ss it as the sec
2d380 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f  ond value. .** O
2d390 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79  therwise, it may
2d3a0 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a   pass NULL..**.*
2d3b0 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74  * If a pointer t
2d3c0 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  o a MemPage obje
2d3d0 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ct is passed as 
2d3e0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2d3f0 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65  ent,.** its refe
2d400 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e  rence count is n
2d410 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68  ot altered by th
2d420 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
2d430 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
2d440 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70  age2(BtShared *p
2d450 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65  Bt, MemPage *pMe
2d460 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67  mPage, Pgno iPag
2d470 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
2d480 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
2d490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65            /* Fre
2d4a0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
2d4b0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75  e */.  Pgno iTru
2d4c0 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
2d4d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2d4e0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  ge number of fre
2d4f0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
2d500 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20  e */ .  MemPage 
2d510 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
2d520 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c  Page1;      /* L
2d530 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74  ocal reference t
2d540 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65  o page 1 */.  Me
2d550 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
2d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d570 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20    /* Page being 
2d580 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55  freed. May be NU
2d590 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  LL. */.  int rc;
2d5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d5c0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
2d5d0 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
2d5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5f0 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
2d600 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2d610 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  on free-list */.
2d620 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2d630 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
2d640 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2d650 73 73 65 72 74 28 20 69 50 61 67 65 3e 31 20 29  ssert( iPage>1 )
2d660 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65  ;.  assert( !pMe
2d670 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67  mPage || pMemPag
2d680 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29  e->pgno==iPage )
2d690 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67  ;..  if( pMemPag
2d6a0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
2d6b0 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
2d6c0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
2d6d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2d6e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
2d6f0 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
2d700 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
2d710 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
2d720 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
2d730 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
2d740 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
2d750 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2d760 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
2d770 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
2d780 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2d790 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
2d7a0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2d7b0 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
2d7c0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2d7d0 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
2d7e0 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ..  if( pBt->bts
2d7f0 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
2d800 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
2d810 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72   /* If the secur
2d820 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20  e_delete option 
2d830 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
2d840 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  .    ** always f
2d850 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
2d860 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
2d870 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
2d880 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
2d890 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20  pPage && ((rc = 
2d8a0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2d8b0 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
2d8c0 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20   0))!=0) ).     
2d8d0 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28  ||            ((
2d8e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2d8f0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2d900 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20  bPage))!=0).    
2d910 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
2d920 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
2d930 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  }.    memset(pPa
2d940 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
2d950 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
2d960 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
2d970 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
2d980 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
2d990 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
2d9a0 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
2d9b0 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
2d9c0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
2d9d0 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
2d9e0 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
2d9f0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74  VACUUM ){.    pt
2da00 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
2da10 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
2da20 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
2da30 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2da40 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2da50 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
2da60 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
2da70 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
2da80 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
2da90 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
2daa0 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
2dab0 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
2dac0 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
2dad0 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
2dae0 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
2daf0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
2db00 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
2db10 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
2db20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
2db30 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
2db40 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
2db50 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
2db60 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
2db70 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
2db80 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
2db90 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
2dba0 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
2dbb0 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
2dbc0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
2dbd0 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
2dbe0 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
2dbf0 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
2dc00 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
2dc10 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
2dc20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2dc30 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
2dc40 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
2dc50 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
2dc60 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
2dc70 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2dc80 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
2dc90 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2dca0 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
2dcb0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
2dcc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2dcd0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
2dce0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
2dcf0 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
2dd00 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
2dd10 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
2dd20 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
2dd30 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
2dd40 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
2dd50 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
2dd60 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
2dd70 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2dd80 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2dd90 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2dda0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
2ddb0 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
2ddc0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
2ddd0 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
2dde0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2ddf0 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
2de00 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
2de10 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
2de20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
2de30 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
2de40 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
2de50 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
2de60 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
2de70 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
2de80 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
2de90 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
2dea0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
2deb0 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
2dec0 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
2ded0 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
2dee0 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
2def0 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
2df00 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
2df10 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
2df20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
2df30 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
2df40 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
2df50 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
2df60 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
2df70 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
2df80 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
2df90 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
2dfa0 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
2dfb0 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
2dfc0 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
2dfd0 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
2dfe0 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
2dff0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
2e000 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
2e010 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
2e020 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
2e030 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
2e040 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
2e050 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
2e060 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
2e070 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
2e080 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
2e090 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
2e0a0 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
2e0b0 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
2e0c0 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
2e0d0 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
2e0e0 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
2e0f0 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
2e100 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
2e110 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
2e120 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
2e130 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
2e140 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2e150 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2e160 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2e170 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e180 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2e190 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
2e1a0 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20   nLeaf+1);.     
2e1b0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
2e1c0 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65  unk->aData[8+nLe
2e1d0 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20  af*4], iPage);. 
2e1e0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
2e1f0 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
2e200 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
2e210 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20  DELETE)==0 ){.  
2e220 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
2e230 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50  agerDontWrite(pP
2e240 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2e250 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e260 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61   rc = btreeSetHa
2e270 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50  sContent(pBt, iP
2e280 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
2e290 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
2e2a0 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
2e2b0 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
2e2c0 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
2e2d0 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
2e2e0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
2e2f0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
2e300 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  }..  /* If contr
2e310 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73  ol flows to this
2e320 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20   point, then it 
2e330 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  was not possible
2e340 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a   to add the.  **
2e350 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
2e360 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20  freed as a leaf 
2e370 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73  page of the firs
2e380 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
2e390 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50  ree-list..  ** P
2e3a0 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
2e3b0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
2e3c0 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69   empty, or possi
2e3d0 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
2e3e0 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
2e3f0 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
2e400 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68  st is full. Eith
2e410 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65  er way, the page
2e420 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a   being freed.  *
2e430 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * will become th
2e440 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e  e new first trun
2e450 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
2e460 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  ee-list..  */.  
2e470 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20  if( pPage==0 && 
2e480 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2e490 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2e4a0 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
2e4b0 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  , 0)) ){.    got
2e4c0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2e4d0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
2e4e0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2e4f0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2e500 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2e510 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  K ){.    goto fr
2e520 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
2e530 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
2e540 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29  ->aData, iTrunk)
2e550 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
2e560 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30  age->aData[4], 0
2e570 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
2e580 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2e590 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43  , iPage);.  TRAC
2e5a0 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
2e5b0 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
2e5c0 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
2e5d0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69  , pPage->pgno, i
2e5e0 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61  Trunk));..freepa
2e5f0 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50  ge_out:.  if( pP
2e600 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
2e610 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
2e620 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
2e630 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73  pPage);.  releas
2e640 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
2e650 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
2e660 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61  atic void freePa
2e670 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
2e680 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  e, int *pRC){.  
2e690 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49  if( (*pRC)==SQLI
2e6a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
2e6b0 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50  C = freePage2(pP
2e6c0 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c  age->pBt, pPage,
2e6d0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
2e6e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
2e6f0 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
2e700 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
2e710 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
2e720 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  ll.  Write the.*
2e730 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a  * local Cell siz
2e740 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  e (the number of
2e750 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6f 72   bytes on the or
2e760 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69  iginal page, omi
2e770 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f  tting.** overflo
2e780 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e  w) into *pnSize.
2e790 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2e7a0 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  learCell(.  MemP
2e7b0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
2e7c0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
2e7d0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
2e7e0 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he Cell */.  uns
2e7f0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
2e800 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  l,    /* First b
2e810 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20  yte of the Cell 
2e820 2a 2f 0a 20 20 75 31 36 20 2a 70 6e 53 69 7a 65  */.  u16 *pnSize
2e830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e840 20 57 72 69 74 65 20 74 68 65 20 73 69 7a 65 20   Write the size 
2e850 6f 66 20 74 68 65 20 43 65 6c 6c 20 68 65 72 65  of the Cell here
2e860 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
2e870 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
2e880 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  pBt;.  CellInfo 
2e890 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66  info;.  Pgno ovf
2e8a0 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b  lPgno;.  int rc;
2e8b0 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20  .  int nOvfl;.  
2e8c0 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  u32 ovflPageSize
2e8d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
2e8e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2e8f0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2e900 78 29 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72  x) );.  btreePar
2e910 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
2e920 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
2e930 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f    *pnSize = info
2e940 2e 6e 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 6e  .nSize;.  if( in
2e950 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  fo.iOverflow==0 
2e960 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2e970 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
2e980 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
2e990 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
2e9a0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
2e9b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c  .  }.  if( pCell
2e9c0 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b  +info.iOverflow+
2e9d0 33 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  3 > pPage->aData
2e9e0 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65  +pPage->maskPage
2e9f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2ea00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2ea10 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74  PT;  /* Cell ext
2ea20 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66  ends past end of
2ea30 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f   page */.  }.  o
2ea40 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
2ea50 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
2ea60 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73  Overflow]);.  as
2ea70 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
2ea80 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f  eSize > 4 );.  o
2ea90 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42  vflPageSize = pB
2eaa0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
2eab0 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e  4;.  nOvfl = (in
2eac0 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e  fo.nPayload - in
2ead0 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c  fo.nLocal + ovfl
2eae0 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76  PageSize - 1)/ov
2eaf0 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  flPageSize;.  as
2eb00 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d  sert( ovflPgno==
2eb10 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a  0 || nOvfl>0 );.
2eb20 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d    while( nOvfl--
2eb30 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65   ){.    Pgno iNe
2eb40 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50  xt = 0;.    MemP
2eb50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
2eb60 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f      if( ovflPgno
2eb70 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62  <2 || ovflPgno>b
2eb80 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
2eb90 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30  t) ){.      /* 0
2eba0 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20   is not a legal 
2ebb0 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
2ebc0 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65  page 1 cannot be
2ebd0 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76   an .      ** ov
2ebe0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65  erflow page. The
2ebf0 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67  refore if ovflPg
2ec00 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65  no<2 or past the
2ec10 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20   end of the .   
2ec20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64     ** file the d
2ec30 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
2ec40 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20  corrupt. */.    
2ec50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ec60 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2ec70 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66    }.    if( nOvf
2ec80 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
2ec90 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
2eca0 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26  pBt, ovflPgno, &
2ecb0 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a  pOvfl, &iNext);.
2ecc0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2ecd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2ece0 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c  .    if( ( pOvfl
2ecf0 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74   || ((pOvfl = bt
2ed00 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
2ed10 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30  t, ovflPgno))!=0
2ed20 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ) ).     && sqli
2ed30 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
2ed40 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50  ount(pOvfl->pDbP
2ed50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20  age)!=1.    ){. 
2ed60 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73       /* There is
2ed70 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63   no reason any c
2ed80 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76  ursor should hav
2ed90 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  e an outstanding
2eda0 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20   reference .    
2edb0 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66    ** to an overf
2edc0 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69  low page belongi
2edd0 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61  ng to a cell tha
2ede0 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74  t is being delet
2edf0 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20  ed/updated..    
2ee00 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65    ** So if there
2ee10 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61   exists more tha
2ee20 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  n one reference 
2ee30 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  to this page, th
2ee40 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20  en it .      ** 
2ee50 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20  must not really 
2ee60 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
2ee70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  age and the data
2ee80 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
2ee90 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20  rupt. .      ** 
2eea0 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f  It is helpful to
2eeb0 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65 66   detect this bef
2eec0 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65  ore calling free
2eed0 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20  Page2(), as .   
2eee0 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28     ** freePage2(
2eef0 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70  ) may zero the p
2ef00 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20  age contents if 
2ef10 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
2ef20 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65  de is.      ** e
2ef30 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20  nabled. If this 
2ef40 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20  'overflow' page 
2ef50 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
2ef60 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20 20  page that the.  
2ef70 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73      ** caller is
2ef80 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
2ef90 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73  gh or using in s
2efa0 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74  ome other way, t
2efb0 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e  his.      ** can
2efc0 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e   be problematic.
2efd0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2efe0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2eff0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  UPT_BKPT;.    }e
2f000 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2f010 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70  freePage2(pBt, p
2f020 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b  Ovfl, ovflPgno);
2f030 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2f040 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73  pOvfl ){.      s
2f050 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2f060 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
2f070 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2f080 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2f090 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69      ovflPgno = i
2f0a0 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
2f0b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2f0c0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
2f0d0 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  e byte sequence 
2f0e0 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
2f0f0 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65  t a cell on page
2f100 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72   pPage.** and wr
2f110 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65  ite that byte se
2f120 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c  quence into pCel
2f130 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70  l[].  Overflow p
2f140 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ages are.** allo
2f150 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64  cated and filled
2f160 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79   in as necessary
2f170 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70  .  The calling p
2f180 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72  rocedure.** is r
2f190 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
2f1a0 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69  aking sure suffi
2f1b0 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20  cient space has 
2f1c0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  been allocated.*
2f1d0 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a  * for pCell[]..*
2f1e0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
2f1f0 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65  Cell does not ne
2f200 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20  cessary need to 
2f210 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61  point to the pPa
2f220 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65  ge->aData.** are
2f230 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  a.  pCell might 
2f240 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65  point to some te
2f250 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e  mporary storage.
2f260 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a    The cell will.
2f270 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65  ** be constructe
2f280 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72  d in this tempor
2f290 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f  ary area then co
2f2a0 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d  pied into pPage-
2f2b0 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e  >aData.** later.
2f2c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2f2d0 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d  illInCell(.  Mem
2f2e0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
2f2f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f300 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
2f310 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a  tains the cell *
2f320 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
2f330 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  r *pCell,       
2f340 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74     /* Complete t
2f350 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ext of the cell 
2f360 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
2f370 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
2f380 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
2f390 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
2f3a0 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c  pData,int nData,
2f3b0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
2f3c0 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
2f3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3e0 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f     /* Extra zero
2f3f0 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
2f400 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69   to pData */.  i
2f410 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  nt *pnSize      
2f420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f430 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65   Write cell size
2f440 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2f450 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f  t nPayload;.  co
2f460 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20  nst u8 *pSrc;.  
2f470 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b  int nSrc, n, rc;
2f480 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74  .  int spaceLeft
2f490 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76  ;.  MemPage *pOv
2f4a0 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  fl = 0;.  MemPag
2f4b0 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20  e *pToRelease = 
2f4c0 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  0;.  unsigned ch
2f4d0 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e  ar *pPrior;.  un
2f4e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61  signed char *pPa
2f4f0 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65  yload;.  BtShare
2f500 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
2f510 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
2f520 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Ovfl = 0;.  int 
2f530 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73 65  nHeader;..  asse
2f540 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2f550 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2f560 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
2f570 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  /* pPage is not 
2f580 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74  necessarily writ
2f590 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c  eable since pCel
2f5a0 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c  l might be auxil
2f5b0 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72  iary.  ** buffer
2f5c0 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73   space that is s
2f5d0 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65  eparate from the
2f5e0 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72   pPage buffer ar
2f5f0 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ea */.  assert( 
2f600 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61  pCell<pPage->aDa
2f610 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50  ta || pCell>=&pP
2f620 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
2f630 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
2f640 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2f650 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2f660 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2f670 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
2f680 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
2f690 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61  .  nHeader = pPa
2f6a0 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
2f6b0 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  ;.  nPayload = n
2f6c0 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20  Data + nZero;.  
2f6d0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2f6e0 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65  yLeaf ){.    nHe
2f6f0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
2f700 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  t32(&pCell[nHead
2f710 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  er], nPayload);.
2f720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
2f730 65 72 74 28 20 6e 44 61 74 61 3d 3d 30 20 29 3b  ert( nData==0 );
2f740 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 5a 65  .    assert( nZe
2f750 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 6e  ro==0 );.  }.  n
2f760 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
2f770 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
2f780 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65  er], *(u64*)&nKe
2f790 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c  y);.  .  /* Fill
2f7a0 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20   in the payload 
2f7b0 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28 20 70 50  size */.  if( pP
2f7c0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
2f7d0 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
2f7e0 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74  .    nSrc = nDat
2f7f0 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  a;.    nData = 0
2f800 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20  ;.  }else{ .    
2f810 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30  if( NEVER(nKey>0
2f820 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65  x7fffffff || pKe
2f830 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72  y==0) ){.      r
2f840 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2f850 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
2f860 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  .    nPayload = 
2f870 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70  (int)nKey;.    p
2f880 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Src = pKey;.    
2f890 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79  nSrc = (int)nKey
2f8a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 79  ;.  }.  if( nPay
2f8b0 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
2f8c0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 20 3d  Local ){.    n =
2f8d0 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79 6c   nHeader + nPayl
2f8e0 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61 73  oad;.    testcas
2f8f0 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74  e( n==3 );.    t
2f900 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b  estcase( n==4 );
2f910 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20 6e  .    if( n<4 ) n
2f920 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a   = 4;.    *pnSiz
2f930 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65  e = n;.    space
2f940 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  Left = nPayload;
2f950 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 43  .    pPrior = pC
2f960 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ell;.  }else{.  
2f970 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61 67 65    int mn = pPage
2f980 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
2f990 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f  n = mn + (nPaylo
2f9a0 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61 67  ad - mn) % (pPag
2f9b0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2f9c0 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
2f9d0 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d  tcase( n==pPage-
2f9e0 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20  >maxLocal );.   
2f9f0 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50   testcase( n==pP
2fa00 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
2fa10 29 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e 20 70  );.    if( n > p
2fa20 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
2fa30 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73 70 61   n = mn;.    spa
2fa40 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 20 20  ceLeft = n;.    
2fa50 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48  *pnSize = n + nH
2fa60 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 20 20 70  eader + 4;.    p
2fa70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e  Prior = &pCell[n
2fa80 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20  Header+n];.  }. 
2fa90 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65   pPayload = &pCe
2faa0 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a 20 20  ll[nHeader];..  
2fab0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
2fac0 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75 6c   variables shoul
2fad0 64 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c 6c  d be set as foll
2fae0 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
2faf0 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20   nPayload       
2fb00 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61      Total payloa
2fb10 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a  d size in bytes.
2fb20 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64 20    **   pPayload 
2fb30 20 20 20 20 20 20 20 20 20 20 42 65 67 69 6e 20            Begin 
2fb40 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64 20  writing payload 
2fb50 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61 63  here.  **   spac
2fb60 65 4c 65 66 74 20 20 20 20 20 20 20 20 20 20 53  eLeft          S
2fb70 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61  pace available a
2fb80 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66 20  t pPayload.  If 
2fb90 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65  nPayload>spaceLe
2fba0 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ft,.  **        
2fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
2fbc0 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74  at means content
2fbd0 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f   must spill into
2fbe0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
2fbf0 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20  .  **   *pnSize 
2fc00 20 20 20 20 20 20 20 20 20 20 20 53 69 7a 65 20             Size 
2fc10 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c  of the local cel
2fc20 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20  l (not counting 
2fc30 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 0a  overflow pages).
2fc40 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20 20    **   pPrior   
2fc50 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20            Where 
2fc60 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 67 6e  to write the pgn
2fc70 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  o of the first o
2fc80 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a  verflow page.  *
2fc90 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61 6c  *.  ** Use a cal
2fca0 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  l to btreeParseC
2fcb0 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72 69  ellPtr() to veri
2fcc0 66 79 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  fy that the valu
2fcd0 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65  es above.  ** we
2fce0 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72 72  re computed corr
2fcf0 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 20  ectly..  */.#if 
2fd00 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
2fd10 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
2fd20 66 6f 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72  fo;.    btreePar
2fd30 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
2fd40 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
2fd50 20 20 20 20 61 73 73 65 72 74 28 20 6e 48 65 61      assert( nHea
2fd60 64 65 72 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70  der=(int)(info.p
2fd70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29  Payload - pCell)
2fd80 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2fd90 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20  info.nKey==nKey 
2fda0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  );.    assert( *
2fdb0 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e  pnSize == info.n
2fdc0 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
2fdd0 72 74 28 20 73 70 61 63 65 4c 65 66 74 20 3d 3d  rt( spaceLeft ==
2fde0 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a   info.nLocal );.
2fdf0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
2fe00 6f 72 20 3d 3d 20 26 70 43 65 6c 6c 5b 69 6e 66  or == &pCell[inf
2fe10 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 20 29 3b 0a  o.iOverflow] );.
2fe20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2fe30 20 57 72 69 74 65 20 74 68 65 20 70 61 79 6c 6f   Write the paylo
2fe40 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ad into the loca
2fe50 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65  l Cell and any e
2fe60 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c  xtra into overfl
2fe70 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 77 68  ow pages */.  wh
2fe80 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
2fe90 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
2fea0 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Left==0 ){.#ifnd
2feb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2fec0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2fed0 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20  Pgno pgnoPtrmap 
2fee0 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f  = pgnoOvfl; /* O
2fef0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
2ff00 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70  nter-map entry p
2ff10 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
2ff20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2ff30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
2ff40 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76            pgnoOv
2ff50 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20  fl++;.        } 
2ff60 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20  while( .        
2ff70 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28    PTRMAP_ISPAGE(
2ff80 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c  pBt, pgnoOvfl) |
2ff90 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44  | pgnoOvfl==PEND
2ffa0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2ffb0 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  t) .        );. 
2ffc0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2ffd0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
2ffe0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2fff0 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66  &pOvfl, &pgnoOvf
30000 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b  l, pgnoOvfl, 0);
30010 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30020 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
30030 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
30040 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
30050 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61  s auto-vacuum, a
30060 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  nd the second or
30070 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20   subsequent.    
30080 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
30090 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f  ge is being allo
300a0 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e  cated, add an en
300b0 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  try to the point
300c0 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20  er-map.      ** 
300d0 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f  for that page no
300e0 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  w. .      **.   
300f0 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
30100 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
30110 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77  low page, then w
30120 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65  rite a partial e
30130 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74  ntry .      ** t
30140 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
30150 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e  p. If we write n
30160 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70  othing to this p
30170 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c  ointer-map slot,
30180 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
30190 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76  he optimistic ov
301a0 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f  erflow chain pro
301b0 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72  cessing in clear
301c0 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20  Cell().      ** 
301d0 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74  may misinterpret
301e0 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a   the uninitializ
301f0 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65  ed values and de
30200 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
30210 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72  * wrong pages fr
30220 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
30230 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
30240 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
30250 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  uum && rc==SQLIT
30260 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30270 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f  u8 eType = (pgno
30280 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56  Ptrmap?PTRMAP_OV
30290 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f  ERFLOW2:PTRMAP_O
302a0 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20  VERFLOW1);.     
302b0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
302c0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
302d0 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26  e, pgnoPtrmap, &
302e0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
302f0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
30300 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76   releasePage(pOv
30310 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fl);.        }. 
30320 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
30330 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
30340 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
30350 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
30360 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
30370 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
30380 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
30390 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
303a0 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73  an pPrior points
303b0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
303c0 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  rea.      ** of 
303d0 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
303e0 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
303f0 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
30400 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  able. */.      a
30410 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
30420 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
30430 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
30440 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
30450 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  age) );..      /
30460 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70  * If pPrior is p
30470 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
30480 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
30490 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
304a0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
304b0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
304c0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
304d0 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61   pPrior<pPage->a
304e0 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d  Data || pPrior>=
304f0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
30500 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
30510 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
30520 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
30530 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
30540 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75  ge) );..      pu
30550 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
30560 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
30570 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
30580 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
30590 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
305a0 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
305b0 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
305c0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
305d0 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
305e0 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
305f0 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
30600 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
30610 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
30620 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
30630 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
30640 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
30650 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
30660 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  ;..    /* If pTo
30670 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
30680 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61  ero than pPayloa
30690 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  d points into th
306a0 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
306b0 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
306c0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
306d0 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
306e0 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
306f0 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
30700 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
30710 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
30720 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
30730 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
30740 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20   /* If pPayload 
30750 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
30760 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
30770 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
30780 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69  e pPage.    ** i
30790 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
307a0 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
307b0 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d   pPayload<pPage-
307c0 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f  >aData || pPaylo
307d0 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ad>=&pPage->aDat
307e0 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
307f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
30800 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
30810 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
30820 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
30830 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20  if( nSrc>0 ){.  
30840 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29      if( n>nSrc )
30850 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20   n = nSrc;.     
30860 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
30870 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
30880 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
30890 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
308a0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f     memset(pPaylo
308b0 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d  ad, 0, n);.    }
308c0 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d  .    nPayload -=
308d0 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64   n;.    pPayload
308e0 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
308f0 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
30900 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
30910 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ft -= n;.    if(
30920 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nSrc==0 ){.    
30930 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
30940 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61        pSrc = pDa
30950 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
30960 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
30970 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72  elease);.  retur
30980 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
30990 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
309a0 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20   i-th cell from 
309b0 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75  pPage.  This rou
309c0 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61  tine effects pPa
309d0 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20  ge only..** The 
309e0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20  cell content is 
309f0 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61  not freed or dea
30a00 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73  llocated.  It is
30a10 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
30a20 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
30a30 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65  t has been copie
30a40 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65  d someplace else
30a50 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
30a60 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20  just.** removes 
30a70 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
30a80 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70   the cell from p
30a90 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22  Page..**.** "sz"
30aa0 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d   must be the num
30ab0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
30ac0 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  the cell..*/.sta
30ad0 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c  tic void dropCel
30ae0 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
30af0 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
30b00 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  z, int *pRC){.  
30b10 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20 20  u32 pc;         
30b20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c  /* Offset to cel
30b30 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c  l content of cel
30b40 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  l being deleted 
30b50 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
30b60 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61       /* pPage->a
30b70 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74  Data */.  u8 *pt
30b80 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  r;        /* Use
30b90 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20  d to move bytes 
30ba0 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61  around within da
30bb0 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ta[] */.  int rc
30bc0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
30bd0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
30be0 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
30bf0 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f    /* Beginning o
30c00 66 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30  f the header.  0
30c10 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30   most pages.  10
30c20 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69  0 page 1 */..  i
30c30 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
30c40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  ;..  assert( idx
30c50 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65  >=0 && idx<pPage
30c60 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
30c70 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
30c80 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b  e(pPage, idx) );
30c90 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
30ca0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
30cb0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
30cc0 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
30cd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
30ce0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
30cf0 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20  utex) );.  data 
30d00 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
30d10 20 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e    ptr = &pPage->
30d20 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b  aCellIdx[2*idx];
30d30 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
30d40 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70  (ptr);.  hdr = p
30d50 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
30d60 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d  .  testcase( pc=
30d70 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
30d80 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73  hdr+5]) );.  tes
30d90 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50  tcase( pc+sz==pP
30da0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
30db0 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63  Size );.  if( pc
30dc0 20 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65   < (u32)get2byte
30dd0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c  (&data[hdr+5]) |
30de0 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d  | pc+sz > pPage-
30df0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
30e00 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
30e10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
30e20 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
30e30 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53    }.  rc = freeS
30e40 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20  pace(pPage, pc, 
30e50 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  sz);.  if( rc ){
30e60 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
30e70 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
30e80 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d    pPage->nCell--
30e90 3b 0a 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c  ;.  memmove(ptr,
30ea0 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65   ptr+2, 2*(pPage
30eb0 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b  ->nCell - idx));
30ec0 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
30ed0 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
30ee0 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65  >nCell);.  pPage
30ef0 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a  ->nFree += 2;.}.
30f00 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
30f10 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67  new cell on pPag
30f20 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20  e at cell index 
30f30 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e  "i".  pCell poin
30f40 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ts to the.** con
30f50 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tent of the cell
30f60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
30f70 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c  ell content will
30f80 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
30f90 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68  , then put it th
30fa0 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77  ere.  If it.** w
30fb0 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65  ill not fit, the
30fc0 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  n make a copy of
30fd0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
30fe0 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a  t into pTemp if.
30ff0 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20  ** pTemp is not 
31000 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73  null.  Regardles
31010 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f  s of pTemp, allo
31020 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79  cate a new entry
31030 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70  .** in pPage->ap
31040 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
31050 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
31060 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
31070 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
31080 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
31090 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
310a0 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
310b0 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
310c0 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
310d0 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
310e0 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
310f0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
31100 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
31110 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70  ..**.** If nSkip
31120 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
31130 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74  en do not copy t
31140 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
31150 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63  ytes of the.** c
31160 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ell. The caller 
31170 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
31180 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66  hem after this f
31190 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
311a0 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20   If.** nSkip is 
311b0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70  non-zero, then p
311c0 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69  Cell may not poi
311d0 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  nt to an invalid
311e0 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
311f0 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b   .** (but pCell+
31200 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20  nSkip is always 
31210 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  valid)..*/.stati
31220 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c  c void insertCel
31230 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
31240 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
31250 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
31260 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
31270 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
31280 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
31290 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
312a0 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
312b0 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
312c0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
312d0 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
312e0 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
312f0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
31300 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
31310 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
31320 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
31330 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
31340 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
31350 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  eeded */.  Pgno 
31360 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20  iChild,      /* 
31370 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70  If non-zero, rep
31380 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74  lace first 4 byt
31390 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c  es with this val
313a0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43  ue */.  int *pRC
313b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
313c0 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75  d and write retu
313d0 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72  rn code from her
313e0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  e */.){.  int id
313f0 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57  x = 0;      /* W
31400 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
31410 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
31420 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
31430 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
31440 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
31450 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20  */.  int end;   
31460 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
31470 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61  byte past the la
31480 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
31490 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
314a0 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20  nt ins;         
314b0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74   /* Index in dat
314c0 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65  a[] where new ce
314d0 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e  ll pointer is in
314e0 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  serted */.  int 
314f0 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a  cellOffset;   /*
31500 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73   Address of firs
31510 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
31520 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  n data[] */.  u8
31530 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
31540 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  /* The content o
31550 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65  f the whole page
31560 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20   */.  int nSkip 
31570 3d 20 28 69 43 68 69 6c 64 20 3f 20 34 20 3a 20  = (iChild ? 4 : 
31580 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20  0);..  if( *pRC 
31590 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
315a0 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d  ert( i>=0 && i<=
315b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61  pPage->nCell+pPa
315c0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b  ge->nOverflow );
315d0 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45  .  assert( MX_CE
315e0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
315f0 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72  10921 );.  asser
31600 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  t( pPage->nCell<
31610 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  =MX_CELL(pPage->
31620 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f  pBt) || CORRUPT_
31630 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
31640 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
31650 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  <=ArraySize(pPag
31660 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20  e->apOvfl) );.  
31670 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a  assert( ArraySiz
31680 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  e(pPage->apOvfl)
31690 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  ==ArraySize(pPag
316a0 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20  e->aiOvfl) );.  
316b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
316c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
316d0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
316e0 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73  .  /* The cell s
316f0 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62  hould normally b
31700 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c  e sized correctl
31710 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65  y.  However, whe
31720 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20  n moving a.  ** 
31730 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66  malformed cell f
31740 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20  rom a leaf page 
31750 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70  to an interior p
31760 61 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c  age, if the cell
31770 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65   size.  ** wante
31780 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61  d to be less tha
31790 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e  n 4 but got roun
317a0 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74  ded up to 4 on t
317b0 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69  he leaf, then si
317c0 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  ze.  ** might be
317d0 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65   less than 8 (le
317e0 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65  af-size + pointe
317f0 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69  r) on the interi
31800 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a  or node.  Hence.
31810 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66    ** the term af
31820 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68  ter the || in th
31830 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
31840 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72  rt(). */.  asser
31850 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50  t( sz==cellSizeP
31860 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
31870 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69 43   || (sz==8 && iC
31880 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66 28  hild>0) );.  if(
31890 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
318a0 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d  w || sz+2>pPage-
318b0 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66  >nFree ){.    if
318c0 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  ( pTemp ){.     
318d0 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53   memcpy(pTemp+nS
318e0 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  kip, pCell+nSkip
318f0 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20  , sz-nSkip);.   
31900 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
31910 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31920 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20  iChild ){.      
31930 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
31940 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
31950 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f     j = pPage->nO
31960 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61  verflow++;.    a
31970 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73  ssert( j<(int)(s
31980 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f  izeof(pPage->apO
31990 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67  vfl)/sizeof(pPag
319a0 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29  e->apOvfl[0])) )
319b0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f  ;.    pPage->apO
319c0 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a  vfl[j] = pCell;.
319d0 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66      pPage->aiOvf
319e0 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 20  l[j] = (u16)i;. 
319f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
31a00 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31a10 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
31a20 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
31a30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31a40 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63  .      *pRC = rc
31a50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
31a60 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
31a70 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
31a80 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
31a90 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
31aa0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
31ab0 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66  Data;.    cellOf
31ac0 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
31ad0 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e  llOffset;.    en
31ae0 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  d = cellOffset +
31af0 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
31b00 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f  .    ins = cellO
31b10 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20  ffset + 2*i;.   
31b20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70   rc = allocateSp
31b30 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26  ace(pPage, sz, &
31b40 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  idx);.    if( rc
31b50 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72   ){ *pRC = rc; r
31b60 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20  eturn; }.    /* 
31b70 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  The allocateSpac
31b80 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72  e() routine guar
31b90 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f  antees the follo
31ba0 77 69 6e 67 20 74 77 6f 20 70 72 6f 70 65 72 74  wing two propert
31bb0 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74  ies.    ** if it
31bc0 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
31bd0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
31be0 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a  idx >= end+2 );.
31bf0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b      assert( idx+
31c00 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  sz <= (int)pPage
31c10 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
31c20 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e );.    pPage->
31c30 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61  nCell++;.    pPa
31c40 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31  ge->nFree -= (u1
31c50 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20  6)(2 + sz);.    
31c60 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78  memcpy(&data[idx
31c70 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e  +nSkip], pCell+n
31c80 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b  Skip, sz-nSkip);
31c90 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
31ca0 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
31cb0 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43  e(&data[idx], iC
31cc0 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hild);.    }.   
31cd0 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69   memmove(&data[i
31ce0 6e 73 2b 32 5d 2c 20 26 64 61 74 61 5b 69 6e 73  ns+2], &data[ins
31cf0 5d 2c 20 65 6e 64 2d 69 6e 73 29 3b 0a 20 20 20  ], end-ins);.   
31d00 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
31d10 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20  ins], idx);.    
31d20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
31d30 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
31d40 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
31d50 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
31d60 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
31d70 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  M.    if( pPage-
31d80 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
31d90 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
31da0 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69   cell may contai
31db0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
31dc0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
31dd0 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20   If so, write.  
31de0 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79      ** the entry
31df0 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
31e00 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
31e10 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20  pointer map..   
31e20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d     */.      ptrm
31e30 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
31e40 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b  ge, pCell, pRC);
31e50 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
31e60 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
31e70 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74   list of cells t
31e80 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70  o a page.  The p
31e90 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  age should be in
31ea0 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a  itially empty..*
31eb0 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20  * The cells are 
31ec0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69  guaranteed to fi
31ed0 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
31ee0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
31ef0 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65  semblePage(.  Me
31f00 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
31f10 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62  /* The page to b
31f20 65 20 61 73 73 65 6d 62 6c 65 64 20 2a 2f 0a 20  e assembled */. 
31f30 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
31f40 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
31f50 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64   of cells to add
31f60 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f   to this page */
31f70 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20  .  u8 **apCell, 
31f80 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73       /* Pointers
31f90 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20   to cell bodies 
31fa0 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20  */.  u16 *aSize 
31fb0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20         /* Sizes 
31fc0 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a  of the cells */.
31fd0 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
31fe0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
31ff0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ounter */.  u8 *
32000 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a  pCellptr;     /*
32010 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
32020 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
32030 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b  .  int cellbody;
32040 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
32050 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64  of next cell bod
32060 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  y */.  u8 * cons
32070 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  t data = pPage->
32080 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
32090 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
320a0 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 20   data for pPage 
320b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  */.  const int h
320c0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
320d0 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
320e0 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65   /* Offset of he
320f0 61 64 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f  ader on pPage */
32100 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73  .  const int nUs
32110 61 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  able = pPage->pB
32120 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f  t->usableSize; /
32130 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  * Usable size of
32140 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65   page */..  asse
32150 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
32160 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
32170 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
32180 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
32190 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
321a0 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30  assert( nCell>=0
321b0 20 26 26 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74 29   && nCell<=(int)
321c0 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
321d0 42 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  Bt).            
321e0 26 26 20 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28  && (int)MX_CELL(
321f0 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39  pPage->pBt)<=109
32200 32 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  21);.  assert( s
32210 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
32220 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
32230 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
32240 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70  Check that the p
32250 61 67 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  age has just bee
32260 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f  n zeroed by zero
32270 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65  Page() */.  asse
32280 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
32290 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
322a0 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
322b0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d  (&data[hdr+5])==
322c0 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43  nUsable );..  pC
322d0 65 6c 6c 70 74 72 20 3d 20 26 70 50 61 67 65 2d  ellptr = &pPage-
322e0 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a  >aCellIdx[nCell*
322f0 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d  2];.  cellbody =
32300 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28   nUsable;.  for(
32310 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b  i=nCell-1; i>=0;
32320 20 69 2d 2d 29 7b 0a 20 20 20 20 75 31 36 20 73   i--){.    u16 s
32330 7a 20 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20  z = aSize[i];.  
32340 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b    pCellptr -= 2;
32350 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d  .    cellbody -=
32360 20 73 7a 3b 0a 20 20 20 20 70 75 74 32 62 79 74   sz;.    put2byt
32370 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c  e(pCellptr, cell
32380 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70  body);.    memcp
32390 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79  y(&data[cellbody
323a0 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a  ], apCell[i], sz
323b0 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74  );.  }.  put2byt
323c0 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
323d0 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79  nCell);.  put2by
323e0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
323f0 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50   cellbody);.  pP
32400 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e  age->nFree -= (n
32410 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65  Cell*2 + nUsable
32420 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20   - cellbody);.  
32430 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28  pPage->nCell = (
32440 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a  u16)nCell;.}../*
32450 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
32460 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74  g parameters det
32470 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20  ermine how many 
32480 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67  adjacent pages g
32490 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69  et involved.** i
324a0 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  n a balancing op
324b0 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20  eration.  NN is 
324c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65  the number of ne
324d0 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
324e0 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65  r side.** of the
324f0 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69   page that parti
32500 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
32510 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
32520 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a  n.  NB is the.**
32530 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
32540 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74   pages that part
32550 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69  icipate, includi
32560 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61  ng the target pa
32570 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69  ge and.** NN nei
32580 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
32590 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   side..**.** The
325a0 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f   minimum value o
325b0 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f  f NN is 1 (of co
325c0 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69  urse).  Increasi
325d0 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a  ng NN above 1.**
325e0 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76   (to 2 or 3) giv
325f0 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72  es a modest impr
32600 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43  ovement in SELEC
32610 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72  T and DELETE per
32620 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65  formance.** in e
32630 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61  xchange for a la
32640 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e  rger degradation
32650 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55   in INSERT and U
32660 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  PDATE performanc
32670 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  e..** The value 
32680 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f  of NN appears to
32690 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72   give the best r
326a0 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a  esults overall..
326b0 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20  */.#define NN 1 
326c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
326d0 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
326e0 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
326f0 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64  e of pPage */.#d
32700 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31  efine NB (NN*2+1
32710 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  )      /* Total 
32720 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  pages involved i
32730 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f  n the balance */
32740 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
32750 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
32760 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  NCE./*.** This v
32770 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63  ersion of balanc
32780 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20  e() handles the 
32790 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63  common special c
327a0 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e  ase where.** a n
327b0 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e  ew entry is bein
327c0 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68  g inserted on th
327d0 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d  e extreme right-
327e0 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72  end of the.** tr
327f0 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  ee, in other wor
32800 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77  ds, when the new
32810 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f   entry will beco
32820 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a  me the largest.*
32830 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  * entry in the t
32840 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65  ree..**.** Inste
32850 61 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20  ad of trying to 
32860 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69  balance the 3 ri
32870 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61  ght-most leaf pa
32880 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a  ges, just add.**
32890 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
328a0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
328b0 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f  de and put the o
328c0 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a  ne new entry in.
328d0 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54  ** that page.  T
328e0 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72  his leaves the r
328f0 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65  ight side of the
32900 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a   tree somewhat.*
32910 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42  * unbalanced.  B
32920 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74  ut odds are that
32930 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65   we will be inse
32940 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65  rting new entrie
32950 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
32960 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20  soon afterwards 
32970 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d  so the nearly em
32980 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75  pty page will qu
32990 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70  ickly.** fill up
329a0 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a  .  On average..*
329b0 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68  *.** pPage is th
329c0 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  e leaf page whic
329d0 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  h is the right-m
329e0 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ost page in the 
329f0 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74  tree..** pParent
32a00 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20   is its parent. 
32a10 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65   pPage must have
32a20 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c   a single overfl
32a30 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63  ow entry.** whic
32a40 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69  h is also the ri
32a50 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f  ght-most entry o
32a60 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  n the page..**.*
32a70 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66  * The pSpace buf
32a80 66 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 73  fer is used to s
32a90 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79  tore a temporary
32aa0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76   copy of the div
32ab0 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61  ider.** cell tha
32ac0 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  t will be insert
32ad0 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e  ed into pParent.
32ae0 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e   Such a cell con
32af0 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20  sists of a 4.** 
32b00 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
32b10 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76   followed by a v
32b20 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
32b30 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72  nteger. In other
32b40 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f  .** words, at mo
32b50 73 74 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e  st 13 bytes. Hen
32b60 63 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75  ce the pSpace bu
32b70 66 66 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a  ffer must be at.
32b80 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74 65  ** least 13 byte
32b90 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
32ba0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
32bb0 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a  _quick(MemPage *
32bc0 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65  pParent, MemPage
32bd0 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70   *pPage, u8 *pSp
32be0 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ace){.  BtShared
32bf0 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50   *const pBt = pP
32c00 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20  age->pBt;    /* 
32c10 42 2d 54 72 65 65 20 44 61 74 61 62 61 73 65 20  B-Tree Database 
32c20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  */.  MemPage *pN
32c30 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
32c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
32c50 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ly allocated pag
32c60 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
32c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
32c90 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
32ca0 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20  Pgno pgnoNew;   
32cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32cc0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
32cd0 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a  ber of pNew */..
32ce0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
32cf0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
32d00 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
32d10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
32d20 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
32d30 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
32d40 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
32d50 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
32d60 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a  flow==1 );..  /*
32d70 20 54 68 69 73 20 65 72 72 6f 72 20 63 6f 6e 64   This error cond
32d80 69 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75  ition is now cau
32d90 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61  ght prior to rea
32da0 63 68 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  ching this funct
32db0 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ion */.  if( pPa
32dc0 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 20 72  ge->nCell==0 ) r
32dd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
32de0 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a  RUPT_BKPT;..  /*
32df0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
32e00 70 61 67 65 2e 20 54 68 69 73 20 70 61 67 65 20  page. This page 
32e10 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
32e20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66  right-sibling of
32e30 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61   .  ** pPage. Ma
32e40 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ke the parent pa
32e50 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20  ge writable, so 
32e60 74 68 61 74 20 74 68 65 20 6e 65 77 20 64 69 76  that the new div
32e70 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d  ider cell.  ** m
32e80 61 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20  ay be inserted. 
32e90 49 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70  If both these op
32ea0 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63  erations are suc
32eb0 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64  cessful, proceed
32ec0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c  ..  */.  rc = al
32ed0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
32ee0 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
32ef0 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  oNew, 0, 0);..  
32f00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32f10 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f  K ){..    u8 *pO
32f20 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b  ut = &pSpace[4];
32f30 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
32f40 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30   pPage->apOvfl[0
32f50 5d 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c  ];.    u16 szCel
32f60 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  l = cellSizePtr(
32f70 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
32f80 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20     u8 *pStop;.. 
32f90 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
32fa0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
32fb0 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  le(pNew->pDbPage
32fc0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
32fd0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
32fe0 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  ==(PTF_INTKEY|PT
32ff0 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c  F_LEAFDATA|PTF_L
33000 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f  EAF) );.    zero
33010 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49  Page(pNew, PTF_I
33020 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
33030 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20  TA|PTF_LEAF);.  
33040 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
33050 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20  New, 1, &pCell, 
33060 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f  &szCell);..    /
33070 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
33080 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
33090 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
330a0 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20   pointer map.   
330b0 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73   ** with entries
330c0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67   for the new pag
330d0 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74  e, and any point
330e0 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  er from the .   
330f0 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20   ** cell on the 
33100 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66  page to an overf
33110 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69 74  low page. If eit
33120 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20  her of these.   
33130 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66   ** operations f
33140 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e  ails, the return
33150 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75   code is set, bu
33160 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20  t the contents. 
33170 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72     ** of the par
33180 65 6e 74 20 70 61 67 65 20 61 72 65 20 73 74 69  ent page are sti
33190 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62  ll manipulated b
331a0 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77  y thh code below
331b0 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73  ..    ** That is
331c0 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69   Ok, at this poi
331d0 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  nt the parent pa
331e0 67 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ge is guaranteed
331f0 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61   to.    ** be ma
33200 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 52  rked as dirty. R
33210 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
33220 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73  r code will caus
33230 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  e a.    ** rollb
33240 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79  ack, undoing any
33250 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f   changes made to
33260 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
33270 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
33280 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
33290 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
332a0 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50  (pBt, pgnoNew, P
332b0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
332c0 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  rent->pgno, &rc)
332d0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43 65  ;.      if( szCe
332e0 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61  ll>pNew->minLoca
332f0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72  l ){.        ptr
33300 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e  mapPutOvflPtr(pN
33310 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b  ew, pCell, &rc);
33320 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
33330 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
33340 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74  a divider cell t
33350 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50  o insert into pP
33360 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64  arent. The divid
33370 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63  er cell.    ** c
33380 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62  onsists of a 4-b
33390 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  yte page number 
333a0 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (the page number
333b0 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20   of pPage) and. 
333c0 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65     ** a variable
333d0 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75   length key valu
333e0 65 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65  e (which must be
333f0 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20   the same value 
33400 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61  as the.    ** la
33410 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61  rgest key on pPa
33420 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ge)..    **.    
33430 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c  ** To find the l
33440 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65  argest key value
33450 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74   on pPage, first
33460 20 66 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d   find the right-
33470 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c  most .    ** cel
33480 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20  l on pPage. The 
33490 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73  first two fields
334a0 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72   of this cell ar
334b0 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65  e the .    ** re
334c0 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76  cord-length (a v
334d0 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
334e0 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33  nteger at most 3
334f0 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a  2-bits in size).
33500 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b      ** and the k
33510 65 79 20 76 61 6c 75 65 20 28 61 20 76 61 72 69  ey value (a vari
33520 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
33530 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e  ger, may have an
33540 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a  y value)..    **
33550 20 54 68 65 20 66 69 72 73 74 20 6f 66 20 74 68   The first of th
33560 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  e while(...) loo
33570 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f  ps below skips o
33580 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c  ver the record-l
33590 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65  ength.    ** fie
335a0 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77  ld. The second w
335b0 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63  hile(...) loop c
335c0 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20 76 61  opies the key va
335d0 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  lue from the.   
335e0 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67   ** cell on pPag
335f0 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63  e into the pSpac
33600 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f  e buffer..    */
33610 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
33620 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61  dCell(pPage, pPa
33630 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20  ge->nCell-1);.  
33640 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c    pStop = &pCell
33650 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
33660 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30  (*(pCell++)&0x80
33670 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70  ) && pCell<pStop
33680 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20   );.    pStop = 
33690 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77  &pCell[9];.    w
336a0 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b  hile( ((*(pOut++
336b0 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26  ) = *(pCell++))&
336c0 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70  0x80) && pCell<p
336d0 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Stop );..    /* 
336e0 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64  Insert the new d
336f0 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f  ivider cell into
33700 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20   pParent. */.   
33710 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
33720 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43  ent, pParent->nC
33730 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28 69 6e  ell, pSpace, (in
33740 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65 29 2c  t)(pOut-pSpace),
33750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33760 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  0, pPage->pgno, 
33770 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  &rc);..    /* Se
33780 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  t the right-chil
33790 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61  d pointer of pPa
337a0 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rent to point to
337b0 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a   the new page. *
337c0 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  /.    put4byte(&
337d0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
337e0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
337f0 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a  t+8], pgnoNew);.
33800 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73    .    /* Releas
33810 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
33820 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
33830 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50   */.    releaseP
33840 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a  age(pNew);.  }..
33850 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
33860 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
33870 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
33880 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a  E */..#if 0./*.*
33890 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
338a0 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62  does not contrib
338b0 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ute anything to 
338c0 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  the operation of
338d0 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69   SQLite..** it i
338e0 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63 74 69  s sometimes acti
338f0 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72 69 6c  vated temporaril
33900 79 20 77 68 69 6c 65 20 64 65 62 75 67 67 69 6e  y while debuggin
33910 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73 69 62  g code responsib
33920 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69  le .** for setti
33930 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ng pointer-map e
33940 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
33950 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68 65 63  c int ptrmapChec
33960 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a  kPages(MemPage *
33970 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e 50 61  *apPage, int nPa
33980 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  ge){.  int i, j;
33990 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50  .  for(i=0; i<nP
339a0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50  age; i++){.    P
339b0 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b  gno n;.    u8 e;
339c0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
339d0 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b  age = apPage[i];
339e0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
339f0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
33a00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
33a10 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20  ge->isInit );.. 
33a20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
33a30 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29  age->nCell; j++)
33a40 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f  {.      CellInfo
33a50 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38 20   info;.      u8 
33a60 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20  *z;.     .      
33a70 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  z = findCell(pPa
33a80 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62 74  ge, j);.      bt
33a90 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
33aa0 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29  pPage, z, &info)
33ab0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f  ;.      if( info
33ac0 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
33ad0 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20        Pgno ovfl 
33ae0 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b 69 6e  = get4byte(&z[in
33af0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
33b00 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65          ptrmapGe
33b10 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c  t(pBt, ovfl, &e,
33b20 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73   &n);.        as
33b30 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  sert( n==pPage->
33b40 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41  pgno && e==PTRMA
33b50 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20  P_OVERFLOW1 );. 
33b60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
33b70 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
33b80 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 63 68  .        Pgno ch
33b90 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 7a  ild = get4byte(z
33ba0 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
33bb0 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c  pGet(pBt, child,
33bc0 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
33bd0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
33be0 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
33bf0 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20  TRMAP_BTREE );. 
33c00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
33c10 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
33c20 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
33c30 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
33c40 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
33c50 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
33c60 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61  8]);.      ptrma
33c70 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c  pGet(pBt, child,
33c80 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
33c90 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
33ca0 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
33cb0 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20  MAP_BTREE );.   
33cc0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
33cd0 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  1;.}.#endif../*.
33ce0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33cf0 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 70 79   is used to copy
33d00 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
33d10 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65   the b-tree node
33d20 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70   stored .** on p
33d30 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67  age pFrom to pag
33d40 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65 20 70  e pTo. If page p
33d50 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c  From was not a l
33d60 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a  eaf page, then.*
33d70 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  * the pointer-ma
33d80 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61  p entries for ea
33d90 63 68 20 63 68 69 6c 64 20 70 61 67 65 20 61 72  ch child page ar
33da0 65 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61  e updated so tha
33db0 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20  t the.** parent 
33dc0 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e 20 74  page stored in t
33dd0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69  he pointer map i
33de0 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70  s page pTo. If p
33df0 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a  From contained.*
33e00 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69 74 68  * any cells with
33e10 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
33e20 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20 74 68  ointers, then th
33e30 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
33e40 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
33e50 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73 6f 20  ntries are also 
33e60 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20  updated so that 
33e70 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
33e80 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a  is page pTo..**.
33e90 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73 20 63  ** If pFrom is c
33ea0 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79 69 6e  urrently carryin
33eb0 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63  g any overflow c
33ec0 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20 69 6e  ells (entries in
33ed0 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   the.** MemPage.
33ee0 61 70 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c  apOvfl[] array),
33ef0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 63 6f   they are not co
33f00 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a  pied to pTo. .**
33f10 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
33f20 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f 20 69  ning, page pTo i
33f30 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20  s reinitialized 
33f40 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69 74 50  using btreeInitP
33f50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  age()..**.** The
33f60 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20   performance of 
33f70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
33f80 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20 49   not critical. I
33f90 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  t is only used b
33fa0 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63  y .** the balanc
33fb0 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e  e_shallower() an
33fc0 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  d balance_deeper
33fd0 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20 6e  () procedures, n
33fe0 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69  either of.** whi
33ff0 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f 66  ch are called of
34000 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c  ten under normal
34010 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a   circumstances..
34020 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
34030 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d  opyNodeContent(M
34040 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d  emPage *pFrom, M
34050 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74  emPage *pTo, int
34060 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a   *pRC){.  if( (*
34070 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  pRC)==SQLITE_OK 
34080 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
34090 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 46  * const pBt = pF
340a0 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38  rom->pBt;.    u8
340b0 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d   * const aFrom =
340c0 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20   pFrom->aData;. 
340d0 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54     u8 * const aT
340e0 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a  o = pTo->aData;.
340f0 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46      int const iF
34100 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e  romHdr = pFrom->
34110 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 69  hdrOffset;.    i
34120 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20  nt const iToHdr 
34130 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31  = ((pTo->pgno==1
34140 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20 20  ) ? 100 : 0);.  
34150 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e    int rc;.    in
34160 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20  t iData;.  .  . 
34170 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
34180 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
34190 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e  assert( pFrom->n
341a0 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a  Free>=iToHdr );.
341b0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32      assert( get2
341c0 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f  byte(&aFrom[iFro
341d0 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28 69 6e 74  mHdr+5]) <= (int
341e0 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
341f0 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f   );.  .    /* Co
34200 70 79 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f  py the b-tree no
34210 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  de content from 
34220 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61  page pFrom to pa
34230 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20 20 69  ge pTo. */.    i
34240 44 61 74 61 20 3d 20 67 65 74 32 62 79 74 65 28  Data = get2byte(
34250 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b  &aFrom[iFromHdr+
34260 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  5]);.    memcpy(
34270 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46  &aTo[iData], &aF
34280 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d  rom[iData], pBt-
34290 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44 61 74  >usableSize-iDat
342a0 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  a);.    memcpy(&
342b0 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46  aTo[iToHdr], &aF
342c0 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70  rom[iFromHdr], p
342d0 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  From->cellOffset
342e0 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c   + 2*pFrom->nCel
342f0 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65  l);.  .    /* Re
34300 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 20  initialize page 
34310 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  pTo so that the 
34320 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
34330 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72  MemPage structur
34340 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68 20 74  e.    ** match t
34350 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54 68 65  he new data. The
34360 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
34370 6f 66 20 70 54 6f 20 63 61 6e 20 61 63 74 75 61  of pTo can actua
34380 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65 72 0a 20  lly fail under. 
34390 20 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f 62 73     ** fairly obs
343a0 63 75 72 65 20 63 69 72 63 75 6d 73 74 61 6e 63  cure circumstanc
343b0 65 73 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  es, even though 
343c0 69 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  it is a copy of 
343d0 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20  initialized .   
343e0 20 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d 2e 0a   ** page pFrom..
343f0 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f 2d 3e      */.    pTo->
34400 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
34410 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
34420 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 69 66 28  ge(pTo);.    if(
34430 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34440 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72  {.      *pRC = r
34450 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  c;.      return;
34460 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
34470 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
34480 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
34490 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
344a0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
344b0 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61  ies.    ** for a
344c0 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f 76 65  ny b-tree or ove
344d0 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74  rflow pages that
344e0 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e   pTo now contain
344f0 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74  s the pointers t
34500 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  o..    */.    if
34510 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
34520 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 73  {.      *pRC = s
34530 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
34540 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  To);.    }.  }.}
34550 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
34560 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75 74  tine redistribut
34570 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  es cells on the 
34580 69 50 61 72 65 6e 74 49 64 78 27 74 68 20 63 68  iParentIdx'th ch
34590 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a  ild of pParent.*
345a0 2a 20 28 68 65 72 65 61 66 74 65 72 20 22 74 68  * (hereafter "th
345b0 65 20 70 61 67 65 22 29 20 61 6e 64 20 75 70 20  e page") and up 
345c0 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20 73 6f  to 2 siblings so
345d0 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
345e0 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 0a 2a  have about the.*
345f0 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66  * same amount of
34600 20 66 72 65 65 20 73 70 61 63 65 2e 20 55 73 75   free space. Usu
34610 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20 73 69  ally a single si
34620 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65 72 20  bling on either 
34630 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70  side of the.** p
34640 61 67 65 20 61 72 65 20 75 73 65 64 20 69 6e 20  age are used in 
34650 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74  the balancing, t
34660 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62 6c 69  hough both sibli
34670 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66  ngs might come f
34680 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20  rom one.** side 
34690 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 74  if the page is t
346a0 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61 73 74  he first or last
346b0 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61   child of its pa
346c0 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70 61 67  rent. If the pag
346d0 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65 72 20  e .** has fewer 
346e0 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67 73 20  than 2 siblings 
346f0 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68  (something which
34700 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
34710 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   if the page.** 
34720 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f  is a root page o
34730 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61 20 72  r a child of a r
34740 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e 20 61  oot page) then a
34750 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62  ll available sib
34760 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63 69  lings.** partici
34770 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
34780 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ncing..**.** The
34790 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69   number of sibli
347a0 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  ngs of the page 
347b0 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73  might be increas
347c0 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20  ed or decreased 
347d0 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77  by .** one or tw
347e0 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74  o in an effort t
347f0 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61  o keep pages nea
34800 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74  rly full but not
34810 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a   over full. .**.
34820 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65  ** Note that whe
34830 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
34840 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f  s called, some o
34850 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74  f the cells on t
34860 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74  he page.** might
34870 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65   not actually be
34880 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61   stored in MemPa
34890 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69 73  ge.aData[]. This
348a0 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69   can happen.** i
348b0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76  f the page is ov
348c0 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75  erfull. This rou
348d0 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61  tine ensures tha
348e0 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f  t all cells allo
348f0 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  cated.** to the 
34900 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62  page and its sib
34910 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f 20 4d  lings fit into M
34920 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 20 62  emPage.aData[] b
34930 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
34940 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f  .**.** In the co
34950 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e  urse of balancin
34960 67 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 69  g the page and i
34970 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c  ts siblings, cel
34980 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73  ls may be.** ins
34990 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20 72 65  erted into or re
349a0 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
349b0 61 72 65 6e 74 20 70 61 67 65 20 28 70 50 61 72  arent page (pPar
349c0 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a  ent). Doing so.*
349d0 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  * may cause the 
349e0 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20 62  parent page to b
349f0 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f  ecome overfull o
34a00 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20  r underfull. If 
34a10 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c  this.** happens,
34a20 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
34a30 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
34a40 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b   caller to invok
34a50 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a  e the correct.**
34a60 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69   balancing routi
34a70 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73 20 70  ne to fix this p
34a80 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68 65 20  roblem (see the 
34a90 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74 69 6e  balance() routin
34aa0 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e). .**.** If th
34ab0 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
34ac0 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
34ad0 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20   it might leave 
34ae0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
34af0 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20 73  in a corrupted s
34b00 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68 69 73  tate. So if this
34b10 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20   routine fails, 
34b20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f  the database sho
34b30 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64  uld.** be rolled
34b40 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   back..**.** The
34b50 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
34b60 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
34b70 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20 69 73  , aOvflSpace, is
34b80 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a   a pointer to a.
34b90 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20 65 6e  ** buffer big en
34ba0 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65  ough to hold one
34bb0 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c 65 20   page. If while 
34bc0 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73 20  inserting cells 
34bd0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0a  into the parent.
34be0 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e 74  ** page (pParent
34bf0 29 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  ) the parent pag
34c00 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75  e becomes overfu
34c10 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72 20  ll, this buffer 
34c20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  is.** used to st
34c30 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74 27 73  ore the parent's
34c40 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
34c50 20 42 65 63 61 75 73 65 20 74 68 69 73 20 66 75   Because this fu
34c60 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a  nction inserts.*
34c70 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66  * a maximum of f
34c80 6f 75 72 20 64 69 76 69 64 65 72 20 63 65 6c 6c  our divider cell
34c90 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
34ca0 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65 20  t page, and the 
34cb0 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20  maximum.** size 
34cc0 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65 64  of a cell stored
34cd0 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65 72   within an inter
34ce0 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77 61  nal node is alwa
34cf0 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f 34  ys less than 1/4
34d00 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2d  .** of the page-
34d10 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c 53  size, the aOvflS
34d20 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69 73  pace[] buffer is
34d30 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
34d40 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67  e large.** enoug
34d50 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c  h for all overfl
34d60 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  ow cells..**.** 
34d70 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69 73  If aOvflSpace is
34d80 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70   set to a null p
34d90 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
34da0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a  ction returns .*
34db0 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  * SQLITE_NOMEM..
34dc0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
34dd0 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d 53 43  MSC_VER) && _MSC
34de0 5f 56 45 52 20 3e 3d 20 31 37 30 30 20 26 26 20  _VER >= 1700 && 
34df0 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52 4d 29 0a  defined(_M_ARM).
34e00 23 70 72 61 67 6d 61 20 6f 70 74 69 6d 69 7a 65  #pragma optimize
34e10 28 22 22 2c 20 6f 66 66 29 0a 23 65 6e 64 69 66  ("", off).#endif
34e20 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
34e30 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d  nce_nonroot(.  M
34e40 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
34e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34e60 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20 6f 66  * Parent page of
34e70 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e 67 20   siblings being 
34e80 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e  balanced */.  in
34e90 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20 20 20  t iParentIdx,   
34ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34eb0 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65 20 70   Index of "the p
34ec0 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e 74 20  age" in pParent 
34ed0 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53 70  */.  u8 *aOvflSp
34ee0 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ace,            
34ef0 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a       /* page-siz
34f00 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
34f10 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76 66 6c   for parent ovfl
34f20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74   */.  int isRoot
34f30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
34f40 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
34f50 20 70 50 61 72 65 6e 74 20 69 73 20 61 20 72 6f   pParent is a ro
34f60 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ot-page */.  int
34f70 20 62 42 75 6c 6b 20 20 20 20 20 20 20 20 20 20   bBulk          
34f80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34f90 54 72 75 65 20 69 66 20 74 68 69 73 20 63 61 6c  True if this cal
34fa0 6c 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 62  l is part of a b
34fb0 75 6c 6b 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20  ulk load */.){. 
34fc0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
34fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34fe0 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62   The whole datab
34ff0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ase */.  int nCe
35000 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
35010 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
35020 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  of cells in apCe
35030 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ll[] */.  int nM
35040 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20  axCells = 0;    
35050 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
35060 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65  ted size of apCe
35070 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f  ll, szCell, aFro
35080 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  m. */.  int nNew
35090 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
350a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
350b0 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77  f pages in apNew
350c0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64  [] */.  int nOld
350d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
350e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
350f0 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64  f pages in apOld
35100 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  [] */.  int i, j
35110 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
35120 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
35130 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  nters */.  int n
35140 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20  xDiv;           
35150 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
35160 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20  divider slot in 
35170 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d  pParent->aCell[]
35180 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
35190 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
351a0 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
351b0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c   code */.  u16 l
351c0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20  eafCorrection;  
351d0 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20          /* 4 if 
351e0 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
351f0 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20    0 if not */.  
35200 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20  int leafData;   
35210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35220 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73  True if pPage is
35230 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41   a leaf of a LEA
35240 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20  FDATA tree */.  
35250 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b  int usableSpace;
35260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35270 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62  Bytes in pPage b
35280 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72  eyond the header
35290 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c   */.  int pageFl
352a0 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
352b0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70     /* Value of p
352c0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a  Page->aData[0] *
352d0 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c  /.  int subtotal
352e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
352f0 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20   /* Subtotal of 
35300 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f  bytes in cells o
35310 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20  n one page */.  
35320 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b  int iSpace1 = 0;
35330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35340 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74  First unused byt
35350 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a  e of aSpace1[] *
35360 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53 70 61  /.  int iOvflSpa
35370 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ce = 0;         
35380 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
35390 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c 53 70   byte of aOvflSp
353a0 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73  ace[] */.  int s
353b0 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20 20  zScratch;       
353c0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
353d0 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72  of scratch memor
353e0 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  y requested */. 
353f0 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b   MemPage *apOld[
35400 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  NB];          /*
35410 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
35420 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f   two siblings */
35430 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f  .  MemPage *apCo
35440 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
35450 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65  /* Private copie
35460 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67  s of apOld[] pag
35470 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
35480 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  *apNew[NB+2];   
35490 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
354a0 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69  d up to NB sibli
354b0 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63  ngs after balanc
354c0 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69  ing */.  u8 *pRi
354d0 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ght;            
354e0 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f        /* Locatio
354f0 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 72  n in parent of r
35500 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69  ight-sibling poi
35510 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70  nter */.  u8 *ap
35520 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20  Div[NB-1];      
35530 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65         /* Divide
35540 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  r cells in pPare
35550 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e  nt */.  int cntN
35560 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
35570 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
35580 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c   aCell[] of cell
35590 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67 65   after i-th page
355a0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b   */.  int szNew[
355b0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
355c0 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73     /* Combined s
355d0 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61  ize of cells pla
355e0 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20  ce on i-th page 
355f0 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
35600 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
35610 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62    /* All cells b
35620 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f  egin balanced */
35630 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
35640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35650 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
35660 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
35670 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Cell[] */.  u8 *
35680 61 53 70 61 63 65 31 3b 20 20 20 20 20 20 20 20  aSpace1;        
35690 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
356a0 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20  e for copies of 
356b0 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a  dividers cells *
356c0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
356d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
356e0 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20   /* Temp var to 
356f0 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d  store a page num
35700 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74  ber in */..  pBt
35710 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b   = pParent->pBt;
35720 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
35730 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
35740 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
35750 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
35760 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
35770 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
35780 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52 41   );..#if 0.  TRA
35790 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65  CE(("BALANCE: be
357a0 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c  gin page %d chil
357b0 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67  d of %d\n", pPag
357c0 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74  e->pgno, pParent
357d0 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66  ->pgno));.#endif
357e0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
357f0 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d 61 79  oint pParent may
35800 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e   have at most on
35810 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e  e overflow cell.
35820 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 69   And if.  ** thi
35830 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  s overflow cell 
35840 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74 20 6d  is present, it m
35850 75 73 74 20 62 65 20 74 68 65 20 63 65 6c 6c 20  ust be the cell 
35860 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78  with .  ** index
35870 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54 68 69   iParentIdx. Thi
35880 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73  s scenario comes
35890 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68 69 73   about when this
358a0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
358b0 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65  s called (indire
358c0 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69 74  ctly) from sqlit
358d0 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 2e  e3BtreeDelete().
358e0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
358f0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
35900 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74  ow==0 || pParent
35910 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29  ->nOverflow==1 )
35920 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
35930 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ent->nOverflow==
35940 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 69  0 || pParent->ai
35950 4f 76 66 6c 5b 30 5d 3d 3d 69 50 61 72 65 6e 74  Ovfl[0]==iParent
35960 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20 21 61  Idx );..  if( !a
35970 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20 20 20  OvflSpace ){.   
35980 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
35990 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
359a0 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67  Find the sibling
359b0 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63   pages to balanc
359c0 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74  e. Also locate t
359d0 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  he cells in pPar
359e0 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64  ent .  ** that d
359f0 69 76 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e  ivide the siblin
35a00 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69  gs. An attempt i
35a10 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e  s made to find N
35a20 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20  N siblings on . 
35a30 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65 20   ** either side 
35a40 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73  of pPage. More s
35a50 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65  iblings are take
35a60 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c  n from one side,
35a70 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20   however, .  ** 
35a80 69 66 20 74 68 65 72 65 20 61 72 65 20 66 65 77  if there are few
35a90 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69  er than NN sibli
35aa0 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72  ngs on the other
35ab0 20 73 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e   side. If pParen
35ac0 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72  t.  ** has NB or
35ad0 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20   fewer children 
35ae0 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65  then all childre
35af0 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65  n of pParent are
35b00 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20   taken.  .  **. 
35b10 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c   ** This loop al
35b20 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64 69 76  so drops the div
35b30 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20  ider cells from 
35b40 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
35b50 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20   This.  ** way, 
35b60 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
35b70 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f   the function do
35b80 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64  es not have to d
35b90 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20 20 2a  eal with any.  *
35ba0 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  * overflow cells
35bb0 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70   in the parent p
35bc0 61 67 65 2c 20 73 69 6e 63 65 20 69 66 20 61 6e  age, since if an
35bd0 79 20 65 78 69 73 74 65 64 20 74 68 65 79 20 77  y existed they w
35be0 69 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c  ill.  ** have al
35bf0 72 65 61 64 79 20 62 65 65 6e 20 72 65 6d 6f 76  ready been remov
35c00 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70  ed..  */.  i = p
35c10 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
35c20 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65  w + pParent->nCe
35c30 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20 29 7b  ll;.  if( i<2 ){
35c40 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a  .    nxDiv = 0;.
35c50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
35c60 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20 7c 7c  ert( bBulk==0 ||
35c70 20 62 42 75 6c 6b 3d 3d 31 20 29 3b 0a 20 20 20   bBulk==1 );.   
35c80 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d   if( iParentIdx=
35c90 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
35ca0 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44        .      nxD
35cb0 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  iv = 0;.    }els
35cc0 65 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78  e if( iParentIdx
35cd0 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44  ==i ){.      nxD
35ce0 69 76 20 3d 20 69 2d 32 2b 62 42 75 6c 6b 3b 0a  iv = i-2+bBulk;.
35cf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35d00 20 61 73 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d   assert( bBulk==
35d10 30 20 29 3b 0a 20 20 20 20 20 20 6e 78 44 69 76  0 );.      nxDiv
35d20 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b   = iParentIdx-1;
35d30 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32  .    }.    i = 2
35d40 2d 62 42 75 6c 6b 3b 0a 20 20 7d 0a 20 20 6e 4f  -bBulk;.  }.  nO
35d50 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 69 66 28 20  ld = i+1;.  if( 
35d60 28 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74  (i+nxDiv-pParent
35d70 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50  ->nOverflow)==pP
35d80 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
35d90 20 20 20 20 70 52 69 67 68 74 20 3d 20 26 70 50      pRight = &pP
35da0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
35db0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
35dc0 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  8];.  }else{.   
35dd0 20 70 52 69 67 68 74 20 3d 20 66 69 6e 64 43 65   pRight = findCe
35de0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78  ll(pParent, i+nx
35df0 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
35e00 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70  erflow);.  }.  p
35e10 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
35e20 52 69 67 68 74 29 3b 0a 20 20 77 68 69 6c 65 28  Right);.  while(
35e30 20 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 67   1 ){.    rc = g
35e40 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
35e50 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b  t, pgno, &apOld[
35e60 69 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  i], 0);.    if( 
35e70 72 63 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  rc ){.      mems
35e80 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b  et(apOld, 0, (i+
35e90 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  1)*sizeof(MemPag
35ea0 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  e*));.      goto
35eb0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
35ec0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78  ;.    }.    nMax
35ed0 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64  Cells += 1+apOld
35ee0 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64  [i]->nCell+apOld
35ef0 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  [i]->nOverflow;.
35f00 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30      if( (i--)==0
35f10 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69   ) break;..    i
35f20 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72  f( i+nxDiv==pPar
35f30 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20 26  ent->aiOvfl[0] &
35f40 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  & pParent->nOver
35f50 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 61 70  flow ){.      ap
35f60 44 69 76 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74  Div[i] = pParent
35f70 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20  ->apOvfl[0];.   
35f80 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
35f90 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  te(apDiv[i]);.  
35fa0 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63      szNew[i] = c
35fb0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
35fc0 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20  nt, apDiv[i]);. 
35fd0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f       pParent->nO
35fe0 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
35ff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 70   }else{.      ap
36000 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c  Div[i] = findCel
36010 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44  l(pParent, i+nxD
36020 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
36030 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70 67  rflow);.      pg
36040 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70  no = get4byte(ap
36050 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73  Div[i]);.      s
36060 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69  zNew[i] = cellSi
36070 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61  zePtr(pParent, a
36080 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20  pDiv[i]);..     
36090 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63 65 6c   /* Drop the cel
360a0 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  l from the paren
360b0 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b 69 5d  t page. apDiv[i]
360c0 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   still points to
360d0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 65  .      ** the ce
360e0 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  ll within the pa
360f0 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  rent, even thoug
36100 68 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 72  h it has been dr
36110 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  opped..      ** 
36120 54 68 69 73 20 69 73 20 73 61 66 65 20 62 65 63  This is safe bec
36130 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20 61 20  ause dropping a 
36140 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72  cell only overwr
36150 69 74 65 73 20 74 68 65 20 66 69 72 73 74 0a 20  ites the first. 
36160 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74       ** four byt
36170 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20 74 68  es of it, and th
36180 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
36190 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 66 69   not need the fi
361a0 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75  rst.      ** fou
361b0 72 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 64  r bytes of the d
361c0 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20  ivider cell. So 
361d0 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73  the pointer is s
361e0 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20 20 20  afe to use.     
361f0 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a   ** later on.  .
36200 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
36210 2a 20 42 75 74 20 6e 6f 74 20 69 66 20 77 65 20  * But not if we 
36220 61 72 65 20 69 6e 20 73 65 63 75 72 65 2d 64 65  are in secure-de
36230 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20 73 65  lete mode. In se
36240 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65  cure-delete mode
36250 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  ,.      ** the d
36260 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e  ropCell() routin
36270 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65  e will overwrite
36280 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c   the entire cell
36290 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20   with zeroes..  
362a0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
362b0 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79  ase, temporarily
362c0 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c 20 69   copy the cell i
362d0 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53 70 61  nto the aOvflSpa
362e0 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75  ce[].      ** bu
362f0 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20 62 65  ffer. It will be
36300 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67 61 69   copied out agai
36310 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  n as soon as the
36320 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72   aSpace[] buffer
36330 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c  .      ** is all
36340 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20  ocated.  */.    
36350 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
36360 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
36370 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20  _DELETE ){.     
36380 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20     int iOff;..  
36390 20 20 20 20 20 20 69 4f 66 66 20 3d 20 53 51 4c        iOff = SQL
363a0 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 61  ITE_PTR_TO_INT(a
363b0 70 44 69 76 5b 69 5d 29 20 2d 20 53 51 4c 49 54  pDiv[i]) - SQLIT
363c0 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 50 61  E_PTR_TO_INT(pPa
363d0 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20  rent->aData);.  
363e0 20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66 2b        if( (iOff+
363f0 73 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e 74 29 70  szNew[i])>(int)p
36400 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
36410 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
36420 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
36430 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
36440 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c  memset(apOld, 0,
36450 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65   (i+1)*sizeof(Me
36460 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20  mPage*));.      
36470 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
36480 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
36490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
364a0 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76 66 6c     memcpy(&aOvfl
364b0 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20 61 70 44  Space[iOff], apD
364c0 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29  iv[i], szNew[i])
364d0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 44 69  ;.          apDi
364e0 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53 70 61  v[i] = &aOvflSpa
364f0 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61 72  ce[apDiv[i]-pPar
36500 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20 20 20  ent->aData];.   
36510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
36520 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
36530 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
36540 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
36550 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63  w, szNew[i], &rc
36560 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
36570 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c  /* Make nMaxCell
36580 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  s a multiple of 
36590 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  4 in order to pr
365a0 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20  eserve 8-byte.  
365b0 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a  ** alignment */.
365c0 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e    nMaxCells = (n
365d0 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33  MaxCells + 3)&~3
365e0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
365f0 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
36600 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
36610 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74  s.  */.  k = pBt
36620 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52 4f 55  ->pageSize + ROU
36630 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
36640 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61 74 63  ge));.  szScratc
36650 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43  h =.       nMaxC
36660 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29  ells*sizeof(u8*)
36670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36680 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c         /* apCell
36690 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43   */.     + nMaxC
366a0 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29  ells*sizeof(u16)
366b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
366c0 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c         /* szCell
366d0 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e   */.     + pBt->
366e0 70 61 67 65 53 69 7a 65 20 20 20 20 20 20 20 20  pageSize        
366f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36700 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65         /* aSpace
36710 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f  1 */.     + k*nO
36720 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
36730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36740 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
36750 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79 29 20  copies (apCopy) 
36760 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71  */.  apCell = sq
36770 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c  lite3ScratchMall
36780 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b  oc( szScratch );
36790 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d   .  if( apCell==
367a0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
367b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
367c0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
367d0 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65  anup;.  }.  szCe
367e0 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65  ll = (u16*)&apCe
367f0 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20  ll[nMaxCells];. 
36800 20 61 53 70 61 63 65 31 20 3d 20 28 75 38 2a 29   aSpace1 = (u8*)
36810 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c  &szCell[nMaxCell
36820 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  s];.  assert( EI
36830 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
36840 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b 0a 0a  NT(aSpace1) );..
36850 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70    /*.  ** Load p
36860 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63  ointers to all c
36870 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20  ells on sibling 
36880 70 61 67 65 73 20 61 6e 64 20 74 68 65 20 64 69  pages and the di
36890 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  vider cells.  **
368a0 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20   into the local 
368b0 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20  apCell[] array. 
368c0 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
368d0 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
368e0 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63  s.  ** into spac
368f0 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
36900 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65  aSpace1[] and re
36910 6d 6f 76 65 20 74 68 65 20 64 69 76 69 64 65 72  move the divider
36920 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d   cells.  ** from
36930 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20   pParent..  **. 
36940 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   ** If the sibli
36950 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20  ngs are on leaf 
36960 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20  pages, then the 
36970 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f  child pointers o
36980 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64  f the.  ** divid
36990 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72  er cells are str
369a0 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63  ipped from the c
369b0 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79  ells before they
369c0 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a   are copied.  **
369d0 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e   into aSpace1[].
369e0 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61    In this way, a
369f0 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
36a00 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74  ll[] are without
36a10 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e  .  ** child poin
36a20 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e  ters.  If siblin
36a30 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  gs are not leave
36a40 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c  s, then all cell
36a50 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b   in.  ** apCell[
36a60 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20  ] include child 
36a70 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65  pointers.  Eithe
36a80 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  r way, all cells
36a90 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a   in apCell[].  *
36aa0 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a  * are alike..  *
36ab0 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65  *.  ** leafCorre
36ac0 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61  ction:  4 if pPa
36ad0 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
36ae0 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74   if pPage is not
36af0 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20   a leaf..  **   
36b00 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31      leafData:  1
36b10 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20   if pPage holds 
36b20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61  key+data and pPa
36b30 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20  rent holds only 
36b40 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61  keys..  */.  lea
36b50 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 61 70  fCorrection = ap
36b60 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a  Old[0]->leaf*4;.
36b70 20 20 6c 65 61 66 44 61 74 61 20 3d 20 61 70 4f    leafData = apO
36b80 6c 64 5b 30 5d 2d 3e 69 6e 74 4b 65 79 4c 65 61  ld[0]->intKeyLea
36b90 66 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  f;.  for(i=0; i<
36ba0 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
36bb0 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20 0a  int limit;.    .
36bc0 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f      /* Before do
36bd0 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
36be0 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79 20 6f  e, take a copy o
36bf0 66 20 74 68 65 20 69 27 74 68 20 6f 72 69 67 69  f the i'th origi
36c00 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20 20  nal sibling.    
36c10 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74  ** The rest of t
36c20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
36c30 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20  l use data from 
36c40 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65  the copies rathe
36c50 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  r.    ** that th
36c60 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
36c70 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69   since the origi
36c80 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62  nal pages will b
36c90 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e in the.    ** 
36ca0 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67  process of being
36cb0 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a   overwritten.  *
36cc0 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
36cd0 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20  Old = apCopy[i] 
36ce0 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 53 70  = (MemPage*)&aSp
36cf0 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69  ace1[pBt->pageSi
36d00 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d  ze + k*i];.    m
36d10 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f 6c  emcpy(pOld, apOl
36d20 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  d[i], sizeof(Mem
36d30 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c 64  Page));.    pOld
36d40 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a  ->aData = (void*
36d50 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d  )&pOld[1];.    m
36d60 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61 74  emcpy(pOld->aDat
36d70 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61  a, apOld[i]->aDa
36d80 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  ta, pBt->pageSiz
36d90 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20 3d  e);..    limit =
36da0 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c   pOld->nCell+pOl
36db0 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
36dc0 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65    if( pOld->nOve
36dd0 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20  rflow>0 ){.     
36de0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69   for(j=0; j<limi
36df0 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; j++){.       
36e00 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
36e10 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
36e20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
36e30 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77  ] = findOverflow
36e40 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20  Cell(pOld, j);. 
36e50 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
36e60 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  ell] = cellSizeP
36e70 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b  tr(pOld, apCell[
36e80 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20  nCell]);.       
36e90 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20   nCell++;.      
36ea0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
36eb0 20 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70     u8 *aData = p
36ec0 4f 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  Old->aData;.    
36ed0 20 20 75 31 36 20 6d 61 73 6b 50 61 67 65 20 3d    u16 maskPage =
36ee0 20 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67 65 3b   pOld->maskPage;
36ef0 0a 20 20 20 20 20 20 75 31 36 20 63 65 6c 6c 4f  .      u16 cellO
36f00 66 66 73 65 74 20 3d 20 70 4f 6c 64 2d 3e 63 65  ffset = pOld->ce
36f10 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  llOffset;.      
36f20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74  for(j=0; j<limit
36f30 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
36f40 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
36f50 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
36f60 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
36f70 20 3d 20 66 69 6e 64 43 65 6c 6c 76 32 28 61 44   = findCellv2(aD
36f80 61 74 61 2c 20 6d 61 73 6b 50 61 67 65 2c 20 63  ata, maskPage, c
36f90 65 6c 6c 4f 66 66 73 65 74 2c 20 6a 29 3b 0a 20  ellOffset, j);. 
36fa0 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
36fb0 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  ell] = cellSizeP
36fc0 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b  tr(pOld, apCell[
36fd0 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20  nCell]);.       
36fe0 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20   nCell++;.      
36ff0 7d 0a 20 20 20 20 7d 20 20 20 20 20 20 20 0a 20  }.    }       . 
37000 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20     if( i<nOld-1 
37010 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a 20  && !leafData){. 
37020 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28 75       u16 sz = (u
37030 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20  16)szNew[i];.   
37040 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
37050 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
37060 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
37070 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
37080 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70  l] = sz;.      p
37090 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b  Temp = &aSpace1[
370a0 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20  iSpace1];.      
370b0 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20  iSpace1 += sz;. 
370c0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c       assert( sz<
370d0 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32  =pBt->maxLocal+2
370e0 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  3 );.      asser
370f0 74 28 20 69 53 70 61 63 65 31 20 3c 3d 20 28 69  t( iSpace1 <= (i
37100 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  nt)pBt->pageSize
37110 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
37120 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d  (pTemp, apDiv[i]
37130 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61 70 43  , sz);.      apC
37140 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65  ell[nCell] = pTe
37150 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  mp+leafCorrectio
37160 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
37170 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
37180 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63  =0 || leafCorrec
37190 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
371a0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
371b0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d   szCell[nCell] -
371c0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
371d0 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64  .      if( !pOld
371e0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
371f0 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
37200 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20  rrection==0 );. 
37210 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
37220 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  Old->hdrOffset==
37230 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 );.        /* 
37240 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65  The right pointe
37250 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
37260 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73  age pOld becomes
37270 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20   the left.      
37280 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20    ** pointer of 
37290 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
372a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   */.        memc
372b0 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  py(apCell[nCell]
372c0 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 38  , &pOld->aData[8
372d0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ], 4);.      }el
372e0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
372f0 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
37300 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20  on==4 );.       
37310 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c   if( szCell[nCel
37320 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20  l]<4 ){.        
37330 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
37340 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c  w any cells smal
37350 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65 73  ler than 4 bytes
37360 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
37370 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34  zCell[nCell] = 4
37380 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37390 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b    }.      nCell+
373a0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
373b0 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f  /*.  ** Figure o
373c0 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ut the number of
373d0 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f   pages needed to
373e0 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20   hold all nCell 
373f0 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72  cells..  ** Stor
37400 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e  e this number in
37410 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70   "k".  Also comp
37420 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63  ute szNew[] whic
37430 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20  h is the total. 
37440 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20   ** size of all 
37450 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74  cells on the i-t
37460 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65  h page and cntNe
37470 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
37480 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61   index.  ** in a
37490 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63  pCell[] of the c
374a0 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73  ell that divides
374b0 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67   page i from pag
374c0 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e  e i+1.  .  ** cn
374d0 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65  tNew[k] should e
374e0 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a  qual nCell..  **
374f0 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d  .  ** Values com
37500 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  puted by this bl
37510 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ock:.  **.  **  
37520 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20           k: The 
37530 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
37540 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20  sibling pages.  
37550 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20  **    szNew[i]: 
37560 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74  Spaced used on t
37570 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
37580 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74  page..  **   cnt
37590 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e  New[i]: Index in
375a0 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a   apCell[] and sz
375b0 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66  Cell[] for the f
375c0 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a  irst cell to.  *
375d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
375e0 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
375f0 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
37600 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70  e..  ** usableSp
37610 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62  ace: Number of b
37620 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76  ytes of space av
37630 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20  ailable on each 
37640 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20  sibling..  ** . 
37650 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63   */.  usableSpac
37660 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
37670 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43  ize - 12 + leafC
37680 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72  orrection;.  for
37690 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b  (subtotal=k=i=0;
376a0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
376b0 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d      assert( i<nM
376c0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73  axCells );.    s
376d0 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c  ubtotal += szCel
376e0 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66  l[i] + 2;.    if
376f0 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61  ( subtotal > usa
37700 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20  bleSpace ){.    
37710 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
37720 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69  total - szCell[i
37730 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  ];.      cntNew[
37740 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66  k] = i;.      if
37750 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d  ( leafData ){ i-
37760 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f  -; }.      subto
37770 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b  tal = 0;.      k
37780 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3e  ++;.      if( k>
37790 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51 4c  NB+1 ){ rc = SQL
377a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
377b0 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ; goto balance_c
377c0 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d 0a  leanup; }.    }.
377d0 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d    }.  szNew[k] =
377e0 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74   subtotal;.  cnt
377f0 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a  New[k] = nCell;.
37800 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a    k++;..  /*.  *
37810 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f  * The packing co
37820 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72  mputed by the pr
37830 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20  evious block is 
37840 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68  biased toward th
37850 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20  e siblings.  ** 
37860 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65  on the left side
37870 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c  .  The left sibl
37880 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20  ings are always 
37890 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69  nearly full, whi
378a0 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68  le the.  ** righ
378b0 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d  t-most sibling m
378c0 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65  ight be nearly e
378d0 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63  mpty.  This bloc
378e0 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70  k of code attemp
378f0 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73  ts.  ** to adjus
37900 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66  t the packing of
37910 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74   siblings to get
37920 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63   a better balanc
37930 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
37940 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
37950 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74  more than an opt
37960 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20  imization.  The 
37970 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69  packing above mi
37980 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f  ght.  ** be so o
37990 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73  ut of balance as
379a0 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20   to be illegal. 
379b0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
379c0 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
379d0 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  * sibling might 
379e0 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  be completely em
379f0 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73  pty.  This adjus
37a00 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74  tment is not opt
37a10 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ional..  */.  fo
37a20 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d  r(i=k-1; i>0; i-
37a30 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69  -){.    int szRi
37a40 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20  ght = szNew[i]; 
37a50 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
37a60 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ing on the right
37a70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65   */.    int szLe
37a80 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b  ft = szNew[i-1];
37a90 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
37aa0 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  ing on the left 
37ab0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20  */.    int r;   
37ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
37ad0 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73  dex of right-mos
37ae0 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73  t cell in left s
37af0 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  ibling */.    in
37b00 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  t d;            
37b10 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
37b20 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20  rst cell to the 
37b30 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69  left of right si
37b40 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20  bling */..    r 
37b50 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
37b60 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31  1;.    d = r + 1
37b70 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
37b80 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43   assert( d<nMaxC
37b90 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
37ba0 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( r<nMaxCells 
37bb0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a  );.    while( sz
37bc0 52 69 67 68 74 3d 3d 30 20 0a 20 20 20 20 20 20  Right==0 .      
37bd0 20 7c 7c 20 28 21 62 42 75 6c 6b 20 26 26 20 73   || (!bBulk && s
37be0 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d  zRight+szCell[d]
37bf0 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65  +2<=szLeft-(szCe
37c00 6c 6c 5b 72 5d 2b 32 29 29 20 0a 20 20 20 20 29  ll[r]+2)) .    )
37c10 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20  {.      szRight 
37c20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32  += szCell[d] + 2
37c30 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d  ;.      szLeft -
37c40 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b  = szCell[r] + 2;
37c50 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d  .      cntNew[i-
37c60 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20  1]--;.      r = 
37c70 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b  cntNew[i-1] - 1;
37c80 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31  .      d = r + 1
37c90 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
37ca0 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20   }.    szNew[i] 
37cb0 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73  = szRight;.    s
37cc0 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65  zNew[i-1] = szLe
37cd0 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69  ft;.  }..  /* Ei
37ce0 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e  ther we found on
37cf0 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20  e or more cells 
37d00 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f  (cntnew[0])>0) o
37d10 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a 20  r pPage is.  ** 
37d20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
37d30 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20  age.  A virtual 
37d40 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65  root page is whe
37d50 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a  n the real root.
37d60 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67    ** page is pag
37d70 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74  e 1 and we are t
37d80 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66  he only child of
37d90 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2a   that page..  **
37da0 0a 20 20 2a 2a 20 55 50 44 41 54 45 3a 20 20 54  .  ** UPDATE:  T
37db0 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f  he assert() belo
37dc0 77 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  w is not necessa
37dd0 72 69 6c 79 20 74 72 75 65 20 69 66 20 74 68 65  rily true if the
37de0 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66   database.  ** f
37df0 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20  ile is corrupt. 
37e00 20 54 68 65 20 63 6f 72 72 75 70 74 69 6f 6e 20   The corruption 
37e10 77 69 6c 6c 20 62 65 20 64 65 74 65 63 74 65 64  will be detected
37e20 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61   and reported la
37e30 74 65 72 0a 20 20 2a 2a 20 69 6e 20 74 68 69 73  ter.  ** in this
37e40 20 70 72 6f 63 65 64 75 72 65 20 73 6f 20 74 68   procedure so th
37e50 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
37e60 6f 20 61 63 74 20 75 70 6f 6e 20 69 74 20 6e 6f  o act upon it no
37e70 77 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20  w..  */.#if 0.  
37e80 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30  assert( cntNew[0
37e90 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d  ]>0 || (pParent-
37ea0 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72  >pgno==1 && pPar
37eb0 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29  ent->nCell==0) )
37ec0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 52 41 43  ;.#endif..  TRAC
37ed0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64  E(("BALANCE: old
37ee0 3a 20 25 64 20 25 64 20 25 64 20 20 22 2c 0a 20  : %d %d %d  ",. 
37ef0 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e     apOld[0]->pgn
37f00 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20  o, .    nOld>=2 
37f10 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f  ? apOld[1]->pgno
37f20 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d   : 0,.    nOld>=
37f30 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67  3 ? apOld[2]->pg
37f40 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20  no : 0.  ));..  
37f50 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  /*.  ** Allocate
37f60 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52   k new pages.  R
37f70 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77  euse old pages w
37f80 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20  here possible.. 
37f90 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b   */.  if( apOld[
37fa0 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20  0]->pgno<=1 ){. 
37fb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
37fc0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
37fd0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
37fe0 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67  eanup;.  }.  pag
37ff0 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30  eFlags = apOld[0
38000 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66  ]->aData[0];.  f
38010 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=0; i<k; i++
38020 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
38030 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c  pNew;.    if( i<
38040 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e  nOld ){.      pN
38050 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20  ew = apNew[i] = 
38060 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20  apOld[i];.      
38070 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20  apOld[i] = 0;.  
38080 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
38090 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d  PagerWrite(pNew-
380a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
380b0 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69   nNew++;.      i
380c0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
380d0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
380e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
380f0 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20  ssert( i>0 );.  
38100 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
38110 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
38120 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 28 62  &pNew, &pgno, (b
38130 42 75 6c 6b 20 3f 20 31 20 3a 20 70 67 6e 6f 29  Bulk ? 1 : pgno)
38140 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
38150 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
38160 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
38170 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77   apNew[i] = pNew
38180 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a  ;.      nNew++;.
38190 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68  .      /* Set th
381a0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
381b0 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20  try for the new 
381c0 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f  sibling page. */
381d0 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54  .      if( ISAUT
381e0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
381f0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
38200 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54  , pNew->pgno, PT
38210 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72  RMAP_BTREE, pPar
38220 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  ent->pgno, &rc);
38230 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
38240 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
38250 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
38260 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
38270 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
38280 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
38290 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67  Free any old pag
382a0 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74  es that were not
382b0 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70   reused as new p
382c0 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  ages..  */.  whi
382d0 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  le( i<nOld ){.  
382e0 20 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64    freePage(apOld
382f0 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  [i], &rc);.    i
38300 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
38310 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
38320 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
38330 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f  Old[i]);.    apO
38340 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69  ld[i] = 0;.    i
38350 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ++;.  }..  /*.  
38360 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70  ** Put the new p
38370 61 67 65 73 20 69 6e 20 61 73 63 65 6e 64 69 6e  ages in ascendin
38380 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68  g order.  This h
38390 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65  elps to.  ** kee
383a0 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  p entries in the
383b0 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72   disk file in or
383c0 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63  der so that a sc
383d0 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  an.  ** of the t
383e0 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72  able is a linear
383f0 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   scan through th
38400 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20  e file.  That.  
38410 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73  ** in turn helps
38420 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
38430 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72  ystem to deliver
38440 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d   pages.  ** from
38450 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72   the disk more r
38460 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a  apidly..  **.  *
38470 2a 20 41 6e 20 4f 28 6e 5