/ Hex Artifact Content
Login

Artifact 3c72c5aa96b1a06ea15da24b82c526e6f14010ab:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e     iTab = pIdx->
1850: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20  pTable->tnum;.  
1860: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1870: 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20  lse{.    iTab = 
1880: 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iRoot;.  }..  /*
1890: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
18a0: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45  required lock. E
18b0: 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f  ither a write-lo
18c0: 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20  ck on root-page 
18d0: 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72  iTab, a .  ** wr
18e0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
18f0: 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72  schema table, or
1900: 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20   (if the client 
1910: 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20  is reading) a.  
1920: 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  ** read-lock on 
1930: 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63  iTab will suffic
1940: 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61  e. Return 1 if a
1950: 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ny of these are 
1960: 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72  found.  */.  for
1970: 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70  (pLock=pBtree->p
1980: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
1990: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
19a0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
19b0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42  Lock->pBtree==pB
19c0: 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70  tree .     && (p
19d0: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Lock->iTable==iT
19e0: 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c  ab || (pLock->eL
19f0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1a00: 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  && pLock->iTable
1a10: 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c  ==1)).     && pL
1a20: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ock->eLock>=eLoc
1a30: 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20  kType .    ){.  
1a40: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1a50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61    }.  }..  /* Fa
1a60: 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  iled to find the
1a70: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1a80: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
1a90: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1aa0: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64  E_DEBUG */..#ifd
1ab0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1ac0: 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e  /*.**** This fun
1ad0: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65  ction may be use
1ae0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
1af0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1b00: 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a   only. ****.**.*
1b10: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1b20: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c   it would be ill
1b30: 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20  egal for pBtree 
1b40: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
1b50: 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1b60: 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52  dex rooted at iR
1b70: 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65  oot because othe
1b80: 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  r shared connect
1b90: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75  ions are.** simu
1ba0: 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69  ltaneously readi
1bb0: 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62  ng that same tab
1bc0: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  le or index..**.
1bd0: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
1be0: 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77   for pBtree to w
1bf0: 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68  rite if some oth
1c00: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1c10: 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74  that.** shares t
1c20: 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64  he same BtShared
1c30: 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65   object is curre
1c40: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
1c50: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69  writing.** the i
1c60: 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63  Root table.  Exc
1c70: 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65  ept, if the othe
1c80: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68  r Btree object h
1c90: 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75  as the.** read-u
1ca0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1cb0: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
1cc0: 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  OK for the other
1cd0: 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61   object to.** ha
1ce0: 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  ve a read cursor
1cf0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1d00: 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74  ple, before writ
1d10: 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20  ing to any part 
1d20: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1d30: 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20  index.** rooted 
1d40: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f  at page iRoot, o
1d50: 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a  ne should call:.
1d60: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
1d70: 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1d80: 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74  ts(pBtree, iRoot
1d90: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
1da0: 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  nt hasReadConfli
1db0: 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cts(Btree *pBtre
1dc0: 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a  e, Pgno iRoot){.
1dd0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1de0: 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1df0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1e00: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1e10: 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1e20: 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26  ==iRoot .     &&
1e30: 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72   p->pBtree!=pBtr
1e40: 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70  ee.     && 0==(p
1e50: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c  ->pBtree->db->fl
1e60: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
1e70: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20  dUncommitted).  
1e80: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
1e90: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1ea0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1eb0: 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66  dif    /* #ifdef
1ec0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
1ed0: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
1ee0: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
1ef0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
1f00: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
1f10: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
1f20: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
1f30: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
1f40: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
1f50: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
1f60: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
1f70: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
1f80: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
1f90: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
1fa0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
1fb0: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
1fc0: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
1fd0: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
1fe0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1ff0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
2000: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
2010: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2020: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
2030: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
2040: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2050: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2060: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2070: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2080: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2090: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
20a0: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
20b0: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
20c0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
20d0: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c  eadUncommitted)|
20e0: 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  |eLock==WRITE_LO
20f0: 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20  CK||iTab==1 );. 
2100: 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73   .  /* If reques
2110: 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ting a write-loc
2120: 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65  k, then the Btre
2130: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f  e must have an o
2140: 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74  pen write.  ** t
2150: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2160: 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62  is file. And, ob
2170: 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69  viously, for thi
2180: 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65  s to be so there
2190: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61   .  ** must be a
21a0: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
21b0: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
21c0: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  file itself..  *
21d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  /.  assert( eLoc
21e0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
21f0: 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72  (p==pBt->pWriter
2200: 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
2210: 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a  TRANS_WRITE) );.
2220: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2230: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42  =READ_LOCK || pB
2240: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2250: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
2260: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  .  .  /* This ro
2270: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2280: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
2290: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
22a0: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d  led */.  if( !p-
22b0: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
22c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22d0: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
22e0: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
22f0: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
2300: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
2310: 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71  ck, the.  ** req
2320: 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20  uested lock may 
2330: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
2340: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2350: 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28  >pWriter!=p && (
2360: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2370: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  BTS_EXCLUSIVE)!=
2380: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2390: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
23a0: 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57  d(p->db, pBt->pW
23b0: 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20  riter->db);.    
23c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
23d0: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
23e0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74  ;.  }..  for(pIt
23f0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
2400: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
2410: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  r->pNext){.    /
2420: 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  * The condition 
2430: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
2440: 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c  Lock) in the fol
2450: 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a  lowing if(...) .
2460: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
2470: 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61   is a simplifica
2480: 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  tion of:.    **.
2490: 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d      **   (eLock=
24a0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70  =WRITE_LOCK || p
24b0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
24c0: 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a  TE_LOCK).    **.
24d0: 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
24e0: 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f  know that if eLo
24f0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20  ck==WRITE_LOCK, 
2500: 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f  then no other co
2510: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nnection.    ** 
2520: 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45  may hold a WRITE
2530: 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62  _LOCK on any tab
2540: 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  le in this file 
2550: 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e  (since there can
2560: 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20  .    ** only be 
2570: 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29  a single writer)
2580: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2590: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63  ert( pIter->eLoc
25a0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
25b0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
25c0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  ITE_LOCK );.    
25d0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
25e0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
25f0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20  r->pBtree==p || 
2600: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
2610: 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  AD_LOCK);.    if
2620: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
2630: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
2640: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74  ble==iTab && pIt
2650: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
2660: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2670: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2680: 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d  ed(p->db, pIter-
2690: 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
26a0: 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57      if( eLock==W
26b0: 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RITE_LOCK ){.   
26c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
26d0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
26e0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73          pBt->bts
26f0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e  Flags |= BTS_PEN
2700: 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DING;.      }.  
2710: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2720: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2730: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
2740: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2750: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2760: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2770: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2780: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2790: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
27a0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
27b0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
27c0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
27d0: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
27e0: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
27f0: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
2800: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
2810: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
2820: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
2830: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
2840: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2850: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2860: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2870: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2880: 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ed Btree object 
2890: 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  p is connected t
28a0: 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20  o a sharable.** 
28b0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
28c0: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53  one with the BtS
28d0: 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66  hared.sharable f
28e0: 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a  lag set), and.**
28f0: 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68  .**   (b) No oth
2900: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73  er Btree objects
2910: 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61   hold a lock tha
2920: 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20  t conflicts.**  
2930: 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65       with the re
2940: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e  quested lock (i.
2950: 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61  e. querySharedCa
2960: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68  cheTableLock() h
2970: 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65  as.**       alre
2980: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2990: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c  and returned SQL
29a0: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53  ITE_OK)..**.** S
29b0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
29c0: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
29d0: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
29e0: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e  sfully. SQLITE_N
29f0: 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75  OMEM .** is retu
2a00: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2a10: 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a   attempt fails..
2a20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2a30: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2a40: 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  eLock(Btree *p, 
2a50: 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20  Pgno iTable, u8 
2a60: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
2a70: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2a80: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
2a90: 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  k = 0;.  BtLock 
2aa0: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2ab0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2ac0: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2ad0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2ae0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
2af0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2b00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2b10: 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  db!=0 );..  /* A
2b20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
2b30: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
2b40: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77  itted flag set w
2b50: 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f  ill never try to
2b60: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72  .  ** obtain a r
2b70: 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74  ead-lock using t
2b80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  his function. Th
2b90: 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b  e only read-lock
2ba0: 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62   obtained.  ** b
2bb0: 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  y a connection i
2bc0: 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  n read-uncommitt
2bd0: 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68  ed mode is on th
2be0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2bf0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  .  ** table, and
2c00: 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62   that lock is ob
2c10: 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42  tained in BtreeB
2c20: 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f  eginTrans().  */
2c30: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70  .  assert( 0==(p
2c40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
2c50: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2c60: 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  ed) || eLock==WR
2c70: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  ITE_LOCK );..  /
2c80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2c90: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2ca0: 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61  alled on a shara
2cb0: 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72  ble b-tree after
2cc0: 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65   it .  ** has be
2cd0: 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  en determined th
2ce0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72  at no other b-tr
2cf0: 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c  ee holds a confl
2d00: 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f  icting lock.  */
2d10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2d20: 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  arable );.  asse
2d30: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
2d40: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2d50: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
2d60: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
2d70: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
2d80: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
2d90: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
2da0: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
2db0: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
2dc0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
2dd0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2de0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
2df0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2e00: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
2e10: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
2e20: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
2e30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2e40: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
2e50: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
2e60: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
2e70: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
2e80: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
2e90: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
2ea0: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
2eb0: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
2ec0: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
2ed0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
2ee0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
2ef0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
2f00: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
2f10: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
2f20: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
2f30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2f40: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2f50: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
2f60: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
2f70: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
2f80: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
2f90: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
2fa0: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
2fb0: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
2fc0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
2fd0: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
2fe0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
2ff0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
3000: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
3010: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
3020: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
3030: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
3040: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
3050: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
3060: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
3070: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
3080: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
3090: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
30a0: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
30b0: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
30c0: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
30d0: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
30e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
30f0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
3100: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
3110: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
3120: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
3130: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
3140: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
3150: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
3160: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
3170: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
3180: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
3190: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20  calls to.** the 
31a0: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
31b0: 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64  bleLock() proced
31c0: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
31d0: 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a  ee object p..**.
31e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
31f0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42 74   assumes that Bt
3200: 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65  ree p has an ope
3210: 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  n read or write 
3220: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
3230: 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c   If it does not,
3240: 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45   then the BTS_PE
3250: 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61  NDING flag.** ma
3260: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3270: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3280: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3290: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
32a0: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
32b0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
32c0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
32d0: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
32e0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
32f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
3300: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
3310: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
3320: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
3330: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3340: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3350: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3360: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3370: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3380: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3390: 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
33a0: 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49  gs & BTS_EXCLUSI
33b0: 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  VE)==0 || pBt->p
33c0: 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70  Writer==pLock->p
33d0: 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73  Btree );.    ass
33e0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  ert( pLock->pBtr
33f0: 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f  ee->inTrans>=pLo
3400: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck->eLock );.   
3410: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72   if( pLock->pBtr
3420: 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a  ee==p ){.      *
3430: 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e  ppIter = pLock->
3440: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73  pNext;.      ass
3450: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  ert( pLock->iTab
3460: 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d  le!=1 || pLock==
3470: 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20  &p->lock );.    
3480: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61    if( pLock->iTa
3490: 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ble!=1 ){.      
34a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
34b0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Lock);.      }. 
34c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34d0: 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d  ppIter = &pLock-
34e0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
34f0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  }..  assert( (pB
3500: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
3510: 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c  S_PENDING)==0 ||
3520: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b   pBt->pWriter );
3530: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3540: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42  ter==p ){.    pB
3550: 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a  t->pWriter = 0;.
3560: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
3570: 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55  s &= ~(BTS_EXCLU
3580: 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47  SIVE|BTS_PENDING
3590: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
35a0: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
35b0: 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==2 ){.    /* Th
35c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
35d0: 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65  alled when Btree
35e0: 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67   p is concluding
35f0: 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61   its .    ** tra
3600: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65  nsaction. If the
3610: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  re currently exi
3620: 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e  sts a writer, an
3630: 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  d p is not.    *
3640: 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74  * that writer, t
3650: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
3660: 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
3670: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
3680: 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68  r.    ** than th
3690: 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65  e writer must be
36a0: 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74   about to drop t
36b0: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
36c0: 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20  case.    ** set 
36d0: 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20  the BTS_PENDING 
36e0: 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a  flag to 0..    *
36f0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72  *.    ** If ther
3700: 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  e is not current
3710: 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65  ly a writer, the
3720: 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75  n BTS_PENDING mu
3730: 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72  st.    ** be zer
3740: 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68  o already. So th
3750: 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20  is next line is 
3760: 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74  harmless in that
3770: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
3780: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3790: 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b  &= ~BTS_PENDING;
37a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
37b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e  is function chan
37c0: 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f  ges all write-lo
37d0: 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72 65  cks held by Btre
37e0: 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f  e p into read-lo
37f0: 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  cks..*/.static v
3800: 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c  oid downgradeAll
3810: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
3820: 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b  Locks(Btree *p){
3830: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3840: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28   = p->pBt;.  if(
3850: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
3860: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3870: 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e  pLock;.    pBt->
3880: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3890: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
38a0: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
38b0: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
38c0: 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42      for(pLock=pB
38d0: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b  t->pLock; pLock;
38e0: 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e   pLock=pLock->pN
38f0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
3900: 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  rt( pLock->eLock
3910: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
3920: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3930: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  );.      pLock->
3940: 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
3950: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  K;.    }.  }.}..
3960: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3970: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3980: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
3990: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
39a0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
39b0: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
39c0: 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a  rence */../*.***
39d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
39e0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
39f0: 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20  f assert() only 
3a00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66  ****.**.** Verif
3a10: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
3a20: 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65  r holds the mute
3a30: 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65  x on its BtShare
3a40: 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d.*/.#ifdef SQLI
3a50: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
3a60: 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  int cursorHoldsM
3a70: 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70  utex(BtCursor *p
3a80: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
3a90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3aa0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ->pBt->mutex);.}
3ab0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
3ac0: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
3ad0: 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20  erflow cache of 
3ae0: 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65  the cursor passe
3af0: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
3b00: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74  rgument..** on t
3b10: 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  he shared btree 
3b20: 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a  structure pBt..*
3b30: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69  /.#define invali
3b40: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
3b50: 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63  e(pCur) (pCur->c
3b60: 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
3b70: 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a  _ValidOvfl)../*.
3b80: 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68  ** Invalidate th
3b90: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
3ba0: 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61  list cache for a
3bb0: 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
3bc0: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  d.** on the shar
3bd0: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
3be0: 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69  re pBt..*/.stati
3bf0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
3c00: 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
3c10: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
3c20: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3c30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3c40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
3c50: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  t->mutex) );.  f
3c60: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
3c70: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
3c80: 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
3c90: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
3ca0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
3cb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
3cc0: 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69  CRBLOB./*.** Thi
3cd0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
3ce0: 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69  lled before modi
3cf0: 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  fying the conten
3d00: 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a  ts of a table.**
3d10: 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
3d20: 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  ny incrblob curs
3d30: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65  ors that are ope
3d40: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20  n on the.** row 
3d50: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  or one of the ro
3d60: 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  ws being modifie
3d70: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  d..**.** If argu
3d80: 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c  ment isClearTabl
3d90: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
3da0: 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
3db0: 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61  nts of the.** ta
3dc0: 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ble is about to 
3dd0: 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  be deleted. In t
3de0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3df0: 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62  ate all incrblob
3e00: 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  .** cursors open
3e10: 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68   on any row with
3e20: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  in the table wit
3e30: 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f  h root-page pgno
3e40: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  Root..**.** Othe
3e50: 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65  rwise, if argume
3e60: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
3e70: 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74  is false, then t
3e80: 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72  he row with.** r
3e90: 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69  owid iRow is bei
3ea0: 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64  ng replaced or d
3eb0: 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20  eleted. In this 
3ec0: 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a  case invalidate.
3ed0: 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e  ** only those in
3ee0: 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f  crblob cursors o
3ef0: 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63  pen on that spec
3f00: 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  ific row..*/.sta
3f10: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
3f20: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
3f30: 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  rs(.  Btree *pBt
3f40: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ree,          /*
3f50: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
3f60: 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
3f70: 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20   i64 iRow,      
3f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3f90: 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74  rowid that might
3fa0: 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a   be changing */.
3fb0: 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62    int isClearTab
3fc0: 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  le        /* Tru
3fd0: 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72  e if all rows ar
3fe0: 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  e being deleted 
3ff0: 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  */.){.  BtCursor
4000: 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20   *p;.  BtShared 
4010: 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70  *pBt = pBtree->p
4020: 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
4030: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
4040: 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a  utex(pBtree) );.
4050: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
4060: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
4070: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ext){.    if( (p
4080: 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
4090: 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 0a 20  F_Incrblob)!=0. 
40a0: 20 20 20 20 26 26 20 28 69 73 43 6c 65 61 72 54      && (isClearT
40b0: 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e  able || p->info.
40c0: 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20  nKey==iRow).    
40d0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61  ){.      p->eSta
40e0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
40f0: 4c 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  LID;.    }.  }.}
4100: 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75  ..#else.  /* Stu
4110: 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20  b function when 
4120: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
4130: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
4140: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4150: 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a  lobCursors(x,y,z
4160: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
4170: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
4180: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62   */../*.** Set b
4190: 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42  it pgno of the B
41a0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
41b0: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
41c0: 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77   is called .** w
41d0: 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74 20  hen a page that 
41e0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61  previously conta
41f0: 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65  ined data become
4200: 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  s a free-list le
4210: 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a  af .** page..**.
4220: 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64 2e  ** The BtShared.
4230: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4240: 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72  ec exists to wor
4250: 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63  k around an obsc
4260: 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65  ure.** bug cause
4270: 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61 63  d by the interac
4280: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66  tion of two usef
4290: 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69  ul IO optimizati
42a0: 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a  ons surrounding.
42b0: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ** free-list lea
42c0: 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  f pages:.**.**  
42d0: 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74   1) When all dat
42e0: 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  a is deleted fro
42f0: 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68 65  m a page and the
4300: 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a   page becomes.**
4310: 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73        a free-lis
4320: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
4330: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69   page is not wri
4340: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
4350: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73  base.**      (as
4360: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4370: 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f  pages contain no
4380: 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61   meaningful data
4390: 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ). Sometimes.** 
43a0: 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67 65       such a page
43b0: 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75   is not even jou
43c0: 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77  rnalled (as it w
43d0: 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66  ill not be modif
43e0: 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79  ied,.**      why
43f0: 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c   bother journall
4400: 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ing it?)..**.** 
4410: 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65 65    2) When a free
4420: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4430: 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20 63  is reused, its c
4440: 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65  ontent is not re
4450: 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
4460: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
4470: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
4480: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79  ournal file (why
4490: 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20   should it.**   
44a0: 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73 20     be, if it is 
44b0: 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69  not at all meani
44c0: 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42  ngful?)..**.** B
44d0: 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68  y themselves, th
44e0: 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ese optimization
44f0: 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20  s work fine and 
4500: 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a  provide a handy.
4510: 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  ** performance b
4520: 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c  oost to bulk del
4530: 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70  ete or insert op
4540: 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65  erations. Howeve
4550: 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20  r, if.** a page 
4560: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
4570: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68  free-list and th
4580: 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69 6e  en reused within
4590: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61   the same.** tra
45a0: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62  nsaction, a prob
45b0: 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66  lem comes up. If
45c0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
45d0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
45e0: 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20  .** it is moved 
45f0: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
4600: 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20   and it is also 
4610: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
4620: 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74  hen it.** is ext
4630: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
4640: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65  free-list and re
4650: 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f  used, then the o
4660: 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20  riginal data.** 
4670: 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20  may be lost. In 
4680: 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
4690: 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20  ollback, it may 
46a0: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
46b0: 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
46c0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
46d0: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
46e0: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  guration..**.** 
46f0: 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
4700: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4710: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4720: 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67 65   Whenever a page
4730: 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f   is .** moved to
4740: 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c   become a free-l
4750: 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74  ist leaf page, t
4760: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
4770: 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69   bit is.** set i
4780: 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57 68  n the bitvec. Wh
4790: 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70 61  enever a leaf pa
47a0: 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ge is extracted 
47b0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
47c0: 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  st,.** optimizat
47d0: 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f  ion 2 above is o
47e0: 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63 6f  mitted if the co
47f0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4800: 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65  is already.** se
4810: 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48  t in BtShared.pH
4820: 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63  asContent. The c
4830: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
4840: 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72 65  itvec are cleare
4850: 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  d.** at the end 
4860: 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61 63  of every transac
4870: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
4880: 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73 43  int btreeSetHasC
4890: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
48a0: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
48b0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
48c0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
48d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
48e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
48f0: 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20  gno<=pBt->nPage 
4900: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61 73  );.    pBt->pHas
4910: 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65  Content = sqlite
4920: 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 42  3BitvecCreate(pB
4930: 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  t->nPage);.    i
4940: 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e  f( !pBt->pHasCon
4950: 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  tent ){.      rc
4960: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
4970: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4980: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4990: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
49a0: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
49b0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
49c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
49d0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
49e0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
49f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4a00: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4a10: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4a20: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4a30: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4a40: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4a50: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4a60: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4a70: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4a80: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4a90: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4aa0: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4ab0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4ac0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ad0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4ae0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4af0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4b00: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4b10: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4b20: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4b30: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4b40: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4b50: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4b60: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4b70: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4b80: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4b90: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4ba0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4bb0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4bc0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4bd0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4be0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4bf0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4c00: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4c10: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4c20: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
4c30: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4c40: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
4c50: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
4c60: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
4c70: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
4c80: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
4c90: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
4ca0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
4cb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
4cc0: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
4cd0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
4ce0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
4cf0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
4d00: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
4d10: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
4d20: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
4d30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
4d40: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
4d50: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
4d60: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
4d70: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
4d80: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
4d90: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
4da0: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  1;.}.../*.** Sav
4db0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
4dc0: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e  rsor position in
4dd0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42   the variables B
4de0: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a  tCursor.nKey .**
4df0: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b   and BtCursor.pK
4e00: 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73  ey. The cursor's
4e10: 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
4e20: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
4e30: 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  EEK..**.** The c
4e40: 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
4e50: 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
4e60: 72 20 69 73 20 76 61 6c 69 64 20 28 68 61 73 20  r is valid (has 
4e70: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
4e80: 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74  ALID).** prior t
4e90: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
4ea0: 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61  outine.  .*/.sta
4eb0: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
4ec0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
4ed0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
4ee0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
4ef0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
4f00: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
4f10: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
4f20: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
4f30: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
4f40: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
4f50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
4f60: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
4f70: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20  &pCur->nKey);.  
4f80: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
4f90: 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65 79  TE_OK );  /* Key
4fa0: 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61  Size() cannot fa
4fb0: 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  il */..  /* If t
4fc0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
4fd0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
4fe0: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
4ff0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
5000: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
5010: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
5020: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
5030: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
5040: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
5050: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
5060: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
5070: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
5080: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
5090: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
50a0: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
50b0: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
50c0: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
50d0: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
50e0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43 75   */.  if( 0==pCu
50f0: 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
5100: 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f 69 64  tKey ){.    void
5110: 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   *pKey = sqlite3
5120: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
5130: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
5140: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
5150: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
5160: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
5170: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
5180: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5190: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
51a0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
51b0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
51c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
51d0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
51e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
51f0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5200: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5210: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
5220: 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   !pCur->apPage[0
5230: 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  ]->intKey || !pC
5240: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
5250: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5260: 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c   ){.    btreeRel
5270: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5280: 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43  es(pCur);.    pC
5290: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
52a0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
52b0: 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61  .  }..  invalida
52c0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
52d0: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
52e0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
52f0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
5300: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
5310: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
5320: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
5330: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
5340: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
5350: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
5360: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
5370: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
5380: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5390: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
53a0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
53b0: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
53c0: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
53d0: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
53e0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
53f0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
5400: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
5410: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
5420: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
5430: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
5440: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
5450: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
5460: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
5470: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
5480: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
5490: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
54a0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
54b0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
54c0: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
54d0: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
54e0: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
54f0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
5500: 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f  n note:  This ro
5510: 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65  utine merely che
5520: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
5530: 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65  y cursors.** nee
5540: 64 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20  d to be saved.  
5550: 49 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20  It calls out to 
5560: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
5570: 74 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73  t() in the (unus
5580: 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68  ual).** event th
5590: 61 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69  at cursors are i
55a0: 6e 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20  n need to being 
55b0: 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  saved..*/.static
55c0: 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73   int saveAllCurs
55d0: 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
55e0: 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42  t, Pgno iRoot, B
55f0: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
5600: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
5610: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5620: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5630: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5640: 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d  assert( pExcept=
5650: 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70  =0 || pExcept->p
5660: 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72  Bt==pBt );.  for
5670: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
5680: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
5690: 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63  .    if( p!=pExc
56a0: 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74  ept && (0==iRoot
56b0: 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   || p->pgnoRoot=
56c0: 3d 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b  =iRoot) ) break;
56d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 20  .  }.  return p 
56e0: 3f 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  ? saveCursorsOnL
56f0: 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45  ist(p, iRoot, pE
5700: 78 63 65 70 74 29 20 3a 20 53 51 4c 49 54 45 5f  xcept) : SQLITE_
5710: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68  OK;.}../* This h
5720: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f  elper routine to
5730: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20   saveAllCursors 
5740: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20  does the actual 
5750: 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a  work of saving.*
5760: 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66  * the cursors if
5770: 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73   and when a curs
5780: 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  or is found that
5790: 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
57a0: 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68  es saving..** Th
57b0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73  e common case is
57c0: 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73   that no cursors
57d0: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
57e0: 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  d, so this routi
57f0: 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20  ne is.** broken 
5800: 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c  out from its cal
5810: 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ler to avoid unn
5820: 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70  ecessary stack p
5830: 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e  ointer movement.
5840: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
5850: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
5860: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5870: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c  (.  BtCursor *p,
5880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5890: 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61  first cursor tha
58a0: 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a  t needs saving *
58b0: 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  /.  Pgno iRoot, 
58c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
58d0: 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74   save cursor wit
58e0: 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61  h this iRoot. Sa
58f0: 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a  ve all if zero *
5900: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45  /.  BtCursor *pE
5910: 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e  xcept    /* Do n
5920: 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72  ot save this cur
5930: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a  sor */.){.  do{.
5940: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
5950: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
5960: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
5970: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
5980: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
5990: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
59a0: 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
59b0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
59c0: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  on(p);.        i
59d0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
59e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
59f0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
5a00: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
5a10: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
5a20: 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  ( p->iPage>0 );.
5a30: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c          btreeRel
5a40: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5a50: 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  es(p);.      }. 
5a60: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
5a70: 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28  pNext;.  }while(
5a80: 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53   p );.  return S
5a90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5aa0: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72  ** Clear the cur
5ab0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
5ac0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
5ad0: 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
5ae0: 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
5af0: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
5b00: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5b10: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
5b20: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
5b30: 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70  pKey);.  pCur->p
5b40: 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Key = 0;.  pCur-
5b50: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5b60: 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  _INVALID;.}../*.
5b70: 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69  ** In this versi
5b80: 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74  on of BtreeMovet
5b90: 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63  o, pKey is a pac
5ba0: 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ked index record
5bb0: 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67  .** such as is g
5bc0: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
5bd0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
5be0: 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68  code.  Unpack th
5bf0: 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20  e.** record and 
5c00: 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d  then call BtreeM
5c10: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
5c20: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a  to do the work..
5c30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
5c40: 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43  reeMoveto(.  BtC
5c50: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
5c60: 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20   /* Cursor open 
5c70: 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20  on the btree to 
5c80: 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  be searched */. 
5c90: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
5ca0: 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b  y,   /* Packed k
5cb0: 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20  ey if the btree 
5cc0: 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20  is an index */. 
5cd0: 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20   i64 nKey,      
5ce0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
5cf0: 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20  key for tables. 
5d00: 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f   Size of pKey fo
5d10: 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  r indices */.  i
5d20: 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20  nt bias,        
5d30: 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63     /* Bias searc
5d40: 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
5d50: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
5d60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
5d70: 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
5d80: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
5d90: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
5da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
5db0: 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55  atus code */.  U
5dc0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
5dd0: 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70  IdxKey;   /* Unp
5de0: 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
5df0: 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63 65  */.  char aSpace
5e00: 5b 32 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20  [200];          
5e10: 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f  /* Temp space fo
5e20: 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61  r pIdxKey - to a
5e30: 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f  void a malloc */
5e40: 0a 20 20 63 68 61 72 20 2a 70 46 72 65 65 20 3d  .  char *pFree =
5e50: 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20   0;..  if( pKey 
5e60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
5e70: 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e  Key==(i64)(int)n
5e80: 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b  Key );.    pIdxK
5e90: 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
5ea0: 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
5eb0: 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70 43 75  ord(.        pCu
5ec0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70  r->pKeyInfo, aSp
5ed0: 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61  ace, sizeof(aSpa
5ee0: 63 65 29 2c 20 26 70 46 72 65 65 0a 20 20 20 20  ce), &pFree.    
5ef0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
5f00: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
5f10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5f20: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
5f30: 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70  rdUnpack(pCur->p
5f40: 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b  KeyInfo, (int)nK
5f50: 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65  ey, pKey, pIdxKe
5f60: 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  y);.    if( pIdx
5f70: 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29  Key->nField==0 )
5f80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
5f90: 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  bFree(pCur->pKey
5fa0: 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29  Info->db, pFree)
5fb0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
5fc0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
5fd0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  PT;.    }.  }els
5fe0: 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  e{.    pIdxKey =
5ff0: 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   0;.  }.  rc = s
6000: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
6010: 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20  oUnpacked(pCur, 
6020: 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62  pIdxKey, nKey, b
6030: 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66  ias, pRes);.  if
6040: 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73  ( pFree ){.    s
6050: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75  qlite3DbFree(pCu
6060: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  r->pKeyInfo->db,
6070: 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72   pFree);.  }.  r
6080: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6090: 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  ** Restore the c
60a0: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73  ursor to the pos
60b0: 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20  ition it was in 
60c0: 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20  (or as close to 
60d0: 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20  as possible).** 
60e0: 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50  when saveCursorP
60f0: 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61  osition() was ca
6100: 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20  lled. Note that 
6110: 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65  this call delete
6120: 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20  s the .** saved 
6130: 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74  position info st
6140: 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73  ored by saveCurs
6150: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f  orPosition(), so
6160: 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
6170: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66   at most one eff
6180: 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75  ective restoreCu
6190: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63  rsorPosition() c
61a0: 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a  all after each .
61b0: 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  ** saveCursorPos
61c0: 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74  ition()..*/.stat
61d0: 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73 74  ic int btreeRest
61e0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
61f0: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
6200: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
6210: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
6220: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
6230: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
6240: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
6250: 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
6260: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
6270: 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
6280: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
6290: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
62a0: 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  }.  pCur->eState
62b0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
62c0: 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d  D;.  rc = btreeM
62d0: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
62e0: 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b  ->pKey, pCur->nK
62f0: 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b  ey, 0, &pCur->sk
6300: 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72  ipNext);.  if( r
6310: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6320: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6330: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
6340: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
6350: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
6360: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
6370: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
6380: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6390: 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  _INVALID );.    
63a0: 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
63b0: 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  xt && pCur->eSta
63c0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
63d0: 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
63e0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
63f0: 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a  SKIPNEXT;.    }.
6400: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6410: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
6420: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6430: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
6440: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
6450: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
6460: 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72       btreeRestor
6470: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6480: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
6490: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
64a0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
64b0: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
64c0: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
64d0: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
64e0: 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20  where.** it was 
64f0: 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20  last placed, or 
6500: 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64  has been invalid
6510: 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68  ated for any oth
6520: 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75  er reason..** Cu
6530: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
6540: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
6550: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74   are pointing at
6560: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a   is deleted out.
6570: 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ** from under th
6580: 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  em, for example.
6590: 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61    Cursor might a
65a0: 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74  lso move if a bt
65b0: 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61  ree.** is rebala
65c0: 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  nced..**.** Call
65d0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
65e0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72   with a NULL cur
65f0: 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75  sor pointer retu
6600: 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a  rns false..**.**
6610: 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74   Use the separat
6620: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
6630: 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f  rsorRestore() ro
6640: 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65  utine to restore
6650: 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63   a cursor.** bac
6660: 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75  k to where it ou
6670: 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69  ght to be if thi
6680: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
6690: 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s true..*/.int s
66a0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
66b0: 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73  rHasMoved(BtCurs
66c0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
66d0: 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65  urn pCur->eState
66e0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  !=CURSOR_VALID;.
66f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6700: 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61  utine restores a
6710: 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20   cursor back to 
6720: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73  its original pos
6730: 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a  ition after it.*
6740: 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64  * has been moved
6750: 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65   by some outside
6760: 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68 20   activity (such 
6770: 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61 6c  as a btree rebal
6780: 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77  ance or.** a row
6790: 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c   having been del
67a0: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
67b0: 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e  der the cursor).
67c0: 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63    .**.** On succ
67d0: 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65  ess, the *pDiffe
67e0: 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65  rentRow paramete
67f0: 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  r is false if th
6800: 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
6810: 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  .** pointing at 
6820: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
6830: 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e   row.  *pDiffern
6840: 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20  tRow is the row 
6850: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
6860: 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61  s pointing to ha
6870: 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20  s been deleted, 
6880: 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72 73  forcing the curs
6890: 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73  or to point to s
68a0: 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f  ome.** nearby ro
68b0: 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  w..**.** This ro
68c0: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
68d0: 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20  y be called for 
68e0: 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75  a cursor that ju
68f0: 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54  st returned.** T
6900: 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  RUE from sqlite3
6910: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
6920: 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ved()..*/.int sq
6930: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
6940: 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72  Restore(BtCursor
6950: 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69   *pCur, int *pDi
6960: 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69  fferentRow){.  i
6970: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
6980: 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61  ( pCur!=0 );.  a
6990: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
69a0: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
69b0: 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  D );.  rc = rest
69c0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
69d0: 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
69e0: 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  c ){.    *pDiffe
69f0: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20  rentRow = 1;.   
6a00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6a10: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
6a20: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
6a30: 20 7c 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e   || NEVER(pCur->
6a40: 73 6b 69 70 4e 65 78 74 21 3d 30 29 20 29 7b 0a  skipNext!=0) ){.
6a50: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
6a60: 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ow = 1;.  }else{
6a70: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
6a80: 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Row = 0;.  }.  r
6a90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6aa0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
6ab0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
6ac0: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
6ad0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
6ae0: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
6af0: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
6b00: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
6b10: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
6b20: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
6b30: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
6b40: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
6b50: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
6b60: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
6b70: 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61   (not a valid pa
6b80: 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20  ge) for pgno==1 
6b90: 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a  since there is.*
6ba0: 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70  * no pointer map
6bb0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6bc0: 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e   page 1.  The in
6bd0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f  tegrity_check lo
6be0: 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20  gic.** requires 
6bf0: 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e  that ptrmapPagen
6c00: 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74  o(*,1)!=1..*/.st
6c10: 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70  atic Pgno ptrmap
6c20: 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20  Pageno(BtShared 
6c30: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
6c40: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65  {.  int nPagesPe
6c50: 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f  rMapPage;.  Pgno
6c60: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
6c70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6c80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
6c90: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
6ca0: 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e   pgno<2 ) return
6cb0: 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d   0;.  nPagesPerM
6cc0: 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75  apPage = (pBt->u
6cd0: 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a  sableSize/5)+1;.
6ce0: 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e    iPtrMap = (pgn
6cf0: 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61  o-2)/nPagesPerMa
6d00: 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28  pPage;.  ret = (
6d10: 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65  iPtrMap*nPagesPe
6d20: 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a  rMapPage) + 2; .
6d30: 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49    if( ret==PENDI
6d40: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
6d50: 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a  ) ){.    ret++;.
6d60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
6d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
6d80: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
6d90: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
6da0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6db0: 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70  ne updates the p
6dc0: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
6dd0: 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
6de0: 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61   'key'.** so tha
6df0: 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70  t it maps to typ
6e00: 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61  e 'eType' and pa
6e10: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
6e20: 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49   'pgno'..**.** I
6e30: 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61  f *pRC is initia
6e40: 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f  lly non-zero (no
6e50: 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65  n-SQLITE_OK) the
6e60: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
6e70: 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  s.** a no-op.  I
6e80: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
6e90: 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  s, the appropria
6ea0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
6eb0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
6ec0: 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63   *pRC..*/.static
6ed0: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28   void ptrmapPut(
6ee0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
6ef0: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
6f00: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20  e, Pgno parent, 
6f10: 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50  int *pRC){.  DbP
6f20: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
6f30: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6f40: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
6f50: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
6f60: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6f70: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
6f80: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
6f90: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
6fa0: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
6fb0: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
6fc0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
6fd0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
6fe0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
6ff0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
7000: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  n code from subf
7010: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69  unctions */..  i
7020: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
7030: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
7040: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7050: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
7060: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
7070: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
7080: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
7090: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
70a0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
70b0: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
70c0: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
70d0: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
70e0: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
70f0: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
7100: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
7110: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  y==0 ){.    *pRC
7120: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7130: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
7140: 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61  rn;.  }.  iPtrma
7150: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
7160: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
7170: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
7180: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
7190: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
71a0: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
71b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
71c0: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
71d0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
71e0: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
71f0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
7200: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
7210: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
7220: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7230: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
7240: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
7250: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7260: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7270: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7280: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
7290: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
72a0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
72b0: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
72c0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
72d0: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
72e0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
72f0: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
7300: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
7310: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
7320: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
7330: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
7340: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
7350: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
7360: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
7370: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7380: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
7390: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
73a0: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
73b0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
73c0: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
73d0: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
73e0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
73f0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
7400: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
7410: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
7420: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
7430: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7440: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
7450: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
7460: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
7470: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
7480: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
7490: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
74a0: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
74b0: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
74c0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
74d0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
74e0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
74f0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
7500: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
7510: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
7520: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
7530: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
7540: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
7550: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
7560: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
7570: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7580: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
7590: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
75a0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
75b0: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
75c0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
75d0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
75e0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
75f0: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
7600: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
7610: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
7620: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
7630: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7640: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7650: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
7660: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
7670: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
7680: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
7690: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
76a0: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
76b0: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
76c0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
76d0: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
76e0: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
76f0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
7700: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
7710: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
7720: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
7730: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
7740: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
7750: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
7760: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
7770: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7780: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
7790: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
77a0: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
77b0: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
77c0: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
77d0: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
77e0: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
77f0: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
7800: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
7810: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
7820: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
7830: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
7840: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
7850: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
7860: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7870: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74  RUPT_BKPT;.  ret
7880: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7890: 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65  ..#else /* if de
78a0: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
78b0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
78c0: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
78d0: 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a  Put(w,x,y,z,rc).
78e0: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
78f0: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
7900: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
7910: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
7920: 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64  r(x, y, rc).#end
7930: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
7940: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
7950: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
7960: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
7970: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
7980: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
7990: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
79a0: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
79b0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
79c0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
79d0: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tent..**.** This
79e0: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f   routine works o
79f0: 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68  nly for pages th
7a00: 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  at do not contai
7a10: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
7a20: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e  ..*/.#define fin
7a30: 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28  dCell(P,I) \.  (
7a40: 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50  (P)->aData + ((P
7a50: 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  )->maskPage & ge
7a60: 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 43 65  t2byte(&(P)->aCe
7a70: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
7a80: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
7a90: 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b 28  v2(D,M,O,I) (D+(
7aa0: 4d 26 67 65 74 32 62 79 74 65 28 44 2b 28 4f 2b  M&get2byte(D+(O+
7ab0: 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a 2a  2*(I))))).../*.*
7ac0: 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f  * This a more co
7ad0: 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66  mplex version of
7ae0: 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74   findCell() that
7af0: 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61   works for.** pa
7b00: 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74  ges that do cont
7b10: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
7b20: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ls..*/.static u8
7b30: 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65   *findOverflowCe
7b40: 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
7b50: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
7b60: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
7b70: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7b80: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
7b90: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72  >mutex) );.  for
7ba0: 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  (i=pPage->nOverf
7bb0: 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  low-1; i>=0; i--
7bc0: 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  ){.    int k;.  
7bd0: 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e 61 69 4f    k = pPage->aiO
7be0: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  vfl[i];.    if( 
7bf0: 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k<=iCell ){.    
7c00: 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29    if( k==iCell )
7c10: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
7c20: 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 69   pPage->apOvfl[i
7c30: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
7c40: 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a   iCell--;.    }.
7c50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e    }.  return fin
7c60: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
7c70: 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ll);.}../*.** Pa
7c80: 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65  rse a cell conte
7c90: 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c  nt block and fil
7ca0: 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66  l in the CellInf
7cb0: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
7cc0: 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76  ere.** are two v
7cd0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
7ce0: 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65 65  function.  btree
7cf0: 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65  ParseCell() take
7d00: 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64  s a .** cell ind
7d10: 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ex as the second
7d20: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62 74   argument and bt
7d30: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7d40: 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f  ) .** takes a po
7d50: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64  inter to the bod
7d60: 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73  y of the cell as
7d70: 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75   its second argu
7d80: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
7d90: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
7da0: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
7db0: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
7dc0: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
7dd0: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
7de0: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
7e00: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
7e10: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
7e20: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
7e30: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
7e40: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
7e50: 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  /.){.  u8 *pIter
7e60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7e70: 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74  * For scanning t
7e80: 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a  hrough pCell */.
7e90: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
7ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7eb0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
7ec0: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
7ed0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7ee0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
7ef0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
7f00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
7f10: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
7f20: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
7f30: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
7f40: 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
7f50: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
7f60: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20  childPtrSize==0 
7f70: 29 3b 0a 20 20 20 20 70 49 74 65 72 20 3d 20 70  );.    pIter = p
7f80: 43 65 6c 6c 20 2b 20 67 65 74 56 61 72 69 6e 74  Cell + getVarint
7f90: 33 32 28 70 43 65 6c 6c 2c 20 6e 50 61 79 6c 6f  32(pCell, nPaylo
7fa0: 61 64 29 3b 0a 20 20 20 20 70 49 74 65 72 20 2b  ad);.    pIter +
7fb0: 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74 65  = getVarint(pIte
7fc0: 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  r, (u64*)&pInfo-
7fd0: 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 20  >nKey);.  }else 
7fe0: 69 66 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79  if( pPage->noPay
7ff0: 6c 6f 61 64 20 29 7b 0a 20 20 20 20 61 73 73 65  load ){.    asse
8000: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
8010: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
8020: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
8030: 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26   4 + getVarint(&
8040: 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29  pCell[4], (u64*)
8050: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
8060: 20 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f     pInfo->nPaylo
8070: 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e 66  ad = 0;.    pInf
8080: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20  o->nLocal = 0;. 
8090: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
80a0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e  low = 0;.    pIn
80b0: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30  fo->pPayload = 0
80c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
80d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
80e0: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
80f0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
8100: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
8110: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
8120: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70  nPayload);.    p
8130: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
8140: 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e  yload;.  }.  pIn
8150: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
8160: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
8170: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
8180: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
8190: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
81a0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
81b0: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
81c0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
81d0: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
81e0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
81f0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
8200: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
8210: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
8220: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
8230: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
8240: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
8250: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
8260: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
8270: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
8280: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
8290: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
82a0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
82b0: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
82c0: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
82d0: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
82e0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
82f0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
8300: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8310: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
8320: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
8330: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
8340: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
8350: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
8360: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
8370: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
8380: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
8390: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
83a0: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
83b0: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
83c0: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
83d0: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
83e0: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
83f0: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
8400: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
8410: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
8420: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
8430: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
8440: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
8450: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
8460: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
8470: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
8480: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
8490: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
84a0: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
84b0: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
84c0: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
84d0: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
84e0: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
84f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
8500: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
8510: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8520: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8530: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
8540: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
8550: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8560: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8570: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
8580: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
8590: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
85a0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
85b0: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
85c0: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
85d0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
85e0: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
85f0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
8600: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
8610: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
8620: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
8630: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
8640: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
8650: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
8660: 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ==maxLocal );.  
8670: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8680: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
8690: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
86a0: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
86b0: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
86c0: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
86d0: 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  plus;.    }else{
86e0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
86f0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
8700: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
8710: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8720: 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d   = (u16)(&pInfo-
8730: 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d  >pPayload[pInfo-
8740: 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c  >nLocal] - pCell
8750: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  );.    pInfo->nS
8760: 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76  ize = pInfo->iOv
8770: 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a  erflow + 4;.  }.
8780: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
8790: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
87a0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
87b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
87c0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
87d0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
87e0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
87f0: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
8800: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
8810: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
8820: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
8830: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
8840: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
8850: 7b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  {.  btreeParseCe
8860: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e  llPtr(pPage, fin
8870: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
8880: 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ll), pInfo);.}..
8890: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
88a0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
88b0: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
88c0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
88d0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
88e0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
88f0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
8900: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
8910: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
8920: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
8930: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
8940: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
8950: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
8960: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
8970: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
8980: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ter..*/.static u
8990: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d  16 cellSizePtr(M
89a0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
89b0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
89c0: 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b  *pIter = pCell +
89d0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
89e0: 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f  Size; /* For loo
89f0: 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20  ping over bytes 
8a00: 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  of pCell */.  u8
8a10: 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *pEnd;         
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
8a40: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
8a50: 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20  */.  u32 nSize; 
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8a80: 20 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72   Size value to r
8a90: 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66  eturn */..#ifdef
8aa0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
8ab0: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  /* The value ret
8ac0: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
8ad0: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c  nction should al
8ae0: 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65  ways be the same
8af0: 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65   as.  ** the (Ce
8b00: 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61  llInfo.nSize) va
8b10: 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69  lue found by doi
8b20: 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20  ng a full parse 
8b30: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  of the.  ** cell
8b40: 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55  . If SQLITE_DEBU
8b50: 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  G is defined, an
8b60: 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65   assert() at the
8b70: 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20   bottom of.  ** 
8b80: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65  this function ve
8b90: 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73  rifies that this
8ba0: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f   invariant is no
8bb0: 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20  t violated. */. 
8bc0: 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69   CellInfo debugi
8bd0: 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72 73  nfo;.  btreePars
8be0: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
8bf0: 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66  pCell, &debuginf
8c00: 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  o);.#endif..  if
8c10: 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f  ( pPage->noPaylo
8c20: 61 64 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d  ad ){.    pEnd =
8c30: 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20   &pIter[9];.    
8c40: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
8c50: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
8c60: 70 45 6e 64 20 29 3b 0a 20 20 20 20 61 73 73 65  pEnd );.    asse
8c70: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
8c80: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
8c90: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 28 70    return (u16)(p
8ca0: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
8cb0: 20 7d 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49   }.  nSize = *pI
8cc0: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
8cd0: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
8ce0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a  nd = &pIter[9];.
8cf0: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
8d00: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
8d10: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
8d20: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
8d30: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
8d40: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
8d50: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
8d60: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
8d70: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
8d80: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
8d90: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
8da0: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
8db0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
8dc0: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
8dd0: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
8de0: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
8df0: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
8e00: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
8e10: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
8e20: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
8e30: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
8e40: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
8e50: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
8e60: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
8e70: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
8e80: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
8e90: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
8ea0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
8eb0: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
8ec0: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
8ed0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
8ee0: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
8ef0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
8f00: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
8f10: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
8f20: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
8f30: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
8f40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
8f50: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
8f60: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
8f70: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
8f80: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
8f90: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
8fa0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
8fb0: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
8fc0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
8fd0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
8fe0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
8ff0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
9000: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
9010: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
9020: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
9030: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
9040: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
9050: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
9060: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
9070: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
9080: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
9090: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
90a0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
90b0: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64  6)nSize;.}..#ifd
90c0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
90d0: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
90e0: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
90f0: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
9100: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
9110: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
9120: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
9130: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
9140: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
9150: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65  ll){.  return ce
9160: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
9170: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
9180: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
9190: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
91a0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
91b0: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
91c0: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
91d0: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
91e0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
91f0: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
9200: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
9210: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
9220: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
9230: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
9240: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
9250: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
9260: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
9270: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
9280: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
9290: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
92a0: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
92b0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
92c0: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72  Cell!=0 );.  btr
92d0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
92e0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
92f0: 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
9300: 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
9310: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
9320: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
9330: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
9340: 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61     ptrmapPut(pPa
9350: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
9360: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
9370: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52   pPage->pgno, pR
9380: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
9390: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
93a0: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
93b0: 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61  en.  All Cells a
93c0: 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
93d0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  ** end of the pa
93e0: 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20  ge and all free 
93f0: 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74  space is collect
9400: 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62  ed into one.** b
9410: 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20  ig FreeBlk that 
9420: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
9430: 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  n the header and
9440: 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72   cell.** pointer
9450: 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63   array and the c
9460: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
9470: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9480: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d  defragmentPage(M
9490: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
94a0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94c0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
94d0: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94f0: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  Address of the i
9500: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
9510: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
9520: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
9530: 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  et to the page h
9540: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73  eader */.  int s
9550: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
9560: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
9570: 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74   a cell */.  int
9580: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
9590: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
95a0: 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65  r of usable byte
95b0: 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s on a page */. 
95c0: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
95e0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
95f0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
9600: 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20  */.  int cbrk;  
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
9630: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
9640: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ea */.  int nCel
9650: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
9660: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9670: 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
9680: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
9690: 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
96a0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61    /* The page da
96b0: 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ta */.  unsigned
96c0: 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20   char *temp;    
96d0: 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20     /* Temp area 
96e0: 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  for cell content
96f0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
9700: 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20  har *src;       
9710: 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f   /* Source of co
9720: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntent */.  int i
9730: 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20  CellFirst;      
9740: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
9750: 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e  llowable cell in
9760: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  dex */.  int iCe
9770: 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20  llLast;         
9780: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
9790: 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  ible cell index 
97a0: 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73  */...  assert( s
97b0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
97c0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
97d0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
97e0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
97f0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
9800: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
9810: 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f  eSize <= SQLITE_
9820: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
9830: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9840: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
9850: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
9860: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
9870: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
9880: 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b  ) );.  temp = 0;
9890: 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20  .  src = data = 
98a0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
98b0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
98c0: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
98d0: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
98e0: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
98f0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
9900: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
9910: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
9920: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75  a[hdr+3]) );.  u
9930: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
9940: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
9950: 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61  ze;.  cbrk = usa
9960: 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c  bleSize;.  iCell
9970: 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73  First = cellOffs
9980: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20  et + 2*nCell;.  
9990: 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62  iCellLast = usab
99a0: 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f  leSize - 4;.  fo
99b0: 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
99c0: 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41  i++){.    u8 *pA
99d0: 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ddr;     /* The 
99e0: 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65  i-th cell pointe
99f0: 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d  r */.    pAddr =
9a00: 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65   &data[cellOffse
9a10: 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63  t + i*2];.    pc
9a20: 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64   = get2byte(pAdd
9a30: 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  r);.    testcase
9a40: 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc==iCellFirst
9a50: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
9a60: 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20  ( pc==iCellLast 
9a70: 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  );.#if !defined(
9a80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
9a90: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
9aa0: 4b 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20  K).    /* These 
9ab0: 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20  conditions have 
9ac0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72  already been ver
9ad0: 69 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e  ified in btreeIn
9ae0: 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20  itPage().    ** 
9af0: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
9b00: 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43  _OVERSIZE_CELL_C
9b10: 48 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64 20  HECK is defined 
9b20: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
9b30: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
9b40: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
9b50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9b60: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9b70: 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  T;.    }.#endif.
9b80: 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d      assert( pc>=
9b90: 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63  iCellFirst && pc
9ba0: 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  <=iCellLast );. 
9bb0: 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69     size = cellSi
9bc0: 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 73 72  zePtr(pPage, &sr
9bd0: 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  c[pc]);.    cbrk
9be0: 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65   -= size;.#if de
9bf0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
9c00: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
9c10: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28  L_CHECK).    if(
9c20: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
9c30: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9c40: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9c50: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  BKPT;.    }.#els
9c60: 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  e.    if( cbrk<i
9c70: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
9c80: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
9c90: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9ca0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9cb0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  KPT;.    }.#endi
9cc0: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62  f.    assert( cb
9cd0: 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53  rk+size<=usableS
9ce0: 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65  ize && cbrk>=iCe
9cf0: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
9d00: 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69  estcase( cbrk+si
9d10: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
9d20: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
9d30: 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  pc+size==usableS
9d40: 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62  ize );.    put2b
9d50: 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29  yte(pAddr, cbrk)
9d60: 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d  ;.    if( temp==
9d70: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  0 ){.      int x
9d80: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62 72 6b  ;.      if( cbrk
9d90: 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==pc ) continue;
9da0: 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71  .      temp = sq
9db0: 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
9dc0: 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ace(pPage->pBt->
9dd0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78  pPager);.      x
9de0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9df0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20  a[hdr+5]);.     
9e00: 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d   memcpy(&temp[x]
9e10: 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72  , &data[x], (cbr
9e20: 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20  k+size) - x);.  
9e30: 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a      src = temp;.
9e40: 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
9e50: 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73  (&data[cbrk], &s
9e60: 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  rc[pc], size);. 
9e70: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72   }.  assert( cbr
9e80: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
9e90: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
9ea0: 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b  a[hdr+5], cbrk);
9eb0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d  .  data[hdr+1] =
9ec0: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32   0;.  data[hdr+2
9ed0: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
9ee0: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73  r+7] = 0;.  mems
9ef0: 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69  et(&data[iCellFi
9f00: 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43  rst], 0, cbrk-iC
9f10: 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73  ellFirst);.  ass
9f20: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
9f30: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
9f40: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
9f50: 20 20 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c    if( cbrk-iCell
9f60: 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46  First!=pPage->nF
9f70: 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ree ){.    retur
9f80: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9f90: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
9fa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
9fb0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74  ../*.** Search t
9fc0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20  he free-list on 
9fd0: 70 61 67 65 20 70 50 67 20 66 6f 72 20 73 70 61  page pPg for spa
9fe0: 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65  ce to store a ce
9ff0: 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20 69  ll nByte bytes i
a000: 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e  n.** size. If on
a010: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  e can be found, 
a020: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
a030: 20 74 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e   to the space an
a040: 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66  d remove it.** f
a050: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
a060: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73  t..**.** If no s
a070: 75 69 74 61 62 6c 65 20 73 70 61 63 65 20 63 61  uitable space ca
a080: 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68  n be found on th
a090: 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74  e free-list, ret
a0a0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
a0b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
a0c0: 79 20 64 65 74 65 63 74 20 63 6f 72 72 75 70 74  y detect corrupt
a0d0: 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20  ion within pPg. 
a0e0: 49 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 61  If it does and a
a0f0: 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 70 52 63 20  rgument .** pRc 
a100: 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
a110: 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f  n *pRc is set to
a120: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
a130: 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  and NULL is retu
a140: 72 6e 65 64 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  rned..** Or, if 
a150: 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
a160: 74 65 63 74 65 64 20 62 79 20 70 52 63 20 69 73  tected by pRc is
a170: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 20 69 73 20 72   NULL, NULL is r
a180: 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 0a  eturned and the.
a190: 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 67 6f  ** corruption go
a1a0: 65 73 20 75 6e 72 65 70 6f 72 74 65 64 2e 0a 2a  es unreported..*
a1b0: 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67  /.static u8 *pag
a1c0: 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67  eFindSlot(MemPag
a1d0: 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74  e *pPg, int nByt
a1e0: 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20  e, int *pRc){.  
a1f0: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
a200: 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  pPg->hdrOffset;.
a210: 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
a220: 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
a230: 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20  .  int iAddr;.  
a240: 69 6e 74 20 70 63 3b 0a 20 20 69 6e 74 20 75 73  int pc;.  int us
a250: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ableSize = pPg->
a260: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
a270: 0a 0a 20 20 66 6f 72 28 69 41 64 64 72 3d 68 64  ..  for(iAddr=hd
a280: 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62  r+1; (pc = get2b
a290: 79 74 65 28 26 61 44 61 74 61 5b 69 41 64 64 72  yte(&aData[iAddr
a2a0: 5d 29 29 3e 30 3b 20 69 41 64 64 72 3d 70 63 29  ]))>0; iAddr=pc)
a2b0: 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20  {.    int size; 
a2c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
a2d0: 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73  ze of the free s
a2e0: 6c 6f 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  lot */.    if( p
a2f0: 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c  c>usableSize-4 |
a300: 7c 20 70 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a  | pc<iAddr+4 ){.
a310: 20 20 20 20 20 20 69 66 28 20 70 52 63 20 29 20        if( pRc ) 
a320: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
a330: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a340: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
a350: 7d 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74  }.    size = get
a360: 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b  2byte(&aData[pc+
a370: 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 73 69 7a  2]);.    if( siz
a380: 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  e>=nByte ){.    
a390: 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d    int x = size -
a3a0: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 74 65   nByte;.      te
a3b0: 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a  stcase( x==4 );.
a3c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a3d0: 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66  x==3 );.      if
a3e0: 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ( x<4 ){.       
a3f0: 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37   if( aData[hdr+7
a400: 5d 3e 3d 36 30 20 29 20 72 65 74 75 72 6e 20 30  ]>=60 ) return 0
a410: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  ;.        /* Rem
a420: 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f  ove the slot fro
a430: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
a440: 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62   Update the numb
a450: 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  er of.        **
a460: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
a470: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
a480: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65  e. */.        me
a490: 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41 64 64  mcpy(&aData[iAdd
a4a0: 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20  r], &aData[pc], 
a4b0: 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74  2);.        aDat
a4c0: 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29  a[hdr+7] += (u8)
a4d0: 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  x;.      }else i
a4e0: 66 28 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61  f( size+pc > usa
a4f0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
a500: 20 20 20 69 66 28 20 70 52 63 20 29 20 2a 70 52     if( pRc ) *pR
a510: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
a520: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
a530: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
a540: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a550: 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61  /* The slot rema
a560: 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ins on the free-
a570: 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73  list. Reduce its
a580: 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74   size to account
a590: 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72  .         ** for
a5a0: 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65   the portion use
a5b0: 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c  d by the new all
a5c0: 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ocation. */.    
a5d0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 61 44      put2byte(&aD
a5e0: 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20  ata[pc+2], x);. 
a5f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
a600: 75 72 6e 20 26 61 44 61 74 61 5b 70 63 20 2b 20  urn &aData[pc + 
a610: 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  x];.    }.  }.. 
a620: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
a630: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79  .** Allocate nBy
a640: 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  te bytes of spac
a650: 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  e from within th
a660: 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61  e B-Tree page pa
a670: 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
a680: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57  irst argument. W
a690: 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20  rite into *pIdx 
a6a0: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70  the index into p
a6b0: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a  Page->aData[].**
a6c0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79   of the first by
a6d0: 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20  te of allocated 
a6e0: 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69  space. Return ei
a6f0: 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  ther SQLITE_OK o
a700: 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f  r.** an error co
a710: 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49  de (usually SQLI
a720: 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a  TE_CORRUPT)..**.
a730: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75  ** The caller gu
a740: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
a750: 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e  ere is sufficien
a760: 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20  t space to make 
a770: 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  the.** allocatio
a780: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
a790: 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64   might need to d
a7a0: 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64  efragment in ord
a7b0: 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61  er to bring.** a
a7c0: 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67  ll the space tog
a7d0: 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20  ether, however. 
a7e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
a7f0: 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a  ll avoid using.*
a800: 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20  * the first two 
a810: 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63  bytes past the c
a820: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61  ell pointer area
a830: 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c   since presumabl
a840: 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61  y this.** alloca
a850: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61  tion is being ma
a860: 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  de in order to i
a870: 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
a880: 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20  , so we will.** 
a890: 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64  also end up need
a8a0: 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70  ing a new cell p
a8b0: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
a8c0: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70  c int allocateSp
a8d0: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
a8e0: 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  ge, int nByte, i
a8f0: 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e  nt *pIdx){.  con
a900: 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  st int hdr = pPa
a910: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ge->hdrOffset;  
a920: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
a930: 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66   of pPage->hdrOf
a940: 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63  fset */.  u8 * c
a950: 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67  onst data = pPag
a960: 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f  e->aData;      /
a970: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
a980: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
a990: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
a9c0: 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f   byte of cell co
a9d0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
a9e0: 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20  int gap;        
a9f0: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
aa00: 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c   gap between cel
aa10: 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63  l pointers and c
aa20: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
aa30: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
aa40: 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75   /* Integer retu
aa50: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
aa60: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20   usableSize; /* 
aa70: 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 74  Usable size of t
aa80: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a 20 20  he page */.  .  
aa90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
aaa0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
aab0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
aac0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
aad0: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
aae0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
aaf0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
ab00: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
ab10: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
ab20: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
ab30: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
ab40: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
ab50: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
ab60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
ab70: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
ab80: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
ab90: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
aba0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73  sableSize;.  ass
abb0: 65 72 74 28 20 6e 42 79 74 65 20 3c 20 75 73 61  ert( nByte < usa
abc0: 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20 20  bleSize-8 );..  
abd0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
abe0: 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72  ellOffset == hdr
abf0: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
ac00: 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d  >leaf );.  gap =
ac10: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
ac20: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
ac30: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67  ell;.  assert( g
ac40: 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 74  ap<=65536 );.  t
ac50: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
ac60: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69  ata[hdr+5]);.  i
ac70: 66 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20  f( gap>top ){.  
ac80: 20 20 69 66 28 20 74 6f 70 3d 3d 30 20 29 7b 0a    if( top==0 ){.
ac90: 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33        top = 6553
aca0: 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  6;.    }else{.  
acb0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
acc0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
acd0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
ace0: 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  If there is enou
acf0: 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65 6e  gh space between
ad00: 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72   gap and top for
ad10: 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70   one more cell p
ad20: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61  ointer.  ** arra
ad30: 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20  y entry offset, 
ad40: 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c  and if the freel
ad50: 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ist is not empty
ad60: 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68  , then search th
ad70: 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20  e.  ** freelist 
ad80: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72  looking for a fr
ad90: 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75  ee slot big enou
ada0: 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  gh to satisfy th
adb0: 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a  e request..  */.
adc0: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
add0: 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74  2==top );.  test
ade0: 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70  case( gap+1==top
adf0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
ae00: 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66  gap==top );.  if
ae10: 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 26 26 20  ( gap+2<=top && 
ae20: 28 64 61 74 61 5b 68 64 72 2b 31 5d 20 7c 7c 20  (data[hdr+1] || 
ae30: 64 61 74 61 5b 68 64 72 2b 32 5d 29 20 29 7b 0a  data[hdr+2]) ){.
ae40: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
ae50: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 75 38 20 2a  ITE_OK;.    u8 *
ae60: 70 53 70 61 63 65 20 3d 20 70 61 67 65 46 69 6e  pSpace = pageFin
ae70: 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42 79  dSlot(pPage, nBy
ae80: 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66  te, &rc);.    if
ae90: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
aea0: 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65  ;.    if( pSpace
aeb0: 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   ){.      *pIdx 
aec0: 3d 20 70 53 70 61 63 65 20 2d 20 64 61 74 61 3b  = pSpace - data;
aed0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
aee0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
aef0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71   }..  /* The req
af00: 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62  uest could not b
af10: 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e  e fulfilled usin
af20: 67 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f  g a freelist slo
af30: 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74  t.  Check.  ** t
af40: 6f 20 73 65 65 20 69 66 20 64 65 66 72 61 67 6d  o see if defragm
af50: 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65  entation is nece
af60: 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65  ssary..  */.  te
af70: 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42  stcase( gap+2+nB
af80: 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66  yte==top );.  if
af90: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f  ( gap+2+nByte>to
afa0: 70 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73  p ){.    testcas
afb0: 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  e( pPage->nCell=
afc0: 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64  =0 );.    rc = d
afd0: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
afe0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
aff0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
b000: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
b010: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
b020: 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  r+5]);.    asser
b030: 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f  t( gap+nByte<=to
b040: 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  p );.  }...  /* 
b050: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
b060: 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20  from the gap in 
b070: 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c  between the cell
b080: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20   pointer array. 
b090: 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c   ** and the cell
b0a0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20   content area.  
b0b0: 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61 67  The btreeInitPag
b0c0: 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72  e() call has alr
b0d0: 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61  eady.  ** valida
b0e0: 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73 74  ted the freelist
b0f0: 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74 68  .  Given that th
b100: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76 61  e freelist is va
b110: 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20  lid, there.  ** 
b120: 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74  is no way that t
b130: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61  he allocation ca
b140: 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65  n extend off the
b150: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
b160: 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72  ..  ** The asser
b170: 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69  t() below verifi
b180: 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  es the previous 
b190: 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  sentence..  */. 
b1a0: 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20   top -= nByte;. 
b1b0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
b1c0: 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20  hdr+5], top);.  
b1d0: 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74  assert( top+nByt
b1e0: 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  e <= (int)pPage-
b1f0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
b200: 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f   );.  *pIdx = to
b210: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
b220: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b230: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
b240: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
b250: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
b260: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
b270: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
b280: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
b290: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53   pPage->aData[iS
b2a0: 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65  tart].** and the
b2b0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
b2c0: 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74 65  ck is iSize byte
b2d0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e  s..**.** Adjacen
b2e0: 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65  t freeblocks are
b2f0: 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a   coalesced..**.*
b300: 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e  * Note that even
b310: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
b320: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
b330: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49  hecked by btreeI
b340: 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68  nitPage(),.** th
b350: 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  at routine will 
b360: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
b370: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73  ap between cells
b380: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   or freeblocks. 
b390: 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20   Nor.** does it 
b3a0: 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20  detect cells or 
b3b0: 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20  freeblocks that 
b3c0: 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68  encrouch into th
b3d0: 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  e reserved bytes
b3e0: 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
b3f0: 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20  f the page.  So 
b400: 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  do additional co
b410: 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20  rruption checks 
b420: 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72  inside this.** r
b430: 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72  outine and retur
b440: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b450: 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73   if any problems
b460: 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   are found..*/.s
b470: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
b480: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
b490: 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20  ge, u16 iStart, 
b4a0: 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31  u16 iSize){.  u1
b4b0: 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20  6 iPtr;         
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4d0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
b4e0: 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72  f ptr to next fr
b4f0: 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36  eeblock */.  u16
b500: 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20   iFreeBlk;      
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b520: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
b530: 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c   the next freebl
b540: 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b  ock */.  u8 hdr;
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b570: 2a 20 50 61 67 65 20 68 65 61 64 65 72 20 73 69  * Page header si
b580: 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f  ze.  0 or 100 */
b590: 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b  .  u8 nFrag = 0;
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75           /* Redu
b5c0: 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e  ction in fragmen
b5d0: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20  tation */.  u16 
b5e0: 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a  iOrigSize = iSiz
b5f0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
b600: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
b610: 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a  lue of iSize */.
b620: 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50    u32 iLast = pP
b630: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
b640: 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65  Size-4; /* Large
b650: 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65  st possible free
b660: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
b670: 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74    u32 iEnd = iSt
b680: 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20  art + iSize;    
b690: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
b6a0: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69   byte past the i
b6b0: 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a  Start buffer */.
b6c0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
b6d0: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
b6e0: 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20  Data;   /* Page 
b6f0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
b700: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
b710: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
b720: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
b730: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
b740: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b750: 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 70 50  sert( iStart>=pP
b760: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
b770: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
b780: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
b790: 28 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d  ( iEnd <= pPage-
b7a0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
b7b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
b7c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b7d0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b7e0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
b7f0: 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f   iSize>=4 );   /
b800: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
b810: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73  ize is 4 */.  as
b820: 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c  sert( iStart<=iL
b830: 61 73 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65  ast );..  /* Ove
b840: 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
b850: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
b860: 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73  zeros when the s
b870: 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a  ecure_delete.  *
b880: 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  * option is enab
b890: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  led */.  if( pPa
b8a0: 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67  ge->pBt->btsFlag
b8b0: 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
b8c0: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ELETE ){.    mem
b8d0: 73 65 74 28 26 64 61 74 61 5b 69 53 74 61 72 74  set(&data[iStart
b8e0: 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20  ], 0, iSize);.  
b8f0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74  }..  /* The list
b900: 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d   of freeblocks m
b910: 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64  ust be in ascend
b920: 69 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64  ing order.  Find
b930: 20 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20   the .  ** spot 
b940: 6f 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65 72  on the list wher
b950: 65 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20  e iStart should 
b960: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a  be inserted..  *
b970: 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  /.  hdr = pPage-
b980: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50  >hdrOffset;.  iP
b990: 74 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  tr = hdr + 1;.  
b9a0: 69 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d  if( data[iPtr+1]
b9b0: 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74 72  ==0 && data[iPtr
b9c0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65  ]==0 ){.    iFre
b9d0: 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68  eBlk = 0;  /* Sh
b9e0: 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63  ortcut for the c
b9f0: 61 73 65 20 77 68 65 6e 20 74 68 65 20 66 72 65  ase when the fre
ba00: 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a  elist is empty *
ba10: 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  /.  }else{.    w
ba20: 68 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20  hile( (iFreeBlk 
ba30: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ba40: 5b 69 50 74 72 5d 29 29 3e 30 20 26 26 20 69 46  [iPtr]))>0 && iF
ba50: 72 65 65 42 6c 6b 3c 69 53 74 61 72 74 20 29 7b  reeBlk<iStart ){
ba60: 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65  .      if( iFree
ba70: 42 6c 6b 3c 69 50 74 72 2b 34 20 29 20 72 65 74  Blk<iPtr+4 ) ret
ba80: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ba90: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69  PT_BKPT;.      i
baa0: 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a  Ptr = iFreeBlk;.
bab0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46      }.    if( iF
bac0: 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72  reeBlk>iLast ) r
bad0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
bae0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61  RUPT_BKPT;.    a
baf0: 73 73 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e  ssert( iFreeBlk>
bb00: 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b  iPtr || iFreeBlk
bb10: 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  ==0 );.  .    /*
bb20: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a   At this point:.
bb30: 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42      **    iFreeB
bb40: 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72 65 65  lk:   First free
bb50: 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61  block after iSta
bb60: 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e  rt, or zero if n
bb70: 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50  one.    **    iP
bb80: 74 72 3a 20 20 20 20 20 20 20 54 68 65 20 61 64  tr:       The ad
bb90: 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74  dress of a point
bba0: 65 72 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20  er iFreeBlk.    
bbb0: 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  **.    ** Check 
bbc0: 74 6f 20 73 65 65 20 69 66 20 69 46 72 65 65 42  to see if iFreeB
bbd0: 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61  lk should be coa
bbe0: 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20  lesced onto the 
bbf0: 65 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20  end of iStart.. 
bc00: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46     */.    if( iF
bc10: 72 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33  reeBlk && iEnd+3
bc20: 3e 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20  >=iFreeBlk ){.  
bc30: 20 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65      nFrag = iFre
bc40: 65 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20  eBlk - iEnd;.   
bc50: 20 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65     if( iEnd>iFre
bc60: 65 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51  eBlk ) return SQ
bc70: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bc80: 54 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20  T;.      iEnd = 
bc90: 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62  iFreeBlk + get2b
bca0: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 42  yte(&data[iFreeB
bcb0: 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 53  lk+2]);.      iS
bcc0: 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74  ize = iEnd - iSt
bcd0: 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65  art;.      iFree
bce0: 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  Blk = get2byte(&
bcf0: 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b  data[iFreeBlk]);
bd00: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
bd10: 20 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74   If iPtr is anot
bd20: 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74  her freeblock (t
bd30: 68 61 74 20 69 73 2c 20 69 66 20 69 50 74 72 20  hat is, if iPtr 
bd40: 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c  is not the freel
bd50: 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  ist.    ** point
bd60: 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 20 68  er in the page h
bd70: 65 61 64 65 72 29 20 74 68 65 6e 20 63 68 65 63  eader) then chec
bd80: 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61  k to see if iSta
bd90: 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20  rt should be.   
bda0: 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e   ** coalesced on
bdb0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50  to the end of iP
bdc0: 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  tr..    */.    i
bdd0: 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b  f( iPtr>hdr+1 ){
bde0: 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74 72 45  .      int iPtrE
bdf0: 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32  nd = iPtr + get2
be00: 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b  byte(&data[iPtr+
be10: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
be20: 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74  PtrEnd+3>=iStart
be30: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
be40: 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29  iPtrEnd>iStart )
be50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
be60: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
be70: 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53       nFrag += iS
be80: 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a  tart - iPtrEnd;.
be90: 20 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20          iSize = 
bea0: 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20  iEnd - iPtr;.   
beb0: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 50       iStart = iP
bec0: 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  tr;.      }.    
bed0: 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e  }.    if( nFrag>
bee0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65  data[hdr+7] ) re
bef0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
bf00: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64 61  UPT_BKPT;.    da
bf10: 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72  ta[hdr+7] -= nFr
bf20: 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53  ag;.  }.  if( iS
bf30: 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26  tart==get2byte(&
bf40: 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a  data[hdr+5]) ){.
bf50: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66      /* The new f
bf60: 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74  reeblock is at t
bf70: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
bf80: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
bf90: 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f   area,.    ** so
bfa0: 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68 65   just extend the
bfb0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
bfc0: 65 61 20 72 61 74 68 65 72 20 74 68 61 6e 20 63  ea rather than c
bfd0: 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20  reate another.  
bfe0: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e    ** freelist en
bff0: 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  try */.    if( i
c000: 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74  Ptr!=hdr+1 ) ret
c010: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c020: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75 74  PT_BKPT;.    put
c030: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
c040: 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  1], iFreeBlk);. 
c050: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
c060: 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b  a[hdr+5], iEnd);
c070: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
c080: 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
c090: 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74  freeblock into t
c0a0: 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
c0b0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
c0c0: 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29  a[iPtr], iStart)
c0d0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
c0e0: 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46  data[iStart], iF
c0f0: 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74  reeBlk);.    put
c100: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
c110: 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20  rt+2], iSize);. 
c120: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65   }.  pPage->nFre
c130: 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a  e += iOrigSize;.
c140: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c150: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  OK;.}../*.** Dec
c160: 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ode the flags by
c170: 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79  te (the first by
c180: 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
c190: 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  ) for a page.** 
c1a0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66  and initialize f
c1b0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d  ields of the Mem
c1c0: 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61  Page structure a
c1d0: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a  ccordingly..**.*
c1e0: 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  * Only the follo
c1f0: 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
c200: 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e  s are supported.
c210: 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65    Anything diffe
c220: 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65  rent.** indicate
c230: 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  s a corrupt data
c240: 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a  base files:.**.*
c250: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
c260: 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20  RODATA.**       
c270: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c    PTF_ZERODATA |
c280: 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20   PTF_LEAF.**    
c290: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
c2a0: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a  A | PTF_INTKEY.*
c2b0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
c2c0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
c2d0: 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  KEY | PTF_LEAF.*
c2e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63  /.static int dec
c2f0: 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
c300: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
c310: 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
c320: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
c330: 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
c340: 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
c350: 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
c360: 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
c370: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
c380: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c390: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c3a0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
c3b0: 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c  x) );.  pPage->l
c3c0: 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42  eaf = (u8)(flagB
c3d0: 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74  yte>>3);  assert
c3e0: 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c  ( PTF_LEAF == 1<
c3f0: 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65  <3 );.  flagByte
c400: 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20   &= ~PTF_LEAF;. 
c410: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
c420: 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65  Size = 4-4*pPage
c430: 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20  ->leaf;.  pBt = 
c440: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66  pPage->pBt;.  if
c450: 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46  ( flagByte==(PTF
c460: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
c470: 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70  INTKEY) ){.    p
c480: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31  Page->intKey = 1
c490: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
c4a0: 4b 65 79 4c 65 61 66 20 3d 20 70 50 61 67 65 2d  KeyLeaf = pPage-
c4b0: 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  >leaf;.    pPage
c4c0: 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 21 70  ->noPayload = !p
c4d0: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
c4e0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
c4f0: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
c500: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
c510: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
c520: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
c530: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
c540: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  RODATA ){.    pP
c550: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b  age->intKey = 0;
c560: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
c570: 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  eyLeaf = 0;.    
c580: 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64  pPage->noPayload
c590: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 0;.    pPage-
c5a0: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
c5b0: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70  >maxLocal;.    p
c5c0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
c5d0: 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a   pBt->minLocal;.
c5e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
c5f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c600: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70  PT_BKPT;.  }.  p
c610: 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
c620: 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78  yload = pBt->max
c630: 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20  1bytePayload;.  
c640: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c650: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
c660: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
c670: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
c680: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
c690: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
c6a0: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
c6b0: 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20  ess.  If we see 
c6c0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f  that the page do
c6d0: 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
c6e0: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
c6f0: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74  database page, t
c700: 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  hen return .** S
c710: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20  QLITE_CORRUPT.  
c720: 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75  Note that a retu
c730: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20  rn of SQLITE_OK 
c740: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72  does not.** guar
c750: 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70  antee that the p
c760: 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d  age is well-form
c770: 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f  ed.  It only sho
c780: 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61  ws that.** we fa
c790: 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61  iled to detect a
c7a0: 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  ny corruption..*
c7b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
c7c0: 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61  eeInitPage(MemPa
c7d0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61  ge *pPage){..  a
c7e0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
c7f0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
c800: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
c810: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
c820: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
c830: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
c840: 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
c850: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
c860: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
c870: 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
c880: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
c890: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
c8a0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
c8b0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
c8c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
c8d0: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
c8e0: 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  age) );..  if( !
c8f0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
c900: 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20 20 20  .    u16 pc;    
c910: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
c920: 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
c930: 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
c940: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75  aData[] */.    u
c950: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
c960: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
c970: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
c980: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
c990: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
c9a0: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
c9b0: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
c9c0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
c9d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
c9e0: 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74  ain btree struct
c9f0: 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75  ure */.    int u
ca00: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
ca10: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
ca20: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
ca30: 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  page */.    u16 
ca40: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
ca50: 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74  * Offset from st
ca60: 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66  art of page to f
ca70: 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
ca80: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72  r */.    int nFr
ca90: 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ee;         /* N
caa0: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
cab0: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
cac0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70  e */.    int top
cad0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
cae0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
caf0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
cb00: 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  ea */.    int iC
cb10: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ellFirst;    /* 
cb20: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
cb30: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
cb40: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  k offset */.    
cb50: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
cb60: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
cb70: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
cb80: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
cb90: 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65  .    pBt = pPage
cba0: 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20  ->pBt;..    hdr 
cbb0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
cbc0: 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70  et;.    data = p
cbd0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
cbe0: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
cbf0: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
cc00: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
cc10: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
cc20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
cc30: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
cc40: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
cc50: 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70  <=65536 );.    p
cc60: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
cc70: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
cc80: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70  Size - 1);.    p
cc90: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
cca0: 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  = 0;.    usableS
ccb0: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
ccc0: 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  eSize;.    pPage
ccd0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63  ->cellOffset = c
cce0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20  ellOffset = hdr 
ccf0: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
cd00: 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  leaf;.    pPage-
cd10: 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74  >aDataEnd = &dat
cd20: 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  a[usableSize];. 
cd30: 20 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49     pPage->aCellI
cd40: 64 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dx = &data[cellO
cd50: 66 66 73 65 74 5d 3b 0a 20 20 20 20 74 6f 70 20  ffset];.    top 
cd60: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
cd70: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
cd80: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
cd90: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
cda0: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
cdb0: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
cdc0: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
cdd0: 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  .      /* To man
cde0: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
cdf0: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
ce00: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
ce10: 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  rupt */.      re
ce20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
ce30: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
ce40: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
ce50: 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
ce60: 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  ELL(pBt) );..   
ce70: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
ce80: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
ce90: 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
cea0: 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
ceb0: 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65  d.    ** of page
cec0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
ced0: 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  cell.  .    **. 
cee0: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
cef0: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ing block of cod
cf00: 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74  e checks early t
cf10: 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20  o see if a cell 
cf20: 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70  extends.    ** p
cf30: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
cf40: 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
cf50: 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
cf60: 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
cf70: 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20      ** returned 
cf80: 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20  if it does..    
cf90: 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73  */.    iCellFirs
cfa0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
cfb0: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
cfc0: 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  .    iCellLast =
cfd0: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
cfe0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
cff0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
d000: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
d010: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
d020: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
d030: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
d040: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
d050: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
d060: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
d070: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
d080: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
d090: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
d0a0: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
d0b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
d0c0: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
d0d0: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
d0e0: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
d0f0: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
d100: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
d110: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
d120: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
d130: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
d140: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
d150: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
d160: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
d170: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
d180: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d190: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
d1a0: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
d1b0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
d1c0: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
d1d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
d1e0: 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
d1f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
d200: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
d210: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
d220: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d230: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
d240: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
d250: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
d260: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
d270: 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66  ;.    }  .#endif
d280: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
d290: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
d2a0: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
d2b0: 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65  e */.    pc = ge
d2c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
d2d0: 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  +1]);.    nFree 
d2e0: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
d2f0: 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  top;.    while( 
d300: 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31  pc>0 ){.      u1
d310: 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  6 next, size;.  
d320: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
d330: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
d340: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
d350: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65   /* Start of fre
d360: 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  e block is off t
d370: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  he page */.     
d380: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d390: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
d3a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
d3b0: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
d3c0: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
d3d0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
d3e0: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
d3f0: 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20      if( (next>0 
d400: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
d410: 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  +3) || pc+size>u
d420: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
d430: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
d440: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
d450: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
d460: 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74  And the last byt
d470: 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
d480: 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d  the free-block m
d490: 75 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64  ust lie on the d
d4a0: 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a  atabase page.  *
d4b0: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
d4c0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d4d0: 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
d4e0: 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72       nFree = nFr
d4f0: 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20  ee + size;.     
d500: 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20   pc = next;.    
d510: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
d520: 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63  s point, nFree c
d530: 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20  ontains the sum 
d540: 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  of the offset to
d550: 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a   the start.    *
d560: 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  * of the cell-co
d570: 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20  ntent area plus 
d580: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
d590: 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a  ee bytes within.
d5a0: 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d      ** the cell-
d5b0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66  content area. If
d5c0: 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72   this is greater
d5d0: 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65   than the usable
d5e0: 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20  -size.    ** of 
d5f0: 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74  the page, then t
d600: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
d610: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
d620: 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a  check also.    *
d630: 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69  * serves to veri
d640: 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73  fy that the offs
d650: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  et to the start 
d660: 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
d670: 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c  ent.    ** area,
d680: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
d690: 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c  e page header, l
d6a0: 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  ies within the p
d6b0: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
d6c0: 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65  if( nFree>usable
d6d0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
d6e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d6f0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
d700: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
d710: 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20  e = (u16)(nFree 
d720: 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  - iCellFirst);. 
d730: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
d740: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
d750: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d760: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20  ./*.** Set up a 
d770: 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74  raw page so that
d780: 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61   it looks like a
d790: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68   database page h
d7a0: 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74  olding.** no ent
d7b0: 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
d7c0: 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65  void zeroPage(Me
d7d0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
d7e0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69  t flags){.  unsi
d7f0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
d800: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
d810: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
d820: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
d830: 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  u8 hdr = pPage->
d840: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36  hdrOffset;.  u16
d850: 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72   first;..  asser
d860: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
d870: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
d880: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
d890: 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ->pgno );.  asse
d8a0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
d8b0: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
d8c0: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
d8d0: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  d*)pPage );.  as
d8e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
d8f0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
d900: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74  >pDbPage) == dat
d910: 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  a );.  assert( s
d920: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
d930: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
d940: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
d950: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d960: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
d970: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
d980: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
d990: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
d9a0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
d9b0: 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
d9c0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
d9d0: 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64  );.  }.  data[hd
d9e0: 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73  r] = (char)flags
d9f0: 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
da00: 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  + ((flags&PTF_LE
da10: 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29  AF)==0 ? 12 : 8)
da20: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
da30: 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
da40: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
da50: 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
da60: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
da70: 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
da80: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
da90: 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
daa0: 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20  Size - first);. 
dab0: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
dac0: 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
dad0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
dae0: 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
daf0: 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
db00: 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
db10: 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43  ze];.  pPage->aC
db20: 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66  ellIdx = &data[f
db30: 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  irst];.  pPage->
db40: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
db50: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
db60: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
db70: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
db80: 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  536 );.  pPage->
db90: 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
dba0: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
dbb0: 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43   1);.  pPage->nC
dbc0: 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ell = 0;.  pPage
dbd0: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a  ->isInit = 1;.}.
dbe0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
dbf0: 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65  a DbPage obtaine
dc00: 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
dc10: 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20   into a MemPage 
dc20: 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62  used by.** the b
dc30: 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73  tree layer..*/.s
dc40: 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
dc50: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
dc60: 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  ge(DbPage *pDbPa
dc70: 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42  ge, Pgno pgno, B
dc80: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
dc90: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
dca0: 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69  = (MemPage*)sqli
dcb0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
dcc0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
dcd0: 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69  ge->aData = sqli
dce0: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
dcf0: 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
dd00: 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62  e->pDbPage = pDb
dd10: 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70  Page;.  pPage->p
dd20: 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67  Bt = pBt;.  pPag
dd30: 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  e->pgno = pgno;.
dd40: 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
dd50: 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  et = pPage->pgno
dd60: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20  ==1 ? 100 : 0;. 
dd70: 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a   return pPage; .
dd80: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
dd90: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
dda0: 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  er.  Initialize 
ddb0: 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
ddc0: 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
ddd0: 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
dde0: 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   needed..**.** I
ddf0: 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  f the noContent 
de00: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20  flag is set, it 
de10: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
de20: 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a   not care about.
de30: 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ** the content o
de40: 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68  f the page at th
de50: 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20  is time.  So do 
de60: 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69  not go to the di
de70: 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74  sk.** to fetch t
de80: 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73  he content.  Jus
de90: 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f  t fill in the co
dea0: 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
deb0: 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20   for now..** If 
dec0: 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65  in the future we
ded0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
dee0: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69  erWrite() on thi
def0: 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20  s page, that.** 
df00: 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74  means we have st
df10: 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63  arted to be conc
df20: 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74  erned about cont
df30: 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b  ent and the disk
df40: 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20  .** read should 
df50: 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f  occur at that po
df60: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
df70: 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28  nt btreeGetPage(
df80: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
df90: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
dfa0: 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
dfb0: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
dfc0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
dfd0: 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
dfe0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
dff0: 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
e000: 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
e010: 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
e020: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
e030: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
e040: 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72  GET_NOCONTENT or
e050: 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
e060: 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  NLY */.){.  int 
e070: 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
e080: 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  bPage;..  assert
e090: 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
e0a0: 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e  ags==PAGER_GET_N
e0b0: 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67  OCONTENT || flag
e0c0: 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41  s==PAGER_GET_REA
e0d0: 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72  DONLY );.  asser
e0e0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
e0f0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
e100: 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
e110: 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
e120: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
e130: 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44  o, (DbPage**)&pD
e140: 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  bPage, flags);. 
e150: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
e160: 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d   rc;.  *ppPage =
e170: 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
e180: 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
e190: 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75  no, pBt);.  retu
e1a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e1b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20  ./*.** Retrieve 
e1c0: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
e1d0: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20  pager cache. If 
e1e0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
e1f0: 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72  ge is not.** alr
e200: 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65  eady in the page
e210: 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e  r cache return N
e220: 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20  ULL. Initialize 
e230: 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
e240: 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
e250: 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
e260: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
e270: 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
e280: 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68  ePageLookup(BtSh
e290: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
e2a0: 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  pgno){.  DbPage 
e2b0: 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65  *pDbPage;.  asse
e2c0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
e2d0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
e2e0: 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20  x) );.  pDbPage 
e2f0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
e300: 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72  okup(pBt->pPager
e310: 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
e320: 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  DbPage ){.    re
e330: 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72  turn btreePageFr
e340: 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
e350: 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
e360: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
e370: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
e380: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
e390: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70  tabase file in p
e3a0: 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69  ages. If there i
e3b0: 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a  s any kind of.**
e3c0: 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28   error, return (
e3d0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31  (unsigned int)-1
e3e0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  )..*/.static Pgn
e3f0: 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o btreePagecount
e400: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
e410: 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e  .  return pBt->n
e420: 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69  Page;.}.u32 sqli
e430: 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67 65  te3BtreeLastPage
e440: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73  (Btree *p){.  as
e450: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
e460: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
e470: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 70  );.  assert( ((p
e480: 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78  ->pBt->nPage)&0x
e490: 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20  8000000)==0 );. 
e4a0: 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
e4b0: 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a  ecount(p->pBt);.
e4c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
e4d0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
e4e0: 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  er and initializ
e4f0: 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  e it.  This rout
e500: 69 6e 65 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a  ine is just a.**
e510: 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61   convenience wra
e520: 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61  pper around sepa
e530: 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 20 62 74  rate calls to bt
e540: 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64  reeGetPage() and
e550: 20 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61   .** btreeInitPa
e560: 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ge()..**.** If a
e570: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
e580: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 2a  then the value *
e590: 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
e5a0: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49   is undefined. I
e5b0: 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20  t.** may remain 
e5c0: 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74  unchanged, or it
e5d0: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61   may be set to a
e5e0: 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e  n invalid value.
e5f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
e600: 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
e610: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
e620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e630: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
e640: 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
e650: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
e660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
e670: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
e680: 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
e690: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e6b0: 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
e6c0: 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20  ointer here */. 
e6d0: 20 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20 20   int bReadonly  
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6f0: 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 52 45   /* PAGER_GET_RE
e700: 41 44 4f 4e 4c 59 20 6f 72 20 30 20 2a 2f 0a 29  ADONLY or 0 */.)
e710: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
e720: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
e730: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
e740: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
e750: 28 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 50 41 47  ( bReadonly==PAG
e760: 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
e770: 7c 7c 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 30 20  || bReadonly==0 
e780: 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62  );..  if( pgno>b
e790: 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
e7a0: 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  t) ){.    rc = S
e7b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
e7c0: 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
e7d0: 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
e7e0: 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
e7f0: 50 61 67 65 2c 20 62 52 65 61 64 6f 6e 6c 79 29  Page, bReadonly)
e800: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
e810: 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50  LITE_OK && (*ppP
e820: 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  age)->isInit==0 
e830: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  ){.      rc = bt
e840: 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50  reeInitPage(*ppP
e850: 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
e860: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e870: 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
e880: 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
e890: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
e8a0: 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67  ..  testcase( pg
e8b0: 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  no==0 );.  asser
e8c0: 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63  t( pgno!=0 || rc
e8d0: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
e8e0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
e8f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
e900: 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68  e a MemPage.  Th
e910: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  is should be cal
e920: 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
e930: 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20  h prior.** call 
e940: 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e  to btreeGetPage.
e950: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e960: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
e970: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
e980: 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
e990: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
e9a0: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
e9b0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
e9c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
e9d0: 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20  age->pDbPage!=0 
e9e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
e9f0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
ea00: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
ea10: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
ea20: 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  age );.    asser
ea30: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
ea40: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
ea50: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
ea60: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
ea70: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ea80: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
ea90: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
eaa0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
eab0: 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d  efNotNull(pPage-
eac0: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
ead0: 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61  ../*.** During a
eae0: 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20   rollback, when 
eaf0: 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64  the pager reload
eb00: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  s information in
eb10: 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  to the cache.** 
eb20: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
eb30: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
eb40: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
eb50: 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ate at the start
eb60: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73   of.** the trans
eb70: 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68  action, for each
eb80: 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74   page restored t
eb90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
eba0: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
ebb0: 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
ebc0: 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74  to reset the ext
ebd0: 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20  ra data section 
ebe0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
ebf0: 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72  e.** page to agr
ec00: 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
ec10: 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ored data..*/.st
ec20: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65  atic void pageRe
ec30: 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61  init(DbPage *pDa
ec40: 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ta){.  MemPage *
ec50: 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d  pPage;.  pPage =
ec60: 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
ec70: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
ec80: 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
ec90: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
eca0: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
ecb0: 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50  a)>0 );.  if( pP
ecc0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
ecd0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
ece0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
ecf0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
ed00: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
ed10: 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69  sInit = 0;.    i
ed20: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
ed30: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
ed40: 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  a)>1 ){.      /*
ed50: 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74   pPage might not
ed60: 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
ed70: 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ;  it might be a
ed80: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  n overflow page.
ed90: 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d        ** or ptrm
eda0: 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65  ap page or a fre
edb0: 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73  e page.  In thos
edc0: 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c  e cases, the fol
edd0: 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lowing.      ** 
ede0: 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69  call to btreeIni
edf0: 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
ee00: 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
ee10: 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
ee20: 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
ee30: 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
ee40: 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
ee50: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
ee60: 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e        ** btreeIn
ee70: 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c  itPage() be call
ee80: 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65  ed on every btre
ee90: 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b  e page so we mak
eea0: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  e.      ** the c
eeb0: 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61  all for every pa
eec0: 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e  ge that comes in
eed0: 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e   for re-initing.
eee0: 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49   */.      btreeI
eef0: 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
ef00: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
ef10: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
ef20: 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
ef30: 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
ef40: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b  c int btreeInvok
ef50: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
ef60: 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68  d *pArg){.  BtSh
ef70: 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53  ared *pBt = (BtS
ef80: 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61  hared*)pArg;.  a
ef90: 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29  ssert( pBt->db )
efa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
efb0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
efc0: 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  Bt->db->mutex) )
efd0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
efe0: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
eff0: 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75  ler(&pBt->db->bu
f000: 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f  syHandler);.}../
f010: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
f020: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
f030: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
f040: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
f050: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
f060: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
f070: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65  ULL.** then an e
f080: 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
f090: 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
f0a0: 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
f0b0: 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62  abase might.** b
f0c0: 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e  e exclusively in
f0d0: 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d   memory, or it m
f0e0: 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d  ight use a disk-
f0f0: 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63  based memory cac
f100: 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61  he..** Either wa
f110: 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  y, the ephemeral
f120: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
f130: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
f140: 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e  deleted .** when
f150: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
f160: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
f170: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
f180: 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
f190: 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f   then an in-memo
f1a0: 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63  ry database is c
f1b0: 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69  reated.** that i
f1c0: 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
f1d0: 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69  destroyed when i
f1e0: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
f1f0: 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70  ** The "flags" p
f200: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
f210: 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74  tmask that might
f220: 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69   contain bits li
f230: 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ke.** BTREE_OMIT
f240: 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
f250: 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a  BTREE_MEMORY..**
f260: 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
f270: 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ase is already o
f280: 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d  pened in the sam
f290: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
f2a0: 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20  ction.** and we 
f2b0: 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61  are in shared ca
f2c0: 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  che mode, then t
f2d0: 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69  he open will fai
f2e0: 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c  l with an.** SQL
f2f0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
f300: 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74  rror.  We cannot
f310: 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f   allow two or mo
f320: 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f  re BtShared.** o
f330: 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61  bjects in the sa
f340: 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
f350: 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69  ection since doi
f360: 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a  ng so will lead.
f370: 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77  ** to problems w
f380: 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ith locking..*/.
f390: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
f3a0: 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
f3b0: 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
f3c0: 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f  /* VFS to use fo
f3d0: 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f  r this b-tree */
f3e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f3f0: 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
f400: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
f410: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
f420: 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
f430: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
f440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
f450: 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
f460: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
f470: 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
f480: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
f490: 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
f4a0: 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
f4b0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f4d0: 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
f4e0: 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
f4f0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
f500: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
f510: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
f520: 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  en() */.){.  BtS
f530: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
f540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
f550: 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
f560: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
f570: 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f590: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
f5a0: 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
f5b0: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f  e3_mutex *mutexO
f5c0: 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65  pen = 0;  /* Pre
f5d0: 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e  vents a race con
f5e0: 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23  dition. Ticket #
f5f0: 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63  3537 */.  int rc
f600: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
f610: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
f620: 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69  lt code from thi
f630: 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
f640: 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  u8 nReserve;    
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f660: 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64  * Byte of unused
f670: 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
f680: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
f690: 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
f6a0: 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62  [100];  /* Datab
f6b0: 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65  ase header conte
f6c0: 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65  nt */..  /* True
f6d0: 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65   if opening an e
f6e0: 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72  phemeral, tempor
f6f0: 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ary database */.
f700: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65    const int isTe
f710: 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  mpDb = zFilename
f720: 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
f730: 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65  [0]==0;..  /* Se
f740: 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
f750: 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
f760: 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
f770: 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
f780: 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
f790: 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
f7a0: 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  se..  */.#ifdef 
f7b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
f7c0: 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74  RYDB.  const int
f7d0: 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65   isMemdb = 0;.#e
f7e0: 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  lse.  const int 
f7f0: 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65  isMemdb = (zFile
f800: 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a  name && strcmp(z
f810: 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f  Filename, ":memo
f820: 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20  ry:")==0).      
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26   || (isTempDb &&
f850: 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
f860: 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20  mory(db)).      
f870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f880: 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20   || (vfsFlags & 
f890: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
f8a0: 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a  RY)!=0;.#endif..
f8b0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
f8c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  );.  assert( pVf
f8d0: 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
f8e0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
f8f0: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
f900: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  );.  assert( (fl
f910: 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73  ags&0xff)==flags
f920: 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66   );   /* flags f
f930: 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a  it in 8 bits */.
f940: 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52  .  /* Only a BTR
f950: 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
f960: 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f  se can be BTREE_
f970: 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61  UNORDERED */.  a
f980: 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
f990: 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
f9a0: 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
f9b0: 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30  BTREE_SINGLE)!=0
f9c0: 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45   );..  /* A BTRE
f9d0: 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
f9e0: 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65  e is always a te
f9f0: 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65  mporary and/or e
fa00: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73  phemeral */.  as
fa10: 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
fa20: 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  TREE_SINGLE)==0 
fa30: 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a  || isTempDb );..
fa40: 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
fa50: 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54  .    flags |= BT
fa60: 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  REE_MEMORY;.  }.
fa70: 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20    if( (vfsFlags 
fa80: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
fa90: 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73  IN_DB)!=0 && (is
faa0: 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44  Memdb || isTempD
fab0: 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61  b) ){.    vfsFla
fac0: 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26  gs = (vfsFlags &
fad0: 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   ~SQLITE_OPEN_MA
fae0: 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f  IN_DB) | SQLITE_
faf0: 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20  OPEN_TEMP_DB;.  
fb00: 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d  }.  p = sqlite3M
fb10: 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
fb20: 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20  (Btree));.  if( 
fb30: 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
fb40: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
fb50: 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20   }.  p->inTrans 
fb60: 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
fb70: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e  p->db = db;.#ifn
fb80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fb90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70  SHARED_CACHE.  p
fba0: 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20  ->lock.pBtree = 
fbb0: 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p;.  p->lock.iTa
fbc0: 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  ble = 1;.#endif.
fbd0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
fbe0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
fbf0: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
fc00: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
fc10: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a  DISKIO).  /*.  *
fc20: 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20  * If this Btree 
fc30: 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
fc40: 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c  or shared cache,
fc50: 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a   try to find an.
fc60: 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74    ** existing Bt
fc70: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68  Shared object th
fc80: 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20  at we can share 
fc90: 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20  with.  */.  if( 
fca0: 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28  isTempDb==0 && (
fcb0: 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76  isMemdb==0 || (v
fcc0: 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
fcd0: 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a  PEN_URI)!=0) ){.
fce0: 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
fcf0: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
fd00: 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
fd10: 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
fd20: 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
fd30: 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
fd40: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
fd50: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
fd60: 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e  alloc(nFullPathn
fd70: 61 6d 65 29 3b 0a 20 20 20 20 20 20 4d 55 54 45  ame);.      MUTE
fd80: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
fd90: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
fda0: 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e  red; ).      p->
fdb0: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
fdc0: 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
fdd0: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
fde0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
fdf0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
fe00: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
fe10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
fe20: 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
fe30: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c       memcpy(zFul
fe40: 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65  lPathname, zFile
fe50: 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  name, sqlite3Str
fe60: 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
fe70: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
fe80: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
fe90: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
fea0: 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
feb0: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fed0: 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61           nFullPa
fee0: 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  thname, zFullPat
fef0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
ff00: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
ff10: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ff20: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
ff30: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ff40: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
ff50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
ff60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ff70: 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48   }.#if SQLITE_TH
ff80: 52 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d  READSAFE.      m
ff90: 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74  utexOpen = sqlit
ffa0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
ffb0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
ffc0: 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71  _OPEN);.      sq
ffd0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
ffe0: 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  r(mutexOpen);.  
fff0: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
10000 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
10010 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
10020 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
10030 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
10040 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
10050 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a  Shared);.#endif.
10060 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c        for(pBt=GL
10070 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
10080 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
10090 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74  eList); pBt; pBt
100a0 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  =pBt->pNext){.  
100b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
100c0 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  t->nRef>0 );.   
100d0 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63       if( 0==strc
100e0 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  mp(zFullPathname
100f0 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  , sqlite3PagerFi
10100 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67  lename(pBt->pPag
10110 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20  er, 0)).        
10120 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
10130 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d  te3PagerVfs(pBt-
10140 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29  >pPager)==pVfs )
10150 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
10160 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66  iDb;.          f
10170 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31  or(iDb=db->nDb-1
10180 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29  ; iDb>=0; iDb--)
10190 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74  {.            Bt
101a0 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d  ree *pExisting =
101b0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
101c0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  t;.            i
101d0 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20  f( pExisting && 
101e0 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d  pExisting->pBt==
101f0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
10200 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
10210 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
10220 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ared);.         
10230 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
10240 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
10250 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
10260 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10270 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
10280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
10290 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
102b0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
102c0 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20  RAINT;.         
102d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
102e0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42  .          p->pB
102f0 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20  t = pBt;.       
10300 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a     pBt->nRef++;.
10310 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
10320 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10330 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
10340 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
10350 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
10360 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
10370 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
10380 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
10390 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65  E_DEBUG.    else
103a0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65  {.      /* In de
103b0 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72  bug mode, we mar
103c0 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74  k all persistent
103d0 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68   databases as sh
103e0 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20  arable.      ** 
103f0 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61  even when they a
10400 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78  re not.  This ex
10410 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b  ercises the lock
10420 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20  ing code and.   
10430 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65     ** gives more
10440 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72   opportunity for
10450 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33   asserts(sqlite3
10460 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20  _mutex_held()). 
10470 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
10480 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69  ts to find locki
10490 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20  ng problems..   
104a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73     */.      p->s
104b0 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
104c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65   }.#endif.  }.#e
104d0 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d  ndif.  if( pBt==
104e0 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  0 ){.    /*.    
104f0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
10500 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75   asserts make su
10510 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72  re that structur
10520 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62  es used by the b
10530 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  tree are.    ** 
10540 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20  the right size. 
10550 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72   This is to guar
10560 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63  d against size c
10570 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75  hanges that resu
10580 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63  lt.    ** when c
10590 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69  ompiling on a di
105a0 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63  fferent architec
105b0 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ture..    */.   
105c0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
105d0 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  i64)==8 || sizeo
105e0 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(i64)==4 );.   
105f0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
10600 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  u64)==8 || sizeo
10610 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u64)==4 );.   
10620 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
10630 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
10640 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
10650 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
10660 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
10670 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
10680 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
10690 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
106a0 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
106b0 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
106c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
106d0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  M;.      goto bt
106e0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
106f0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
10700 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
10710 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
10720 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10740 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a         EXTRA_SIZ
10750 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  E, flags, vfsFla
10760 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
10770 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
10780 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10790 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
107a0 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
107b0 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70  ager, db->szMmap
107c0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
107d0 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
107e0 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
107f0 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
10800 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
10810 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
10820 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10830 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
10840 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
10850 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e   }.    pBt->open
10860 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67  Flags = (u8)flag
10870 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  s;.    pBt->db =
10880 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
10890 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
108a0 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
108b0 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
108c0 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
108d0 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
108e0 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  .  .    pBt->pCu
108f0 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
10900 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
10910 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
10920 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
10930 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74  t->pPager) ) pBt
10940 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
10950 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66  S_READ_ONLY;.#if
10960 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
10970 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74  E_DELETE.    pBt
10980 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
10990 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
109a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 42 74 2d  .#endif.    pBt-
109b0 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62  >pageSize = (zDb
109c0 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c  Header[16]<<8) |
109d0 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c   (zDbHeader[17]<
109e0 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42  <16);.    if( pB
109f0 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20  t->pageSize<512 
10a00 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  || pBt->pageSize
10a10 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
10a20 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c  _SIZE.         |
10a30 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  | ((pBt->pageSiz
10a40 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69  e-1)&pBt->pageSi
10a50 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ze)!=0 ){.      
10a60 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
10a70 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
10a80 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
10a90 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
10aa0 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
10ab0 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65  emory:" will cre
10ac0 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
10ad0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
10ae0 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74        ** leave t
10af0 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f  he autoVacuum mo
10b00 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20  de at 0 (do not 
10b10 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76  auto-vacuum), ev
10b20 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  en if.      ** S
10b30 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
10b40 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65  TOVACUUM is true
10b50 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
10b60 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a  and, if.      **
10b70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
10b80 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64  ORYDB has been d
10b90 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d  efined, then ":m
10ba0 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20  emory:" is just 
10bb0 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c  a.      ** regul
10bc0 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e  ar file-name. In
10bd0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61   this case the a
10be0 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69  uto-vacuum appli
10bf0 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c  es as per normal
10c00 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10c10 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
10c20 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
10c30 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
10c40 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
10c50 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
10c60 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  UM ? 1 : 0);.   
10c70 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
10c80 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
10c90 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
10ca0 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20  M==2 ? 1 : 0);. 
10cb0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
10cc0 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30      nReserve = 0
10cd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10ce0 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44     nReserve = zD
10cf0 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20  bHeader[20];.   
10d00 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
10d10 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
10d20 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20  _FIXED;.#ifndef 
10d30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
10d40 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74  VACUUM.      pBt
10d50 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
10d60 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
10d70 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  der[36 + 4*4])?1
10d80 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  :0);.      pBt->
10d90 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
10da0 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
10db0 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  r[36 + 7*4])?1:0
10dc0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
10dd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10de0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
10df0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
10e00 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
10e10 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28  eserve);.    if(
10e20 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65   rc ) goto btree
10e30 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70  _open_out;.    p
10e40 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
10e50 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
10e60 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61   nReserve;.    a
10e70 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67  ssert( (pBt->pag
10e80 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
10e90 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67    /* 8-byte alig
10ea0 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a  nment of pageSiz
10eb0 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65  e */.   .#if !de
10ec0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10ed0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
10ee0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
10ef0 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
10f00 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
10f10 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ew BtShared obje
10f20 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64  ct to the linked
10f30 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42   list sharable B
10f40 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f  tShareds..    */
10f50 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72  .    if( p->shar
10f60 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55  able ){.      MU
10f70 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
10f80 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
10f90 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70  hared; ).      p
10fa0 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
10fb0 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
10fc0 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
10fd0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
10fe0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
10ff0 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20  ATIC_MASTER);). 
11000 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
11010 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71  THREADSAFE && sq
11020 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
11030 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a  g.bCoreMutex ){.
11040 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74          pBt->mut
11050 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
11060 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
11070 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20  TEX_FAST);.     
11080 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65     if( pBt->mute
11090 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
110a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
110b0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64  MEM;.          d
110c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
110d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 0;.          g
110e0 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
110f0 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
11100 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
11110 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
11120 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
11130 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
11140 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
11150 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
11160 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
11170 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
11180 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
11190 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b  acheList) = pBt;
111a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
111b0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
111c0 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23  Shared);.    }.#
111d0 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21  endif.  }..#if !
111e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
111f0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
11200 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
11210 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
11220 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65  ).  /* If the ne
11230 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73  w Btree uses a s
11240 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65  harable pBtShare
11250 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65  d, then link the
11260 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20   new.  ** Btree 
11270 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  into the list of
11280 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74   all sharable Bt
11290 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d  rees for the sam
112a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  e connection..  
112b0 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b  ** The list is k
112c0 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ept in ascending
112d0 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64   order by pBt ad
112e0 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  dress..  */.  if
112f0 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
11300 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
11310 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20  Btree *pSib;.   
11320 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
11330 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
11340 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d   if( (pSib = db-
11350 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
11360 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
11370 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
11380 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
11390 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
113a0 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
113b0 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62   if( p->pBt<pSib
113c0 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
113d0 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
113e0 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ib;.          p-
113f0 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
11400 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65        pSib->pPre
11410 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  v = p;.        }
11420 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11430 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65  while( pSib->pNe
11440 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78  xt && pSib->pNex
11450 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b  t->pBt<p->pBt ){
11460 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69  .            pSi
11470 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  b = pSib->pNext;
11480 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
11490 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
114a0 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
114b0 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
114c0 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  v = pSib;.      
114d0 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
114e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
114f0 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
11500 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = p;.          }
11510 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
11520 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
11530 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
11540 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
11550 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
11560 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62  *ppBtree = p;..b
11570 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20  tree_open_out:. 
11580 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11590 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
115a0 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
115b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
115c0 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
115d0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  >pPager);.    }.
115e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
115f0 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
11600 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
11610 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
11620 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
11630 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20   the B-Tree was 
11640 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65  successfully ope
11650 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67  ned, set the pag
11660 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f  er-cache size to
11670 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
11680 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70  ult value. Excep
11690 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  t, when opening 
116a0 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  on an existing s
116b0 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68  hared pager-cach
116c0 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74  e,.    ** do not
116d0 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   change the page
116e0 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20  r-cache size..  
116f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
11700 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
11710 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  p, 0, 0)==0 ){. 
11720 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
11730 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d  rSetCachesize(p-
11740 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51  >pBt->pPager, SQ
11750 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
11760 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a  HE_SIZE);.    }.
11770 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f    }.  if( mutexO
11780 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pen ){.    asser
11790 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
117a0 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29  _held(mutexOpen)
117b0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
117c0 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
117d0 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  xOpen);.  }.  re
117e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
117f0 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
11800 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
11810 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
11820 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
11830 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
11840 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
11850 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
11860 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
11870 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
11880 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
11890 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
118a0 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
118b0 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
118c0 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
118d0 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
118e0 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
118f0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
11900 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11910 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
11920 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  E.  MUTEX_LOGIC(
11930 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
11940 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53  pMaster; ).  BtS
11950 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20  hared *pList;.  
11960 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
11970 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
11980 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
11990 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
119a0 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
119b0 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
119c0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
119d0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
119e0 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c  MASTER); ).  sql
119f0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
11a00 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74  (pMaster);.  pBt
11a10 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
11a20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a  pBt->nRef<=0 ){.
11a30 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42      if( GLOBAL(B
11a40 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
11a50 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
11a60 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47  ==pBt ){.      G
11a70 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
11a80 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
11a90 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70  heList) = pBt->p
11aa0 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
11ab0 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47  .      pList = G
11ac0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
11ad0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
11ae0 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  heList);.      w
11af0 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69  hile( ALWAYS(pLi
11b00 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  st) && pList->pN
11b10 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
11b20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
11b30 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
11b40 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
11b50 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
11b60 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
11b70 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
11b80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
11b90 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
11ba0 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73  DSAFE ){.      s
11bb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
11bc0 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20  e(pBt->mutex);. 
11bd0 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64     }.    removed
11be0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
11bf0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
11c00 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
11c10 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73  rn removed;.#els
11c20 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  e.  return 1;.#e
11c30 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
11c40 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d  ke sure pBt->pTm
11c50 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f  pSpace points to
11c60 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f   an allocation o
11c70 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49  f .** MX_CELL_SI
11c80 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a  ZE(pBt) bytes..*
11c90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c  /.static void al
11ca0 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
11cb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
11cc0 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70    if( !pBt->pTmp
11cd0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
11ce0 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
11cf0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
11d00 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29   pBt->pageSize )
11d10 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ;..    /* One of
11d20 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42 74   the uses of pBt
11d30 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20 74  ->pTmpSpace is t
11d40 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62  o format cells b
11d50 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73  efore.    ** ins
11d60 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f  erting them into
11d70 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66 75   a leaf page (fu
11d80 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c  nction fillInCel
11d90 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20  l()). If.    ** 
11da0 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74  a cell is less t
11db0 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73  han 4 bytes in s
11dc0 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64  ize, it is round
11dd0 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65 73  ed up to 4 bytes
11de0 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76  .    ** by the v
11df0 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20  arious routines 
11e00 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20  that manipulate 
11e10 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68  binary cells. Wh
11e20 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d  ich.    ** can m
11e30 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43  ean that fillInC
11e40 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69  ell() only initi
11e50 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73 74  alizes the first
11e60 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62   2 or 3.    ** b
11e70 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63  ytes of pTmpSpac
11e80 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65 20  e, but that the 
11e90 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61 72  first 4 bytes ar
11ea0 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20  e copied from.  
11eb0 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64    ** it into a d
11ec0 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68  atabase page. Th
11ed0 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  is is not actual
11ee0 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75  ly a problem, bu
11ef0 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73  t it.    ** does
11f00 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e   cause a valgrin
11f10 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65  d error when the
11f20 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66   1 or 2 bytes of
11f30 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20   unitialized .  
11f40 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73    ** data is pas
11f50 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61  sed to system ca
11f60 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74  ll write(). So t
11f70 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72 72  o avoid this err
11f80 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20  or,.    ** zero 
11f90 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
11fa0 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20  s of temp space 
11fb0 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  here.  */.    if
11fc0 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
11fd0 20 29 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70   ) memset(pBt->p
11fe0 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 34 29 3b  TmpSpace, 0, 4);
11ff0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
12000 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70  ee the pBt->pTmp
12010 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  Space allocation
12020 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12030 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74  freeTempSpace(Bt
12040 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
12050 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
12060 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29   pBt->pTmpSpace)
12070 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ;.  pBt->pTmpSpa
12080 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ce = 0;.}../*.**
12090 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64   Close an open d
120a0 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61  atabase and inva
120b0 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  lidate all curso
120c0 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
120d0 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72  e3BtreeClose(Btr
120e0 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
120f0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
12100 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
12110 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  ur;..  /* Close 
12120 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
12130 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
12140 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  le.  */.  assert
12150 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
12160 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
12170 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
12180 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12190 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72  pCur = pBt->pCur
121a0 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43  sor;.  while( pC
121b0 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73  ur ){.    BtCurs
121c0 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b  or *pTmp = pCur;
121d0 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72  .    pCur = pCur
121e0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
121f0 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70   pTmp->pBtree==p
12200 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12210 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
12220 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  r(pTmp);.    }. 
12230 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   }..  /* Rollbac
12240 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
12250 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nsaction and fre
12260 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72  e the handle str
12270 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65  ucture..  ** The
12280 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
12290 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20  BtreeRollback() 
122a0 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d  drops any table-
122b0 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20  locks held by.  
122c0 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a  ** this handle..
122d0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
122e0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53  reeRollback(p, S
122f0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c  QLITE_OK);.  sql
12300 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12310 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
12320 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65  e are still othe
12330 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  r outstanding re
12340 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
12350 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a  shared-btree.  *
12360 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74  * structure, ret
12370 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d  urn now. The rem
12380 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70  ainder of this p
12390 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
123a0 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61  .  ** up the sha
123b0 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a  red-btree..  */.
123c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
123d0 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d  tToLock==0 && p-
123e0 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
123f0 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65  if( !p->sharable
12400 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68   || removeFromSh
12410 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29  aringList(pBt) )
12420 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74  {.    /* The pBt
12430 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e   is no longer on
12440 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
12450 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63  t, so we can acc
12460 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69  ess.    ** it wi
12470 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
12480 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a  hold the mutex..
12490 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c      **.    ** Cl
124a0 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65  ean out and dele
124b0 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  te the BtShared 
124c0 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  object..    */. 
124d0 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
124e0 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
124f0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
12500 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
12510 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72      if( pBt->xFr
12520 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d  eeSchema && pBt-
12530 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
12540 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
12550 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ma(pBt->pSchema)
12560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
12570 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74  te3DbFree(0, pBt
12580 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
12590 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
125a0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
125b0 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  free(pBt);.  }..
125c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
125d0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
125e0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
125f0 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  ntToLock==0 );. 
12600 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
12610 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed==0 );.  if( p
12620 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72  ->pPrev ) p->pPr
12630 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
12640 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  Next;.  if( p->p
12650 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d  Next ) p->pNext-
12660 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
12670 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  v;.#endif..  sql
12680 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
12690 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
126a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
126b0 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74  e the limit on t
126c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
126d0 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68  es allowed in th
126e0 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  e cache..**.** T
126f0 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
12700 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73  r of cache pages
12710 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61   is set to the a
12720 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65  bsolute.** value
12730 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20   of mxPage.  If 
12740 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  mxPage is negati
12750 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69  ve, the pager wi
12760 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73  ll.** operate as
12770 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69  ynchronously - i
12780 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20  t will not stop 
12790 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a  to do fsync()s.*
127a0 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61  * to insure data
127b0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
127c0 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20  he disk surface 
127d0 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e  before.** contin
127e0 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69  uing.  Transacti
127f0 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69  ons still work i
12800 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  f synchronous is
12810 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65   off,.** and the
12820 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
12830 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66   be corrupted if
12840 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a   this program.**
12850 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69   crashes.  But i
12860 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
12870 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f  system crashes o
12880 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  r there is.** an
12890 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61   abrupt power fa
128a0 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68  ilure when synch
128b0 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74  ronous is off, t
128c0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  he database.** c
128d0 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20  ould be left in 
128e0 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
128f0 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c  and unrecoverabl
12900 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63  e state..** Sync
12910 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79  hronous is on by
12920 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61   default so data
12930 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
12940 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c  is not.** normal
12950 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69  ly a worry..*/.i
12960 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
12970 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65  etCacheSize(Btre
12980 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
12990 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
129a0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
129b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
129c0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
129d0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
129e0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
129f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
12a00 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42  rSetCachesize(pB
12a10 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
12a20 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
12a30 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
12a40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12a50 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
12a60 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a  X_MMAP_SIZE>0./*
12a70 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
12a80 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75  imit on the amou
12a90 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nt of the databa
12aa0 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79  se file that may
12ab0 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61   be.** memory ma
12ac0 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  pped..*/.int sql
12ad0 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70  ite3BtreeSetMmap
12ae0 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20  Limit(Btree *p, 
12af0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
12b00 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65  Mmap){.  BtShare
12b10 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
12b20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12b30 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
12b40 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
12b50 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
12b60 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
12b70 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
12b80 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73  t(pBt->pPager, s
12b90 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65  zMmap);.  sqlite
12ba0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12bb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12bc0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
12bd0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
12be0 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SIZE>0 */../*.**
12bf0 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20   Change the way 
12c00 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74  data is synced t
12c10 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20  o disk in order 
12c20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64  to increase or d
12c30 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77  ecrease.** how w
12c40 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65  ell the database
12c50 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20   resists damage 
12c60 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
12c70 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66  s and power.** f
12c80 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20  ailures.  Level 
12c90 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  1 is the same as
12ca0 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e   asynchronous (n
12cb0 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20  o syncs() occur 
12cc0 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  and.** there is 
12cd0 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  a high probabili
12ce0 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c  ty of damage)  L
12cf0 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65  evel 2 is the de
12d00 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a  fault.  There.**
12d10 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62   is a very low b
12d20 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62  ut non-zero prob
12d30 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
12d40 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75  e.  Level 3 redu
12d50 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61  ces the.** proba
12d60 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
12d70 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75   to near zero bu
12d80 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70  t with a write p
12d90 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
12da0 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
12db0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
12dc0 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73  ER_PRAGMAS.int s
12dd0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
12de0 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65  gerFlags(.  Btre
12df0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
12e00 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
12e10 74 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74  to set the safet
12e20 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20  y level on */.  
12e30 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73  unsigned pgFlags
12e40 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75         /* Variou
12e50 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20  s PAGER_* flags 
12e60 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
12e70 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
12e80 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12e90 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
12ea0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
12eb0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12ec0 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
12ed0 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74  agerSetFlags(pBt
12ee0 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67  ->pPager, pgFlag
12ef0 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  s);.  sqlite3Btr
12f00 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
12f10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12f20 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
12f30 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
12f40 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69  he given btree i
12f50 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20  s set to safety 
12f60 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68  level 1.  In oth
12f70 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74  er.** words, ret
12f80 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73  urn TRUE if no s
12f90 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20  ync() occurs on 
12fa0 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a  the disk files..
12fb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12fc0 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
12fd0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
12fe0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
12ff0 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pBt;.  int rc;. 
13000 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13010 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
13020 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20  b->mutex) );  . 
13030 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
13040 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
13050 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
13060 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ger );.  rc = sq
13070 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
13080 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
13090 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
130a0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
130b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
130c0 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  nge the default 
130d0 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74  pages size and t
130e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
130f0 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20  erved bytes per 
13100 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  page..** Or, if 
13110 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61  the page size ha
13120 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66  s already been f
13130 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  ixed, return SQL
13140 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a  ITE_READONLY .**
13150 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
13160 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  g anything..**.*
13170 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
13180 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
13190 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32  of 2 between 512
131a0 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20   and 65536.  If 
131b0 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  the page.** size
131c0 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e   supplied does n
131d0 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e  ot meet this con
131e0 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65  straint then the
131f0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
13200 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  t.** changed..**
13210 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61  .** Page sizes a
13220 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74  re constrained t
13230 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  o be a power of 
13240 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  two so that the 
13250 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  region.** of the
13260 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
13270 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
13280 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45  (beginning at PE
13290 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74  NDING_BYTE,.** t
132a0 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
132b0 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64  st the 1GB bound
132c0 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29  ary, 0x40000000)
132d0 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a   needs to occur.
132e0 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
132f0 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a  ing of a page..*
13300 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
13310 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65  r nReserve is le
13320 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
13330 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
13340 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74   reserved.** byt
13350 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c  es per page is l
13360 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
13370 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78  *.** If the iFix
13380 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53  !=0 then the BTS
13390 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20  _PAGESIZE_FIXED 
133a0 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74  flag is set so t
133b0 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  hat the page siz
133c0 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63  e.** and autovac
133d0 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20  uum mode can no 
133e0 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65  longer be change
133f0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
13400 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
13410 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
13420 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
13430 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78  eserve, int iFix
13440 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
13450 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
13460 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
13470 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  t;.  assert( nRe
13480 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65  serve>=-1 && nRe
13490 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
134a0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
134b0 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  r(p);.  if( pBt-
134c0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
134d0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29  PAGESIZE_FIXED )
134e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
134f0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
13500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
13510 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
13520 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a  ( nReserve<0 ){.
13530 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70      nReserve = p
13540 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
13550 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
13560 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52    }.  assert( nR
13570 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
13580 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
13590 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  if( pageSize>=51
135a0 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
135b0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
135c0 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28  IZE &&.        (
135d0 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
135e0 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eSize)==0 ){.   
135f0 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
13600 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
13610 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
13620 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e  pPage1 && !pBt->
13630 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70  pCursor );.    p
13640 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
13650 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u32)pageSize;.  
13660 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
13670 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  pBt);.  }.  rc =
13680 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
13690 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
136a0 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
136b0 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
136c0 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  .  pBt->usableSi
136d0 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
136e0 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72  ze - (u16)nReser
136f0 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29  ve;.  if( iFix )
13700 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
13710 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
13720 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42  IXED;.  sqlite3B
13730 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
13740 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13750 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
13760 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
13770 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
13780 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
13790 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
137a0 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
137b0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
137c0 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
137d0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29  QLITE_HAS_CODEC)
137e0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
137f0 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
13800 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
13810 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
13820 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
13830 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  ve(), except tha
13840 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79  t it.** may only
13850 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74   be called if it
13860 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
13870 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d  hat the b-tree m
13880 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a  utex is already.
13890 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  ** held..**.** T
138a0 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e  his is useful in
138b0 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73   one special cas
138c0 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20  e in the backup 
138d0 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69  API code where i
138e0 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68  t is.** known th
138f0 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d  at the shared b-
13900 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65  tree mutex is he
13910 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65  ld, but the mute
13920 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  x on the .** dat
13930 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61  abase handle tha
13940 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74  t owns *p is not
13950 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
13960 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  f sqlite3BtreeEn
13970 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f  ter().** were to
13980 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d   be called, it m
13990 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74  ight collide wit
139a0 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65  h some other ope
139b0 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a  ration on the.**
139c0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
139d0 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63   that owns *p, c
139e0 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64  ausing undefined
139f0 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e   behavior..*/.in
13a00 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
13a10 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28  tReserveNoMutex(
13a20 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
13a30 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
13a40 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
13a50 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
13a60 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
13a70 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
13a80 61 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64  ableSize;.}.#end
13a90 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 48 41 53  if /* SQLITE_HAS
13aa0 5f 43 4f 44 45 43 20 7c 7c 20 53 51 4c 49 54 45  _CODEC || SQLITE
13ab0 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 21  _DEBUG */..#if !
13ac0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
13ad0 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
13ae0 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  S) || !defined(S
13af0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
13b00 4d 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  M)./*.** Return 
13b10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
13b20 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
13b30 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
13b40 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72   page that.** ar
13b50 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65  e intentually le
13b60 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73  ft unused.  This
13b70 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65   is the "reserve
13b80 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73  d" space that is
13b90 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73  .** sometimes us
13ba0 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73  ed by extensions
13bb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13bc0 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
13bd0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
13be0 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
13bf0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
13c00 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
13c10 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
13c20 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74  bleSize;.  sqlit
13c30 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
13c40 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
13c50 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
13c60 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
13c70 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
13c80 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
13c90 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
13ca0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
13cb0 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
13cc0 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
13cd0 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
13ce0 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
13cf0 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
13d00 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
13d10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
13d20 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
13d30 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
13d40 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
13d50 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
13d60 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
13d70 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
13d80 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
13d90 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
13da0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
13db0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
13dc0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  n;.}../*.** Set 
13dd0 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44  the BTS_SECURE_D
13de0 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65  ELETE flag if ne
13df0 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e  wFlag is 0 or 1.
13e00 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20    If newFlag is 
13e10 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65  -1,.** then make
13e20 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c   no changes.  Al
13e30 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20  ways return the 
13e40 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53  value of the BTS
13e50 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a  _SECURE_DELETE.*
13e60 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65 72 20  * setting after 
13e70 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69  the change..*/.i
13e80 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
13e90 65 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65  ecureDelete(Btre
13ea0 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61  e *p, int newFla
13eb0 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69  g){.  int b;.  i
13ec0 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
13ed0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   0;.  sqlite3Btr
13ee0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
13ef0 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a  ( newFlag>=0 ){.
13f00 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46      p->pBt->btsF
13f10 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43  lags &= ~BTS_SEC
13f20 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20  URE_DELETE;.    
13f30 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d  if( newFlag ) p-
13f40 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c  >pBt->btsFlags |
13f50 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  = BTS_SECURE_DEL
13f60 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20  ETE;.  } .  b = 
13f70 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67  (p->pBt->btsFlag
13f80 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
13f90 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c  ELETE)!=0;.  sql
13fa0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
13fb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d  );.  return b;.}
13fc0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
13fd0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13fe0 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c  PAGER_PRAGMAS) |
13ff0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
14000 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a  E_OMIT_VACUUM) *
14010 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  /../*.** Change 
14020 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
14030 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  ' property of th
14040 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
14050 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a  he 'autoVacuum'.
14060 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
14070 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
14080 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
14090 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a  is enabled. If z
140a0 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69  ero, it.** is di
140b0 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61  sabled. The defa
140c0 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
140d0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
140e0 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65  operty is .** de
140f0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
14100 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
14110 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e  UTOVACUUM macro.
14120 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
14130 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
14140 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  m(Btree *p, int 
14150 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66  autoVacuum){.#if
14160 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14170 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
14180 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
14190 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53  NLY;.#else.  BtS
141a0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
141b0 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
141c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
141d0 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63  av = (u8)autoVac
141e0 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  uum;..  sqlite3B
141f0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14200 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
14210 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
14220 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28  E_FIXED)!=0 && (
14230 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61  av ?1:0)!=pBt->a
14240 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
14250 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
14260 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DONLY;.  }else{.
14270 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
14280 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20  uum = av ?1:0;. 
14290 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
142a0 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b  um = av==2 ?1:0;
142b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
142c0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
142d0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
142e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
142f0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
14300 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
14310 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
14320 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
14330 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
14340 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
14350 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
14360 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
14370 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
14380 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
14390 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
143a0 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54  return BTREE_AUT
143b0 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65  OVACUUM_NONE;.#e
143c0 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lse.  int rc;.  
143d0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
143e0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20  r(p);.  rc = (. 
143f0 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74     (!p->pBt->aut
14400 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  oVacuum)?BTREE_A
14410 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a  UTOVACUUM_NONE:.
14420 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e      (!p->pBt->in
14430 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  crVacuum)?BTREE_
14440 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a  AUTOVACUUM_FULL:
14450 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56  .    BTREE_AUTOV
14460 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a  ACUUM_INCR.  );.
14470 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
14480 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
14490 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
144a0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
144b0 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
144c0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
144d0 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
144e0 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
144f0 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
14500 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
14510 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
14520 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
14530 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
14540 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
14550 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
14560 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
14570 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
14580 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
14590 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
145a0 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
145b0 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
145c0 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
145d0 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
145e0 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
145f0 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
14600 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
14610 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
14620 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
14630 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
14640 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
14650 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ons */.  MemPage
14660 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a   *pPage1;     /*
14670 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   Page 1 of the d
14680 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
14690 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
146a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
146b0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
146c0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
146d0 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30  nt nPageFile = 0
146e0 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
146f0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
14700 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
14710 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72   int nPageHeader
14720 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
14730 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
14740 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69  database accordi
14750 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20  ng to hdr */..  
14760 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14770 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
14780 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
14790 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
147a0 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
147b0 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
147c0 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ock(pBt->pPager)
147d0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
147e0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
147f0 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47  c;.  rc = btreeG
14800 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
14810 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
14820 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14830 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
14840 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
14850 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
14860 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
14870 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
14880 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
14890 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
148a0 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67  /.  nPage = nPag
148b0 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79  eHeader = get4by
148c0 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
148d0 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c  1->aData);.  sql
148e0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
148f0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
14900 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69  &nPageFile);.  i
14910 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d  f( nPage==0 || m
14920 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50  emcmp(24+(u8*)pP
14930 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b  age1->aData, 92+
14940 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
14950 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ta,4)!=0 ){.    
14960 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c  nPage = nPageFil
14970 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  e;.  }.  if( nPa
14980 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20  ge>0 ){.    u32 
14990 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33  pageSize;.    u3
149a0 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  2 usableSize;.  
149b0 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
149c0 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
149d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
149e0 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d  ADB;.    if( mem
149f0 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69  cmp(page1, zMagi
14a00 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20  cHeader, 16)!=0 
14a10 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
14a20 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
14a30 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
14a40 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
14a50 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
14a60 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >1 ){.      pBt-
14a70 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
14a80 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20  _READ_ONLY;.    
14a90 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
14aa0 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67  19]>1 ){.      g
14ab0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
14ac0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c  ailed;.    }.#el
14ad0 73 65 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  se.    if( page1
14ae0 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20  [18]>2 ){.      
14af0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
14b00 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
14b10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
14b20 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20  ge1[19]>2 ){.   
14b30 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
14b40 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
14b50 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
14b60 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73  write version is
14b70 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20   set to 2, this 
14b80 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
14b90 62 65 20 61 63 63 65 73 73 65 64 0a 20 20 20 20  be accessed.    
14ba0 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
14bb0 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f  If the log is no
14bc0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  t already open, 
14bd0 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65  open it now. The
14be0 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  n .    ** return
14bf0 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
14c00 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f  eturn without po
14c10 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65  pulating BtShare
14c20 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a  d.pPage1..    **
14c30 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65   The caller dete
14c40 63 74 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c  cts this and cal
14c50 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
14c60 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a   again. This is.
14c70 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20      ** required 
14c80 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f  as the version o
14c90 66 20 70 61 67 65 20 31 20 63 75 72 72 65 6e 74  f page 1 current
14ca0 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 31 20  ly in the page1 
14cb0 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61  buffer.    ** ma
14cc0 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74  y not be the lat
14cd0 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68  est version - th
14ce0 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77  ere may be a new
14cf0 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f  er one in the lo
14d00 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20  g.    ** file.. 
14d10 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61     */.    if( pa
14d20 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70  ge1[19]==2 && (p
14d30 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
14d40 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b  TS_NO_WAL)==0 ){
14d50 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65  .      int isOpe
14d60 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  n = 0;.      rc 
14d70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
14d80 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65  enWal(pBt->pPage
14d90 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20  r, &isOpen);.   
14da0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14db0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14dc0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
14dd0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65  failed;.      }e
14de0 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d  lse if( isOpen==
14df0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  0 ){.        rel
14e00 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
14e10 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
14e20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14e30 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53    }.      rc = S
14e40 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
14e50 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
14e60 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65  /* The maximum e
14e70 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e  mbedded fraction
14e80 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79   must be exactly
14e90 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d   25%.  And the m
14ea0 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d  inimum.    ** em
14eb0 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20  bedded fraction 
14ec0 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f  must be 12.5% fo
14ed0 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61  r both leaf-data
14ee0 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   and non-leaf-da
14ef0 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f  ta..    ** The o
14f00 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61  riginal design a
14f10 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f  llowed these amo
14f20 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75  unts to vary, bu
14f30 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76  t as of.    ** v
14f40 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65  ersion 3.6.0, we
14f50 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f   require them to
14f60 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a   be fixed..    *
14f70 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
14f80 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31  (&page1[21], "\1
14f90 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d  00\040\040",3)!=
14fa0 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
14fb0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
14fc0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  d;.    }.    pag
14fd0 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31  eSize = (page1[1
14fe0 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b  6]<<8) | (page1[
14ff0 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66  17]<<16);.    if
15000 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
15010 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20  pageSize)!=0.   
15020 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51    || pageSize>SQ
15030 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
15040 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  ZE .     || page
15050 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29  Size<=256 .    )
15060 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
15070 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
15080 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
15090 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
150a0 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c  ==0 );.    usabl
150b0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
150c0 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20   - page1[20];.  
150d0 20 20 69 66 28 20 28 75 33 32 29 70 61 67 65 53    if( (u32)pageS
150e0 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize!=pBt->pageSi
150f0 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  ze ){.      /* A
15100 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  fter reading the
15110 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
15120 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75  he database assu
15130 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65  ming a page size
15140 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53  .      ** of BtS
15150 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20  hared.pageSize, 
15160 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72  we have discover
15170 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
15180 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a  -size is.      *
15190 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53  * actually pageS
151a0 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20  ize. Unlock the 
151b0 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20  database, leave 
151c0 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20  pBt->pPage1 at. 
151d0 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64       ** zero and
151e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
151f0 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  K. The caller wi
15200 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  ll call this fun
15210 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ction.      ** a
15220 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f  gain with the co
15230 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e  rrect page-size.
15240 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15250 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
15260 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e1);.      pBt->
15270 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61  usableSize = usa
15280 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  bleSize;.      p
15290 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
152a0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66  ageSize;.      f
152b0 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
152c0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
152d0 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
152e0 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
152f0 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
15300 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
15310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15320 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75        pageSize-u
15330 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
15340 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
15350 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d   }.    if( (pBt-
15360 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
15370 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65  ITE_RecoveryMode
15380 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50  )==0 && nPage>nP
15390 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  ageFile ){.     
153a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
153b0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
153c0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
153d0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
153e0 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a     if( usableSiz
153f0 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67  e<480 ){.      g
15400 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
15410 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
15420 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
15430 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
15440 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
15450 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66   usableSize;.#if
15460 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15470 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
15480 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
15490 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
154a0 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  e1[36 + 4*4])?1:
154b0 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  0);.    pBt->inc
154c0 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
154d0 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
154e0 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
154f0 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78  if.  }..  /* max
15500 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78  Local is the max
15510 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
15520 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20  ayload to store 
15530 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a  locally for.  **
15540 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73   a cell.  Make s
15550 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20  ure it is small 
15560 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
15570 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75  t least minFanou
15580 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e  t.  ** cells can
15590 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65   will fit on one
155a0 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d   page.  We assum
155b0 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65  e a 10-byte page
155c0 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65   header..  ** Be
155d0 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61  sides the payloa
155e0 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74  d, the cell must
155f0 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20   store:.  **    
15600 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20   2-byte pointer 
15610 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a  to the cell.  **
15620 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c       4-byte chil
15630 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20  d pointer.  **  
15640 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76     9-byte nKey v
15650 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
15660 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65  byte nData value
15670 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
15680 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
15690 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61  ointer.  ** So a
156a0 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
156b0 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74  f a 2-byte point
156c0 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69  er, a header whi
156d0 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73  ch is as much as
156e0 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c  .  ** 17 bytes l
156f0 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65  ong, 0 to N byte
15700 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e  s of payload, an
15710 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20  d an optional 4 
15720 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20  byte overflow.  
15730 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e  ** page pointer.
15740 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78  .  */.  pBt->max
15750 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70  Local = (u16)((p
15760 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
15770 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b  2)*64/255 - 23);
15780 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c  .  pBt->minLocal
15790 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
157a0 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
157b0 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
157c0 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31  t->maxLeaf = (u1
157d0 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  6)(pBt->usableSi
157e0 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d  ze - 35);.  pBt-
157f0 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29  >minLeaf = (u16)
15800 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
15810 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
15820 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d  3);.  if( pBt->m
15830 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20  axLocal>127 ){. 
15840 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65     pBt->max1byte
15850 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20  Payload = 127;. 
15860 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
15870 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
15880 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c   = (u8)pBt->maxL
15890 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ocal;.  }.  asse
158a0 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  rt( pBt->maxLeaf
158b0 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c   + 23 <= MX_CELL
158c0 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
158d0 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50  pBt->pPage1 = pP
158e0 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61  age1;.  pBt->nPa
158f0 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
15900 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15910 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c  .page1_init_fail
15920 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ed:.  releasePag
15930 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74  e(pPage1);.  pBt
15940 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
15950 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
15960 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
15970 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
15980 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
15990 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69  open on pBt. Thi
159a0 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
159b0 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
159c0 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
159d0 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
159e0 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
159f0 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
15a00 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75  ** Only write cu
15a10 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
15a20 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74  d if wrOnly is t
15a30 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20  rue.  If wrOnly 
15a40 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e  is.** false then
15a50 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
15a60 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   counted..**.** 
15a70 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
15a80 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
15a90 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e  , a cursor is an
15aa0 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a  y cursor that.**
15ab0 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72   is capable of r
15ac0 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
15ad0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
15ae0 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61 74  e.  Cursors that
15af0 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72  .** have been tr
15b00 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43  ipped into the C
15b10 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74  URSOR_FAULT stat
15b20 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65  e are not counte
15b30 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15b40 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f   countValidCurso
15b50 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
15b60 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20  , int wrOnly){. 
15b70 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
15b80 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
15b90 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
15ba0 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
15bb0 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
15bc0 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d      if( (wrOnly=
15bd0 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72  =0 || (pCur->cur
15be0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
15bf0 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20  teFlag)!=0).    
15c00 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
15c10 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  !=CURSOR_FAULT )
15c20 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
15c30 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
15c40 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  ./*.** If there 
15c50 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
15c60 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77  ng cursors and w
15c70 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  e are not in the
15c80 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20   middle.** of a 
15c90 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20  transaction but 
15ca0 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20  there is a read 
15cb0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
15cc0 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  base, then.** th
15cd0 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66  is routine unref
15ce0 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
15cf0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
15d00 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20   file which .** 
15d10 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
15d20 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  f releasing the 
15d30 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  read lock..**.**
15d40 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
15d50 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
15d60 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75  ogress, this rou
15d70 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
15d80 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15d90 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
15da0 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42  sed(BtShared *pB
15db0 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
15dc0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15dd0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
15de0 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56    assert( countV
15df0 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c  alidCursors(pBt,
15e00 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e  0)==0 || pBt->in
15e10 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e  Transaction>TRAN
15e20 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  S_NONE );.  if( 
15e30 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
15e40 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
15e50 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30  & pBt->pPage1!=0
15e60 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   ){.    MemPage 
15e70 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
15e80 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73 65 72  Page1;.    asser
15e90 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t( pPage1->aData
15ea0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15eb0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
15ec0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
15ed0 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==1 );.    pBt-
15ee0 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
15ef0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
15f00 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ge1);.  }.}../*.
15f10 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73  ** If pBt points
15f20 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c   to an empty fil
15f30 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74  e then convert t
15f40 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a  hat empty file.*
15f50 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70  * into a new emp
15f60 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69  ty database by i
15f70 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
15f80 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a  first page of.**
15f90 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
15fa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
15fb0 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
15fc0 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
15fd0 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67  ge *pP1;.  unsig
15fe0 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
15ff0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
16000 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16010 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
16020 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
16030 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ->nPage>0 ){.   
16040 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16050 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70  K;.  }.  pP1 = p
16060 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
16070 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
16080 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
16090 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
160a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
160b0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
160c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
160d0 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
160e0 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
160f0 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
16100 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
16110 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
16120 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64  ader)==16 );.  d
16130 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28  ata[16] = (u8)((
16140 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38  pBt->pageSize>>8
16150 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
16160 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  17] = (u8)((pBt-
16170 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30  >pageSize>>16)&0
16180 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  xff);.  data[18]
16190 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
161a0 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
161b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c  pBt->usableSize<
161c0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  =pBt->pageSize &
161d0 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  & pBt->usableSiz
161e0 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65  e+255>=pBt->page
161f0 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30  Size);.  data[20
16200 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61  ] = (u8)(pBt->pa
16210 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
16220 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  ableSize);.  dat
16230 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61  a[21] = 64;.  da
16240 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64  ta[22] = 32;.  d
16250 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20  ata[23] = 32;.  
16260 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
16270 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
16280 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
16290 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
162a0 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
162b0 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ;.  pBt->btsFlag
162c0 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
162d0 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
162e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
162f0 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
16300 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
16310 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
16320 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
16330 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
16340 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
16350 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
16360 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
16370 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
16380 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
16390 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
163a0 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
163b0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
163c0 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50  #endif.  pBt->nP
163d0 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  age = 1;.  data[
163e0 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  31] = 1;.  retur
163f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16400 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
16410 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
16420 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
16430 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61  file (creating a
16440 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
16450 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e  sisting of a sin
16460 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20  gle page and no 
16470 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e  schema objects).
16480 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
16490 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66  K.** if successf
164a0 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
164b0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
164c0 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
164d0 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62 28  lite3BtreeNewDb(
164e0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
164f0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
16500 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
16510 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30  ->pBt->nPage = 0
16520 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61  ;.  rc = newData
16530 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20  base(p->pBt);.  
16540 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16550 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
16560 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
16570 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e  mpt to start a n
16580 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ew transaction. 
16590 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
165a0 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65  ion.** is starte
165b0 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  d if the second 
165c0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a  argument is nonz
165d0 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ero, otherwise a
165e0 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61   read-.** transa
165f0 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ction.  If the s
16600 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
16610 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20  s 2 or more and 
16620 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61  exclusive.** tra
16630 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
16640 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  ted, meaning tha
16650 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
16660 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  ss is allowed.**
16670 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
16680 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65  atabase.  A pree
16690 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74  xisting transact
166a0 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ion may not be.*
166b0 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78  * upgraded to ex
166c0 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69  clusive by calli
166d0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
166e0 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20  a second time - 
166f0 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69  the.** exclusivi
16700 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72  ty flag only wor
16710 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61  ks for a new tra
16720 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
16730 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
16740 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
16750 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  ted before attem
16760 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68  pting any .** ch
16770 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
16780 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20  abase.  None of 
16790 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
167a0 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20  utines .** will 
167b0 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72  work unless a tr
167c0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
167d0 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a  rted first:.**.*
167e0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
167f0 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
16800 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
16810 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78  BtreeCreateIndex
16820 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
16830 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
16840 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
16850 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
16860 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
16870 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29  te3BtreeInsert()
16880 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
16890 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a  BtreeDelete().**
168a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
168b0 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a  eeUpdateMeta().*
168c0 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69  *.** If an initi
168d0 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  al attempt to ac
168e0 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66  quire the lock f
168f0 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20  ails because of 
16900 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a  lock contention.
16910 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
16920 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ase was previous
16930 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  ly unlocked, the
16940 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  n invoke the bus
16950 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20  y handler.** if 
16960 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42  there is one.  B
16970 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ut if there was 
16980 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61  previously a rea
16990 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a  d-lock, do not.*
169a0 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
169b0 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74  y handler - just
169c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
169d0 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53  USY.  SQLITE_BUS
169e0 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  Y is .** returne
169f0 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
16a00 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
16a10 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ock in order to 
16a20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b  avoid a deadlock
16a30 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ..**.** Suppose 
16a40 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72  there are two pr
16a50 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e  ocesses A and B.
16a60 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c    A has a read l
16a70 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a  ock and B has.**
16a80 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
16a90 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72  .  B tries to pr
16aa0 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69  omote to exclusi
16ab0 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ve but is blocke
16ac0 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20  d because.** of 
16ad0 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20  A's read lock.  
16ae0 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  A tries to promo
16af0 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62  te to reserved b
16b00 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79  ut is blocked by
16b10 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68   B..** One or th
16b20 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74  e other of the t
16b30 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73  wo processes mus
16b40 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68  t give way or th
16b50 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f  ere can be.** no
16b60 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72   progress.  By r
16b70 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
16b80 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76  BUSY and not inv
16b90 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63  oking the busy c
16ba0 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20  allback.** when 
16bb0 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
16bc0 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e  read lock, we en
16bd0 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76  courage A to giv
16be0 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a  e up and let B.*
16bf0 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e  * proceed..*/.in
16c00 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
16c10 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  ginTrans(Btree *
16c20 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a  p, int wrflag){.
16c30 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63    sqlite3 *pBloc
16c40 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65  k = 0;.  BtShare
16c50 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
16c60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16c70 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65  TE_OK;..  sqlite
16c80 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16c90 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
16ca0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
16cb0 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61  e btree is alrea
16cc0 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72  dy in a write-tr
16cd0 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74  ansaction, or it
16ce0 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  .  ** is already
16cf0 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73   in a read-trans
16d00 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61  action and a rea
16d10 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d-transaction.  
16d20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ** is requested,
16d30 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
16d40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
16d50 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
16d60 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72  RITE || (p->inTr
16d70 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ans==TRANS_READ 
16d80 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20  && !wrflag) ){. 
16d90 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
16da0 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  gun;.  }.  asser
16db0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
16dc0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
16dd0 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41  TE || IfNotOmitA
16de0 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61  V(pBt->bDoTrunca
16df0 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  te)==0 );..  /* 
16e00 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  Write transactio
16e10 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69  ns are not possi
16e20 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e  ble on a read-on
16e30 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
16e40 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
16e50 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
16e60 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61  NLY)!=0 && wrfla
16e70 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
16e80 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
16e90 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
16ea0 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
16eb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
16ec0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20  ARED_CACHE.  /* 
16ed0 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
16ee0 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
16ef0 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
16f00 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
16f10 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  n .  ** on this 
16f20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
16f30 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
16f40 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
16f50 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65  ction is.  ** re
16f60 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
16f70 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
16f80 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61   */.  if( (wrfla
16f90 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
16fa0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
16fb0 52 49 54 45 29 0a 20 20 20 7c 7c 20 28 70 42 74  RITE).   || (pBt
16fc0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
16fd0 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 29  _PENDING)!=0.  )
16fe0 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70  {.    pBlock = p
16ff0 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b  Bt->pWriter->db;
17000 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66  .  }else if( wrf
17010 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c  lag>1 ){.    BtL
17020 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20  ock *pIter;.    
17030 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
17040 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
17050 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
17060 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
17070 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a  r->pBtree!=p ){.
17080 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d          pBlock =
17090 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e   pIter->pBtree->
170a0 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  db;.        brea
170b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
170c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63  .  }.  if( pBloc
170d0 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
170e0 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
170f0 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29  d(p->db, pBlock)
17100 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
17110 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
17120 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74  ACHE;.    goto t
17130 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
17140 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79  #endif..  /* Any
17150 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65   read-only or re
17160 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63  ad-write transac
17170 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72  tion implies a r
17180 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a  ead-lock on .  *
17190 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20  * page 1. So if 
171a0 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65  some other share
171b0 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61  d-cache client a
171c0 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69  lready has a wri
171d0 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e  te-lock .  ** on
171e0 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61   page 1, the tra
171f0 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  nsaction cannot 
17200 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  be opened. */.  
17210 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64  rc = queryShared
17220 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
17230 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52  , MASTER_ROOT, R
17240 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  EAD_LOCK);.  if(
17250 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
17260 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
17270 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c  n;..  pBt->btsFl
17280 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54  ags &= ~BTS_INIT
17290 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69  IALLY_EMPTY;.  i
172a0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30  f( pBt->nPage==0
172b0 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
172c0 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c   |= BTS_INITIALL
172d0 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a  Y_EMPTY;.  do {.
172e0 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b      /* Call lock
172f0 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69  Btree() until ei
17300 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31  ther pBt->pPage1
17310 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72   is populated or
17320 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65  .    ** lockBtre
17330 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65  e() returns some
17340 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
17350 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b   SQLITE_OK. lock
17360 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d  Btree().    ** m
17370 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
17380 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42  _OK but leave pB
17390 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f  t->pPage1 set to
173a0 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20   0 if after.    
173b0 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20  ** reading page 
173c0 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74  1 it discovers t
173d0 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
173e0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
173f0 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69  e .    ** file i
17400 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53  s not pBt->pageS
17410 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ize. In this cas
17420 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69  e lockBtree() wi
17430 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a  ll update.    **
17440 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74   pBt->pageSize t
17450 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  o the page-size 
17460 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
17470 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  isk..    */.    
17480 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67  while( pBt->pPag
17490 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  e1==0 && SQLITE_
174a0 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74  OK==(rc = lockBt
174b0 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  ree(pBt)) );..  
174c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
174d0 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
174e0 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74 2d  .      if( (pBt-
174f0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
17500 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b  READ_ONLY)!=0 ){
17510 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
17520 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
17530 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17540 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17550 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e  PagerBegin(pBt->
17560 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c  pPager,wrflag>1,
17570 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
17580 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  ory(p->db));.   
17590 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
175a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
175b0 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
175c0 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
175d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
175e0 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63   }.  .    if( rc
175f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17600 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
17610 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
17620 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28     }.  }while( (
17630 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45  rc&0xFF)==SQLITE
17640 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e  _BUSY && pBt->in
17650 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
17660 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20  NS_NONE &&.     
17670 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65       btreeInvoke
17680 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29  BusyHandler(pBt)
17690 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
176a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
176b0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
176c0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
176d0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
176e0 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66  ction++;.#ifndef
176f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
17700 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
17710 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
17720 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
17730 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  t( p->lock.pBtre
17740 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e  e==p && p->lock.
17750 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20  iTable==1 );.   
17760 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f       p->lock.eLo
17770 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
17780 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
17790 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
177a0 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  ck;.        pBt-
177b0 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63  >pLock = &p->loc
177c0 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  k;.      }.#endi
177d0 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  f.    }.    p->i
177e0 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67  nTrans = (wrflag
177f0 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41  ?TRANS_WRITE:TRA
17800 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66  NS_READ);.    if
17810 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74  ( p->inTrans>pBt
17820 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
17830 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
17840 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d  Transaction = p-
17850 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a  >inTrans;.    }.
17860 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29      if( wrflag )
17870 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  {.      MemPage 
17880 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
17890 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53  Page1;.#ifndef S
178a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
178b0 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61 73  D_CACHE.      as
178c0 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69  sert( !pBt->pWri
178d0 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ter );.      pBt
178e0 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20  ->pWriter = p;. 
178f0 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
17900 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55  gs &= ~BTS_EXCLU
17910 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20  SIVE;.      if( 
17920 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e  wrflag>1 ) pBt->
17930 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
17940 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69  EXCLUSIVE;.#endi
17950 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  f..      /* If t
17960 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65  he db-size heade
17970 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72  r field is incor
17980 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79 20  rect (as it may 
17990 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20  be if an old.   
179a0 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73     ** client has
179b0 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68   been writing th
179c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
179d0 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e  , update it now.
179e0 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   Doing.      ** 
179f0 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68  this sooner rath
17a00 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65  er than later me
17a10 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
17a20 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79   size can safely
17a30 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65   .      ** re-re
17a40 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
17a50 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31  size from page 1
17a60 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   if a savepoint 
17a70 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  or transaction. 
17a80 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
17a90 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
17aa0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
17ab0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
17ac0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67  f( pBt->nPage!=g
17ad0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
17ae0 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20  >aData[28]) ){. 
17af0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17b00 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
17b10 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
17b20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
17b30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17b40 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
17b50 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
17b60 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
17b70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17b80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74   }.    }.  }...t
17b90 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66  rans_begun:.  if
17ba0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17bb0 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
17bc0 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61   /* This call ma
17bd0 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68  kes sure that th
17be0 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
17bf0 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f  correct number o
17c00 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61  f.    ** open sa
17c10 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65  vepoints. If the
17c20 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
17c30 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
17c40 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74  n 0 and.    ** t
17c50 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
17c60 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
17c70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  en, then it will
17c80 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e   be opened here.
17c90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
17ca0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
17cb0 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
17cc0 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e  pPager, p->db->n
17cd0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
17ce0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
17cf0 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  y(p);.  sqlite3B
17d00 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17d10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
17d20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17d30 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a  T_AUTOVACUUM../*
17d40 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e  .** Set the poin
17d50 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
17d60 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  for all children
17d70 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20   of page pPage. 
17d80 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67  Also, if.** pPag
17d90 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73  e contains cells
17da0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
17db0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73  verflow pages, s
17dc0 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  et the pointer.*
17dd0 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  * map entries fo
17de0 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
17df0 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ages as well..*/
17e00 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43  .static int setC
17e10 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50  hildPtrmaps(MemP
17e20 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
17e30 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
17e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e50 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72    /* Counter var
17e60 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  iable */.  int n
17e70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17e90 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
17ea0 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a   in page pPage *
17eb0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
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 2f 2a 20 52 65 74 75 72 6e         /* Return
17ee0 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61   code */.  BtSha
17ef0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
17f00 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e  ->pBt;.  u8 isIn
17f10 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
17f20 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70  isInit;.  Pgno p
17f30 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
17f40 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
17f50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17f60 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
17f70 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74  ex) );.  rc = bt
17f80 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
17f90 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
17fa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
17fb0 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
17fc0 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20  rmaps_out;.  }. 
17fd0 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
17fe0 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d  nCell;..  for(i=
17ff0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
18000 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
18010 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
18020 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61  , i);..    ptrma
18030 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
18040 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a  e, pCell, &rc);.
18050 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
18060 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
18070 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
18080 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
18090 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
180a0 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
180b0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
180c0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  gno, &rc);.    }
180d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
180e0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
180f0 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
18100 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
18110 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
18120 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
18130 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
18140 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
18150 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
18160 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63  &rc);.  }..set_c
18170 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
18180 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  :.  pPage->isIni
18190 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
181a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
181b0 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20  /*.** Somewhere 
181c0 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f  on pPage is a po
181d0 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46  inter to page iF
181e0 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69  rom.  Modify thi
181f0 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20  s pointer so.** 
18200 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
18210 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72  o iTo. Parameter
18220 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73   eType describes
18230 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69   the type of poi
18240 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f  nter to.** be mo
18250 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c  dified, as  foll
18260 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  ows:.**.** PTRMA
18270 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61  P_BTREE:     pPa
18280 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
18290 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
182a0 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c  points at a chil
182b0 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  d .**           
182c0 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20          page of 
182d0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
182e0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70  MAP_OVERFLOW1: p
182f0 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
18300 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
18310 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f  r points at an o
18320 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20  verflow.**      
18330 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
18340 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
18350 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  one of the cells
18360 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   on pPage..**.**
18370 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
18380 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f  2: pPage is an o
18390 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68  verflow-page. Th
183a0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
183b0 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   at the next.** 
183c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183d0 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20    overflow page 
183e0 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  in the list..*/.
183f0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66  static int modif
18400 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d  yPagePointer(Mem
18410 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e  Page *pPage, Pgn
18420 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54  o iFrom, Pgno iT
18430 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20  o, u8 eType){.  
18440 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
18450 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
18460 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
18470 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
18480 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
18490 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
184a0 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70  e) );.  if( eTyp
184b0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
184c0 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  OW2 ){.    /* Th
184d0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77  e pointer is alw
184e0 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ays the first 4 
184f0 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67  bytes of the pag
18500 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  e in this case. 
18510 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34   */.    if( get4
18520 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
18530 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  a)!=iFrom ){.   
18540 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18550 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
18560 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
18570 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
18580 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
18590 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67     u8 isInitOrig
185a0 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
185b0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
185c0 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20   int nCell;..   
185d0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
185e0 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c  Page);.    nCell
185f0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
18600 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
18610 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
18620 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
18630 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
18640 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  i);.      if( eT
18650 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
18660 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20  FLOW1 ){.       
18670 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
18680 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72          btreePar
18690 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
186a0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
186b0 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
186c0 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  .iOverflow.     
186d0 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66      && pCell+inf
186e0 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70  o.iOverflow+3<=p
186f0 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67  Page->aData+pPag
18700 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20 20  e->maskPage.    
18710 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67       && iFrom==g
18720 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
18730 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a  nfo.iOverflow]).
18740 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
18750 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
18760 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
18770 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  low], iTo);.    
18780 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
187a0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
187b0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d  get4byte(pCell)=
187c0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
187d0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
187e0 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  ll, iTo);.      
187f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
18800 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18810 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d   }.  .    if( i=
18820 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =nCell ){.      
18830 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
18840 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20  P_BTREE || .    
18850 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
18860 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
18870 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
18880 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
18890 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
188a0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
188b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75        }.      pu
188c0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
188d0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
188e0 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a  ffset+8], iTo);.
188f0 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
18900 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
18910 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74  tOrig;.  }.  ret
18920 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
18930 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
18940 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
18950 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20  page pDbPage to 
18960 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61  location iFreePa
18970 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ge in the .** da
18980 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50  tabase. The pDbP
18990 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65  age reference re
189a0 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a  mains valid..**.
189b0 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20  ** The isCommit 
189c0 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74  flag indicates t
189d0 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
189e0 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
189f0 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75   that.** the jou
18a00 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
18a10 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
18a20 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
18a30 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a  DbPage->pgno .**
18a40 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
18a50 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68  to. The caller h
18a60 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69  as already promi
18a70 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65  sed not to write
18a80 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65   to that.** page
18a90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18aa0 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20  relocatePage(.  
18ab0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
18ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
18ad0 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
18ae0 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20  pDbPage,        
18af0 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20  /* Open page to 
18b00 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  move */.  u8 eTy
18b10 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
18b20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
18b30 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66  p 'type' entry f
18b40 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
18b50 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20  Pgno iPtrPage,  
18b60 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
18b70 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f  ter map 'page-no
18b80 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
18b90 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  age */.  Pgno iF
18ba0 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20  reePage,        
18bb0 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f    /* The locatio
18bc0 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67  n to move pDbPag
18bd0 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73  e to */.  int is
18be0 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20  Commit          
18bf0 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66     /* isCommit f
18c00 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73 71  lag passed to sq
18c10 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
18c20 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  ge */.){.  MemPa
18c30 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20  ge *pPtrPage;   
18c40 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
18c50 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
18c60 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a  ter to pDbPage *
18c70 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65  /.  Pgno iDbPage
18c80 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f   = pDbPage->pgno
18c90 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
18ca0 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
18cb0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
18cc0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52  sert( eType==PTR
18cd0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c  MAP_OVERFLOW2 ||
18ce0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
18cf0 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20  VERFLOW1 || .   
18d00 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50     eType==PTRMAP
18d10 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
18d20 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
18d30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
18d40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
18d50 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
18d60 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67    assert( pDbPag
18d70 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a  e->pBt==pBt );..
18d80 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69    /* Move page i
18d90 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20  DbPage from its 
18da0 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
18db0 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
18dc0 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54  iFreePage */.  T
18dd0 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55  RACE(("AUTOVACUU
18de0 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20  M: Moving %d to 
18df0 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74  free page %d (pt
18e00 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25  r page %d type %
18e10 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44  d)\n", .      iD
18e20 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
18e30 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70  , iPtrPage, eTyp
18e40 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  e));.  rc = sqli
18e50 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
18e60 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65  (pPager, pDbPage
18e70 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65  ->pDbPage, iFree
18e80 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b  Page, isCommit);
18e90 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18ea0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
18eb0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62  rn rc;.  }.  pDb
18ec0 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72  Page->pgno = iFr
18ed0 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66  eePage;..  /* If
18ee0 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62   pDbPage was a b
18ef0 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20  tree-page, then 
18f00 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c  it may have chil
18f10 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63  d pages and/or c
18f20 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70  ells.  ** that p
18f30 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
18f40 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e   pages. The poin
18f50 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
18f60 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20  for all these.  
18f70 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ** pages need to
18f80 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a   be changed..  *
18f90 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67  *.  ** If pDbPag
18fa0 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
18fb0 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
18fc0 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61  first 4 bytes ma
18fd0 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70  y store a.  ** p
18fe0 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73  ointer to a subs
18ff0 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
19000 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
19010 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a   the case, then.
19020 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72    ** the pointer
19030 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65   map needs to be
19040 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65   updated for the
19050 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
19060 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
19070 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
19080 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
19090 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
190a0 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
190b0 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
190c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
190d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
190e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
190f0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rc;.    }.  }els
19100 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  e{.    Pgno next
19110 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
19120 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  pDbPage->aData);
19130 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66  .    if( nextOvf
19140 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74  l!=0 ){.      pt
19150 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78  rmapPut(pBt, nex
19160 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  tOvfl, PTRMAP_OV
19170 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61  ERFLOW2, iFreePa
19180 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ge, &rc);.      
19190 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
191a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
191b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
191c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
191d0 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65  Fix the database
191e0 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65   pointer on page
191f0 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70   iPtrPage that p
19200 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67  ointed at iDbPag
19210 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69  e so.  ** that i
19220 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65  t points at iFre
19230 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20  ePage. Also fix 
19240 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
19250 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69  entry for.  ** i
19260 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  PtrPage..  */.  
19270 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
19280 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
19290 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
192a0 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67  age(pBt, iPtrPag
192b0 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29  e, &pPtrPage, 0)
192c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
192d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
192e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
192f0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
19300 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74  e3PagerWrite(pPt
19310 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  rPage->pDbPage);
19320 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
19330 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19340 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
19350 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
19360 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
19370 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67    rc = modifyPag
19380 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67  ePointer(pPtrPag
19390 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65  e, iDbPage, iFre
193a0 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20  ePage, eType);. 
193b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
193c0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
193d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
193e0 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
193f0 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67  ut(pBt, iFreePag
19400 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  e, eType, iPtrPa
19410 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  ge, &rc);.    }.
19420 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19430 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
19440 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69  eclaration requi
19450 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75  red by incrVacuu
19460 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74  mStep(). */.stat
19470 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
19480 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65  treePage(BtShare
19490 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c  d *, MemPage **,
194a0 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75   Pgno *, Pgno, u
194b0 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f  8);../*.** Perfo
194c0 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70  rm a single step
194d0 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   of an increment
194e0 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75  al-vacuum. If su
194f0 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
19500 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  .** SQLITE_OK. I
19510 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f  f there is no wo
19520 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68  rk to do (and th
19530 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74  erefore no point
19540 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   in .** calling 
19550 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
19560 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c  ain), return SQL
19570 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66  ITE_DONE. Or, if
19580 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   an error .** oc
19590 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d  curs, return som
195a0 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
195b0 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  de..**.** More s
195c0 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69  pecifically, thi
195d0 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
195e0 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69  pts to re-organi
195f0 7a 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ze the database 
19600 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  so .** that the 
19610 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  last page of the
19620 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
19630 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e  in use is no lon
19640 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  ger in use..**.*
19650 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e  * Parameter nFin
19660 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
19670 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68 69  f pages that thi
19680 73 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64  s database would
19690 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65   contain.** were
196a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
196b0 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72  alled until it r
196c0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
196d0 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  NE..**.** If the
196e0 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74   bCommit paramet
196f0 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
19700 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
19710 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a  sumes that the .
19720 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b  ** caller will k
19730 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72  eep calling incr
19740 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74  VacuumStep() unt
19750 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  il it returns SQ
19760 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72  LITE_DONE .** or
19770 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d   an error. bComm
19780 69 74 20 69 73 20 70 61 73 73 65 64 20 74 72 75  it is passed tru
19790 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  e for an auto-va
197a0 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a  cuum-on-commit .
197b0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72  ** operation, or
197c0 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e   false for an in
197d0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
197e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
197f0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42  incrVacuumStep(B
19800 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
19810 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c  no nFin, Pgno iL
19820 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d  astPg, int bComm
19830 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65  it){.  Pgno nFre
19840 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  eList;          
19850 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
19860 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65  ges still on the
19870 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20   free-list */.  
19880 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
19890 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
198a0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
198b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
198c0 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a  LastPg>nFin );..
198d0 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53    if( !PTRMAP_IS
198e0 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
198f0 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50  g) && iLastPg!=P
19900 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
19910 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20  (pBt) ){.    u8 
19920 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20  eType;.    Pgno 
19930 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e  iPtrPage;..    n
19940 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62  FreeList = get4b
19950 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
19960 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
19970 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d    if( nFreeList=
19980 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
19990 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
199a0 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
199b0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
199c0 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20  LastPg, &eType, 
199d0 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
199e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
199f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
19a00 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
19a10 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
19a20 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
19a30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19a40 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
19a50 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65      }..    if( e
19a60 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
19a70 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69  EPAGE ){.      i
19a80 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
19a90 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
19aa0 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ve the page from
19ab0 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d   the files free-
19ac0 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  list. This is no
19ad0 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20  t required.     
19ae0 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74     ** if bCommit
19af0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   is non-zero. In
19b00 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
19b10 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  free-list will b
19b20 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75  e.        ** tru
19b30 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61  ncated to zero a
19b40 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
19b50 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69  on returns, so i
19b60 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20  t doesn't .     
19b70 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20     ** matter if 
19b80 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  it still contain
19b90 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65  s some garbage e
19ba0 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20  ntries..        
19bb0 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
19bc0 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  iFreePg;.       
19bd0 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
19be0 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
19bf0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
19c00 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
19c10 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74   &iFreePg, iLast
19c20 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43  Pg, BTALLOC_EXAC
19c30 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
19c40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19c50 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
19c60 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
19c70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19c80 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67  iFreePg==iLastPg
19c90 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   );.        rele
19ca0 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
19cb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
19cc0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e  else {.      Pgn
19cd0 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20  o iFreePg;      
19ce0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
19cf0 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20  of free page to 
19d00 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20  move pLastPg to 
19d10 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
19d20 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20   *pLastPg;.     
19d30 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c   u8 eMode = BTAL
19d40 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f  LOC_ANY;   /* Mo
19d50 64 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  de parameter for
19d60 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
19d70 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67  ge() */.      Pg
19d80 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20  no iNear = 0;   
19d90 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62          /* nearb
19da0 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  y parameter for 
19db0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
19dc0 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63  e() */..      rc
19dd0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
19de0 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70  pBt, iLastPg, &p
19df0 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20  LastPg, 0);.    
19e00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19e10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
19e20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
19e30 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62  }..      /* If b
19e40 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20  Commit is zero, 
19e50 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65  this loop runs e
19e60 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20  xactly once and 
19e70 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20  page pLastPg.   
19e80 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64     ** is swapped
19e90 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
19ea0 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64  free page pulled
19eb0 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69   off the free li
19ec0 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  st..      **.   
19ed0 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68     ** On the oth
19ee0 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d  er hand, if bCom
19ef0 6d 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74  mit is greater t
19f00 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b  han zero, then k
19f10 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f  eep.      ** loo
19f20 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65  ping until a fre
19f30 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77  e-page located w
19f40 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20  ithin the first 
19f50 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20  nFin pages.     
19f60 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20   ** of the file 
19f70 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20  is found..      
19f80 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f  */.      if( bCo
19f90 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mmit==0 ){.     
19fa0 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c     eMode = BTALL
19fb0 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69  OC_LE;.        i
19fc0 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  Near = nFin;.   
19fd0 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a     }.      do {.
19fe0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
19ff0 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
1a000 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
1a010 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
1a020 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
1a030 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b  , iNear, eMode);
1a040 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1a050 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a060 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1a070 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
1a080 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1a090 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1a0a0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1a0b0 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
1a0c0 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74   }while( bCommit
1a0d0 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e   && iFreePg>nFin
1a0e0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1a0f0 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50  ( iFreePg<iLastP
1a100 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  g );.      .    
1a110 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
1a120 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67  age(pBt, pLastPg
1a130 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
1a140 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d  e, iFreePg, bCom
1a150 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  mit);.      rele
1a160 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
1a170 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1a180 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a190 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1a1a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a1b0 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74  }..  if( bCommit
1a1c0 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a  ==0 ){.    do {.
1a1d0 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b        iLastPg--;
1a1e0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61  .    }while( iLa
1a1f0 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg==PENDING_BY
1a200 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20  TE_PAGE(pBt) || 
1a210 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1a220 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20  t, iLastPg) );. 
1a230 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63     pBt->bDoTrunc
1a240 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74  ate = 1;.    pBt
1a250 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50  ->nPage = iLastP
1a260 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
1a270 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1a280 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73 65  .** The database
1a290 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 66   opened by the f
1a2a0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
1a2b0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
1a2c0 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69  database.** nOri
1a2d0 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20  g pages in size 
1a2e0 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65  containing nFree
1a2f0 20 66 72 65 65 20 70 61 67 65 73 2e 20 52 65 74   free pages. Ret
1a300 75 72 6e 20 74 68 65 20 65 78 70 65 63 74 65 64  urn the expected
1a310 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65   .** size of the
1a320 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67   database in pag
1a330 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  es following an 
1a340 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72  auto-vacuum oper
1a350 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
1a360 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a   Pgno finalDbSiz
1a370 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  e(BtShared *pBt,
1a380 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e   Pgno nOrig, Pgn
1a390 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20  o nFree){.  int 
1a3a0 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20  nEntry;         
1a3b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1a3c0 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1a3d0 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70   on one ptrmap p
1a3e0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50  age */.  Pgno nP
1a3f0 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20  trmap;          
1a400 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1a410 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67  er of PtrMap pag
1a420 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a  es to be freed *
1a430 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20  /.  Pgno nFin;  
1a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a450 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
1a460 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79  lue */..  nEntry
1a470 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
1a480 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20  ze/5;.  nPtrmap 
1a490 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50  = (nFree-nOrig+P
1a4a0 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
1a4b0 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29  , nOrig)+nEntry)
1a4c0 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20  /nEntry;.  nFin 
1a4d0 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20  = nOrig - nFree 
1a4e0 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28  - nPtrmap;.  if(
1a4f0 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42   nOrig>PENDING_B
1a500 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26  YTE_PAGE(pBt) &&
1a510 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59   nFin<PENDING_BY
1a520 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1a530 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a      nFin--;.  }.
1a540 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
1a550 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e  ISPAGE(pBt, nFin
1a560 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49  ) || nFin==PENDI
1a570 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1a580 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b  ) ){.    nFin--;
1a590 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e  .  }..  return n
1a5a0 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  Fin;.}../*.** A 
1a5b0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1a5c0 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64  n must be opened
1a5d0 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
1a5e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
1a5f0 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20  * It performs a 
1a600 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77  single unit of w
1a610 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69  ork towards an i
1a620 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
1a630 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  m..**.** If the 
1a640 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
1a650 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61  um is finished a
1a660 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
1a670 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53  on has run,.** S
1a680 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
1a690 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73  turned. If it is
1a6a0 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62   not finished, b
1a6b0 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
1a6c0 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  rred,.** SQLITE_
1a6d0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1a6e0 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c  Otherwise an SQL
1a6f0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
1a700 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1a710 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42  treeIncrVacuum(B
1a720 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1a730 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
1a740 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
1a750 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1a760 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
1a770 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1a780 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1a790 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
1a7a0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1a7b0 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56   if( !pBt->autoV
1a7c0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
1a7d0 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1a7e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
1a7f0 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61   nOrig = btreePa
1a800 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
1a810 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67    Pgno nFree = g
1a820 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
1a830 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1a840 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20  ;.    Pgno nFin 
1a850 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42  = finalDbSize(pB
1a860 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29  t, nOrig, nFree)
1a870 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67  ;..    if( nOrig
1a880 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72  <nFin ){.      r
1a890 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1a8a0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  PT_BKPT;.    }el
1a8b0 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29  se if( nFree>0 )
1a8c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
1a8d0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
1a8e0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
1a8f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a900 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c  ){.        inval
1a910 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
1a920 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20  Cache(pBt);.    
1a930 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
1a940 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
1a950 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20  n, nOrig, 0);.  
1a960 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1a970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a980 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1a990 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1a9a0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
1a9b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
1a9c0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1a9d0 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
1a9e0 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
1a9f0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
1aa00 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1aa10 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
1aa20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
1aa30 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1aa40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1aa50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1aa60 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f   called prior to
1aa70 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1aa80 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73  mit when a trans
1aa90 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d  action.** is com
1aaa0 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75  mitted for an au
1aab0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1aac0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  se..**.** If SQL
1aad0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1aae0 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e  ed, then *pnTrun
1aaf0 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
1ab00 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
1ab10 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1ab20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74  file should be t
1ab30 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69  runcated to duri
1ab40 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72  ng the commit pr
1ab50 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20  ocess. .** i.e. 
1ab60 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
1ab70 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65   been reorganize
1ab80 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74  d so that only t
1ab90 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e  he first *pnTrun
1aba0 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69  c.** pages are i
1abb0 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
1abc0 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43   int autoVacuumC
1abd0 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a  ommit(BtShared *
1abe0 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pBt){.  int rc =
1abf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
1ac00 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
1ac10 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41  t->pPager;.  VVA
1ac20 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20  _ONLY( int nRef 
1ac30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
1ac40 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
1ac50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1ac60 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1ac70 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1ac80 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
1ac90 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
1aca0 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e  ;.  assert(pBt->
1acb0 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69  autoVacuum);.  i
1acc0 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63  f( !pBt->incrVac
1acd0 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
1ace0 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  nFin;         /*
1acf0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1ad00 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66 74   in database aft
1ad10 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67  er autovacuuming
1ad20 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72   */.    Pgno nFr
1ad30 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ee;        /* Nu
1ad40 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
1ad50 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e   the freelist in
1ad60 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50  itially */.    P
1ad70 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20  gno iFree;      
1ad80 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61    /* The next pa
1ad90 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a  ge to be freed *
1ada0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67  /.    Pgno nOrig
1adb0 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
1adc0 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65  base size before
1add0 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20   freeing */..   
1ade0 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61   nOrig = btreePa
1adf0 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
1ae00 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50    if( PTRMAP_ISP
1ae10 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20  AGE(pBt, nOrig) 
1ae20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e  || nOrig==PENDIN
1ae30 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1ae40 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20   ){.      /* It 
1ae50 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
1ae60 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61  to create a data
1ae70 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74  base for which t
1ae80 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20  he final page.  
1ae90 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72      ** is either
1aea0 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
1aeb0 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69  age or the pendi
1aec0 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66  ng-byte page. If
1aed0 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73   one.      ** is
1aee0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
1aef0 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72  is indicates cor
1af00 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ruption..      *
1af10 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
1af20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1af30 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  PT;.    }..    n
1af40 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
1af50 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1af60 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46  ata[36]);.    nF
1af70 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65  in = finalDbSize
1af80 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72  (pBt, nOrig, nFr
1af90 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69  ee);.    if( nFi
1afa0 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e  n>nOrig ) return
1afb0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1afc0 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46  BKPT;.    if( nF
1afd0 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20  in<nOrig ){.    
1afe0 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
1aff0 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
1b000 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1b010 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72  iFree=nOrig; iFr
1b020 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53  ee>nFin && rc==S
1b030 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d  QLITE_OK; iFree-
1b040 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69  -){.      rc = i
1b050 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
1b060 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20  t, nFin, iFree, 
1b070 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
1b080 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  ( (rc==SQLITE_DO
1b090 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  NE || rc==SQLITE
1b0a0 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20  _OK) && nFree>0 
1b0b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1b0c0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1b0d0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
1b0e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74  Page);.      put
1b0f0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1b100 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30  e1->aData[32], 0
1b110 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
1b120 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1b130 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20  aData[36], 0);. 
1b140 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1b150 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1b160 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20  a[28], nFin);.  
1b170 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e      pBt->bDoTrun
1b180 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  cate = 1;.      
1b190 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69  pBt->nPage = nFi
1b1a0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
1b1b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b1c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1b1d0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
1b1e0 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
1b1f0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e  .  assert( nRef>
1b200 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66  =sqlite3PagerRef
1b210 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
1b220 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b230 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66  .#else /* ifndef
1b240 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1b250 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66  OVACUUM */.# def
1b260 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d  ine setChildPtrm
1b270 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b  aps(x) SQLITE_OK
1b280 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1b290 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
1b2a0 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
1b2b0 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20   of a two-phase 
1b2c0 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f  commit.  This ro
1b2d0 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20  utine.** causes 
1b2e0 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
1b2f0 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  al to be created
1b300 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74   (if it does not
1b310 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a   already exist).
1b320 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ** and populated
1b330 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66   with enough inf
1b340 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74  ormation so that
1b350 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73   if a power loss
1b360 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64   occurs.** the d
1b370 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72  atabase can be r
1b380 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
1b390 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79  riginal state by
1b3a0 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a   playing back.**
1b3b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54   the journal.  T
1b3c0 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hen the contents
1b3d0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1b3e0 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20  are flushed out 
1b3f0 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20  to.** the disk. 
1b400 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e   After the journ
1b410 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20  al is safely on 
1b420 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67  oxide, the chang
1b430 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74  es to the.** dat
1b440 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65  abase are writte
1b450 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  n into the datab
1b460 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75  ase file and flu
1b470 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a  shed to oxide..*
1b480 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
1b490 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72  this call, the r
1b4a0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1b4b0 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20  still exists on 
1b4c0 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
1b4d0 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c  we are still hol
1b4e0 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20  ding all locks, 
1b4f0 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  so the transacti
1b500 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f  on has not.** co
1b510 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71  mmitted.  See sq
1b520 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1b530 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74  PhaseTwo() for t
1b540 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
1b550 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74  of the.** commit
1b560 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
1b570 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  This call is a n
1b580 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65  o-op if no write
1b590 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
1b5a0 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
1b5b0 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f   on pBt..**.** O
1b5c0 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74  therwise, sync t
1b5d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b5e0 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70   for the btree p
1b5f0 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  Bt. zMaster poin
1b600 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d  ts to.** the nam
1b610 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
1b620 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
1b630 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
1b640 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e  n into the.** in
1b650 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
1b660 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c   file, or is NUL
1b670 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f  L, indicating no
1b680 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b690 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65  file .** (single
1b6a0 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
1b6b0 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68  ction)..**.** Wh
1b6c0 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
1b6d0 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  d, the master jo
1b6e0 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72  urnal should alr
1b6f0 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a  eady have been.*
1b700 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c  * created, popul
1b710 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a  ated with this j
1b720 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
1b730 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  nd synced to dis
1b740 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  k..**.** Once th
1b750 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61  is is routine ha
1b760 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
1b770 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69  only thing requi
1b780 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a  red to commit.**
1b790 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73   the write-trans
1b7a0 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20  action for this 
1b7b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1b7c0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
1b7d0 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  ournal..*/.int s
1b7e0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1b7f0 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20  tPhaseOne(Btree 
1b800 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
1b810 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
1b820 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1b830 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1b840 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1b850 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1b860 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
1b870 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1b880 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53  er(p);.#ifndef S
1b890 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1b8a0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
1b8b0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1b8c0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f  .      rc = auto
1b8d0 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74  VacuumCommit(pBt
1b8e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b8f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b900 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1b910 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
1b920 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1b930 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b940 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75   if( pBt->bDoTru
1b950 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73  ncate ){.      s
1b960 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
1b970 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50  ateImage(pBt->pP
1b980 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65  ager, pBt->nPage
1b990 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
1b9a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b9b0 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
1b9c0 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  One(pBt->pPager,
1b9d0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
1b9e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1b9f0 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
1ba00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ba10 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1ba20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  is called from b
1ba30 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50  oth BtreeCommitP
1ba40 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74  haseTwo() and Bt
1ba50 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a  reeRollback().**
1ba60 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1ba70 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  on of a transact
1ba80 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1ba90 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e  oid btreeEndTran
1baa0 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70  saction(Btree *p
1bab0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1bac0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
1bad0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
1bae0 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
1baf0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
1bb00 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e  utex(p) );..#ifn
1bb10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1bb20 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74  AUTOVACUUM.  pBt
1bb30 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
1bb40 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  0;.#endif.  if( 
1bb50 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
1bb60 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64  _NONE && db->nVd
1bb70 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20  beRead>1 ){.    
1bb80 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
1bb90 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74 61  other active sta
1bba0 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c  tements that bel
1bbb0 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74 61  ong to this data
1bbc0 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64  base.    ** hand
1bbd0 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f  le, downgrade to
1bbe0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
1bbf0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74  nsaction. The ot
1bc00 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20  her statements. 
1bc10 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20     ** may still 
1bc20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  be reading from 
1bc30 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a  the database.  *
1bc40 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41  /.    downgradeA
1bc50 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
1bc60 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
1bc70 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
1bc80 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65  NS_READ;.  }else
1bc90 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
1bca0 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b  handle had any k
1bcb0 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69  ind of transacti
1bcc0 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65  on open, decreme
1bcd0 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74  nt the .    ** t
1bce0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1bcf0 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62   of the shared b
1bd00 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61  tree. If the tra
1bd10 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a  nsaction count .
1bd20 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30      ** reaches 0
1bd30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  , set the shared
1bd40 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1bd50 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b  NONE. The unlock
1bd60 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a  BtreeIfUnused().
1bd70 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f      ** call belo
1bd80 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68  w will unlock th
1bd90 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20  e pager.  */.   
1bda0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
1bdb0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
1bdc0 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61       clearAllSha
1bdd0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1bde0 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74  ks(p);.      pBt
1bdf0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
1be00 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
1be10 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1be20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
1be30 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1be40 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
1be50 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1be60 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65  /* Set the curre
1be70 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
1be80 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
1be90 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  NE and unlock th
1bea0 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  e .    ** pager 
1beb0 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f  if this call clo
1bec0 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61  sed the only rea
1bed0 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
1bee0 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  action.  */.    
1bef0 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
1bf00 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c  NS_NONE;.    unl
1bf10 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1bf20 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
1bf30 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1bf40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
1bf50 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1bf60 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72   currently in pr
1bf70 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ogress..**.** Th
1bf80 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65  is routine imple
1bf90 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64  ments the second
1bfa0 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68   phase of a 2-ph
1bfb0 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65  ase commit.  The
1bfc0 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
1bfd0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
1bfe0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
1bff0 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e  e first phase an
1c000 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69  d should.** be i
1c010 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20  nvoked prior to 
1c020 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
1c030 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74  tine.  The sqlit
1c040 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1c050 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69  seOne().** routi
1c060 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77  ne did all the w
1c070 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69  ork of writing i
1c080 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74  nformation out t
1c090 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68  o disk and flush
1c0a0 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
1c0b0 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  nts so that they
1c0c0 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74   are written ont
1c0d0 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74  o the disk platt
1c0e0 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a  er.  All this.**
1c0f0 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20   routine has to 
1c100 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20  do is delete or 
1c110 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f  truncate or zero
1c120 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74   the header in t
1c130 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  he.** the rollba
1c140 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63  ck journal (whic
1c150 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61  h causes the tra
1c160 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d  nsaction to comm
1c170 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20  it) and.** drop 
1c180 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  locks..**.** Nor
1c190 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  mally, if an err
1c1a0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
1c1b0 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
1c1c0 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  is attempting to
1c1d0 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68   .** finalize th
1c1e0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75  e underlying jou
1c1f0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20  rnal file, this 
1c200 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1c210 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a   an error and.**
1c220 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
1c230 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20   will attempt a 
1c240 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65  rollback. Howeve
1c250 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  r, if the second
1c260 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
1c270 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68  non-zero then th
1c280 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61  is b-tree transa
1c290 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66  ction is part of
1c2a0 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a   a multi-file .*
1c2b0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
1c2c0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
1c2d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1c2e0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
1c2f0 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20  mmitted .** (by 
1c300 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65  deleting a maste
1c310 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  r journal file) 
1c320 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77  and the caller w
1c330 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20  ill ignore this 
1c340 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  .** functions re
1c350 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65  turn code. So, e
1c360 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ven if an error 
1c370 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 70 61  occurs in the pa
1c380 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65  ger layer,.** re
1c390 73 65 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f  set the b-tree o
1c3a0 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20  bjects internal 
1c3b0 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74  state to indicat
1c3c0 65 20 74 68 61 74 20 74 68 65 20 77 72 69 74 65  e that the write
1c3d0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
1c3e0 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e  has been closed.
1c3f0 20 54 68 69 73 20 69 73 20 71 75 69 74 65 20 73   This is quite s
1c400 61 66 65 2c 20 61 73 20 74 68 65 20 70 61 67 65  afe, as the page
1c410 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74  r will have.** t
1c420 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74  ransitioned to t
1c430 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a  he error state..
1c440 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
1c450 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
1c460 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
1c470 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
1c480 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
1c490 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
1c4a0 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
1c4b0 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
1c4c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1c4d0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
1c4e0 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  wo(Btree *p, int
1c4f0 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69   bCleanup){..  i
1c500 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1c510 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75  RANS_NONE ) retu
1c520 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1c530 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1c540 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
1c550 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
1c560 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
1c570 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  as a write-trans
1c580 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d  action open, com
1c590 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62  mit the shared-b
1c5a0 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e  trees .  ** tran
1c5b0 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20  saction and set 
1c5c0 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
1c5d0 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a   to TRANS_READ..
1c5e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
1c5f0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1c600 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
1c610 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
1c620 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1c630 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1c640 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1c650 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20  ANS_WRITE );.   
1c660 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54   assert( pBt->nT
1c670 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a  ransaction>0 );.
1c680 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c690 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
1c6a0 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Two(pBt->pPager)
1c6b0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1c6c0 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61  LITE_OK && bClea
1c6d0 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nup==0 ){.      
1c6e0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1c6f0 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
1c700 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1c710 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1c720 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
1c730 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72  ;.    btreeClear
1c740 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
1c750 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
1c760 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
1c770 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1c780 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1c790 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1c7a0 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61  *.** Do both pha
1c7b0 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e  ses of a commit.
1c7c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1c7d0 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
1c7e0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
1c7f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1c800 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
1c810 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1c820 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b  tPhaseOne(p, 0);
1c830 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1c840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1c850 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1c860 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30  mitPhaseTwo(p, 0
1c870 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1c880 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1c890 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c8a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1c8b0 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  e sets the state
1c8c0 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54   to CURSOR_FAULT
1c8d0 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a   and the error.*
1c8e0 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64  * code to errCod
1c8f0 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73  e for every curs
1c900 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74  or on BtShared t
1c910 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65  hat pBtree.** re
1c920 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
1c930 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
1c940 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69  tripped, includi
1c950 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ng cursors that 
1c960 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68  belong.** to oth
1c970 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
1c980 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70  ections that hap
1c990 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e  pen to be sharin
1c9a0 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77  g.** the cache w
1c9b0 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a  ith pBtree..**.*
1c9c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
1c9d0 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20  ets called when 
1c9e0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
1c9f0 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72  s..** All cursor
1ca00 73 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  s using the same
1ca10 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74   cache must be t
1ca20 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65  ripped.** to pre
1ca30 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74  vent them from t
1ca40 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65  rying to use the
1ca50 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20   btree after.** 
1ca60 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  the rollback.  T
1ca70 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
1ca80 68 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62  have deleted tab
1ca90 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20  les.** or moved 
1caa0 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69  root pages, so i
1cab0 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69  t is not suffici
1cac0 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74  ent to.** save t
1cad0 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
1cae0 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72  cursor.  The cur
1caf0 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69  sor must be.** i
1cb00 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76  nvalidated..*/.v
1cb10 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
1cb20 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42  TripAllCursors(B
1cb30 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e  tree *pBtree, in
1cb40 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74  t errCode){.  Bt
1cb50 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66 28  Cursor *p;.  if(
1cb60 20 70 42 74 72 65 65 3d 3d 30 20 29 20 72 65 74   pBtree==0 ) ret
1cb70 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  urn;.  sqlite3Bt
1cb80 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
1cb90 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65  ;.  for(p=pBtree
1cba0 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
1cbb0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
1cbc0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
1cbd0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1cbe0 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70  Cursor(p);.    p
1cbf0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1cc00 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e  R_FAULT;.    p->
1cc10 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f  skipNext = errCo
1cc20 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  de;.    for(i=0;
1cc30 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b   i<=p->iPage; i+
1cc40 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
1cc50 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b  ePage(p->apPage[
1cc60 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  i]);.      p->ap
1cc70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Page[i] = 0;.   
1cc80 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1cc90 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
1cca0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  e);.}../*.** Rol
1ccb0 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
1ccc0 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
1ccd0 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20  s.  All cursors 
1cce0 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c  will be.** inval
1ccf0 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70 65  ided by this ope
1cd00 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74  ration.  Any att
1cd10 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63 75  empt to use a cu
1cd20 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73  rsor.** that was
1cd30 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67   open at the beg
1cd40 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f  inning of this o
1cd50 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65  peration will re
1cd60 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72  sult.** in an er
1cd70 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ror..**.** This 
1cd80 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
1cd90 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
1cda0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1cdb0 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
1cdc0 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
1cdd0 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
1cde0 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
1cdf0 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
1ce00 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
1ce10 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  k(Btree *p, int 
1ce20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74  tripCode){.  int
1ce30 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
1ce40 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1ce50 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1ce60 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
1ce70 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
1ce80 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
1ce90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1cea0 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65   tripCode = save
1ceb0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
1cec0 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  0, 0);.  }else{.
1ced0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1cee0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72  OK;.  }.  if( tr
1cef0 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  ipCode ){.    sq
1cf00 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
1cf10 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70  lCursors(p, trip
1cf20 43 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 62 74 72  Code);.  }.  btr
1cf30 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1cf40 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1cf50 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1cf60 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a  {.    int rc2;..
1cf70 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e      assert( TRAN
1cf80 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e  S_WRITE==pBt->in
1cf90 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20  Transaction );. 
1cfa0 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
1cfb0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42  PagerRollback(pB
1cfc0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
1cfd0 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
1cfe0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
1cff0 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
1d000 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b   /* The rollback
1d010 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f   may have destro
1d020 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e  yed the pPage1->
1d030 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f  aData value.  So
1d040 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72  .    ** call btr
1d050 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70  eeGetPage() on p
1d060 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d  age 1 again to m
1d070 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
1d080 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73  pPage1->aData is
1d090 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
1d0a0 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65 65  */.    if( btree
1d0b0 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
1d0c0 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c  &pPage1, 0)==SQL
1d0d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d0e0 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34  int nPage = get4
1d0f0 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61  byte(28+(u8*)pPa
1d100 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  ge1->aData);.   
1d110 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61     testcase( nPa
1d120 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ge==0 );.      i
1d130 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71  f( nPage==0 ) sq
1d140 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1d150 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
1d160 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
1d170 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e  testcase( pBt->n
1d180 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20  Page!=nPage );. 
1d190 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
1d1a0 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72  = nPage;.      r
1d1b0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
1d1c0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
1d1d0 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64  sert( countValid
1d1e0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d  Cursors(pBt, 1)=
1d1f0 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  =0 );.    pBt->i
1d200 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
1d210 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62  RANS_READ;.    b
1d220 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
1d230 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  ent(pBt);.  }.. 
1d240 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
1d250 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
1d260 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1d270 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d280 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73  ./*.** Start a s
1d290 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
1d2a0 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
1d2b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20  transaction can 
1d2c0 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  be rolled.** bac
1d2d0 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
1d2e0 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  of the main tran
1d2f0 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73  saction. You mus
1d300 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
1d310 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65  ction .** before
1d320 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74   starting a subt
1d330 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
1d340 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
1d350 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69  s ended automati
1d360 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65  cally .** if the
1d370 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
1d380 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c  n commits or rol
1d390 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  ls back..**.** S
1d3a0 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
1d3b0 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  sactions are use
1d3c0 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64  d around individ
1d3d0 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ual SQL statemen
1d3e0 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63  ts.** that are c
1d3f0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
1d400 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54  a BEGIN...COMMIT
1d410 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f   block.  If a co
1d420 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f  nstraint.** erro
1d430 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
1d440 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
1d450 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61  he effect of tha
1d460 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a  t one statement.
1d470 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ** can be rolled
1d480 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61   back without ha
1d490 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ving to rollback
1d4a0 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
1d4b0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
1d4c0 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74   statement sub-t
1d4d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d  ransaction is im
1d4e0 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20  plemented as an 
1d4f0 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
1d500 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75  int. The.** valu
1d510 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
1d520 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
1d530 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
1d540 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e  mber of savepoin
1d550 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ts,.** including
1d560 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f   the new anonymo
1d570 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70  us savepoint, op
1d580 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65  en on the B-Tree
1d590 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a  . i.e. if there.
1d5a0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
1d5b0 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
1d5c0 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  no other stateme
1d5d0 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt-transactions 
1d5e0 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d  open,.** iStatem
1d5f0 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61  ent is 1. This a
1d600 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
1d610 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73  nt can be releas
1d620 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
1d630 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73  k.** using the s
1d640 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
1d650 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  oint() function.
1d660 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1d670 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74  treeBeginStmt(Bt
1d680 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61  ree *p, int iSta
1d690 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72  tement){.  int r
1d6a0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
1d6b0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
1d6c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1d6d0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
1d6e0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1d6f0 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
1d700 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
1d710 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1d720 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LY)==0 );.  asse
1d730 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30  rt( iStatement>0
1d740 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1d750 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e  tatement>p->db->
1d760 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20  nSavepoint );.  
1d770 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1d780 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1d790 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20  S_WRITE );.  /* 
1d7a0 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76  At the pager lev
1d7b0 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  el, a statement 
1d7c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d7d0 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a   savepoint with.
1d7e0 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72    ** an index gr
1d7f0 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  eater than all s
1d800 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65  avepoints create
1d810 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69  d explicitly usi
1d820 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  ng.  ** SQL stat
1d830 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c  ements. It is il
1d840 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72  legal to open, r
1d850 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
1d860 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68  ck any.  ** such
1d870 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c   savepoints whil
1d880 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
1d890 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
1d8a0 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e  point is active.
1d8b0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
1d8c0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
1d8d0 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
1d8e0 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b  er, iStatement);
1d8f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1d900 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1d910 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1d920 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1d930 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
1d940 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61  ion, op, is alwa
1d950 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ys SAVEPOINT_ROL
1d960 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45  LBACK.** or SAVE
1d970 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54  POINT_RELEASE. T
1d980 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74  his function eit
1d990 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20  her releases or 
1d9a0 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a  rolls back the.*
1d9b0 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e  * savepoint iden
1d9c0 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  tified by parame
1d9d0 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20  ter iSavepoint, 
1d9e0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
1d9f0 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70   value .** of op
1da00 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
1da10 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  , iSavepoint is 
1da20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1da30 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48  equal to zero. H
1da40 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73  owever, if op is
1da50 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  .** SAVEPOINT_RO
1da60 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61  LLBACK, then iSa
1da70 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f  vepoint may also
1da80 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20   be -1. In this 
1da90 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  case the .** con
1daa0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74  tents of the ent
1dab0 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
1dac0 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  are rolled back.
1dad0 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
1dae0 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72  nt.** from a nor
1daf0 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  mal transaction 
1db00 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20  rollback, as no 
1db10 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73  locks are releas
1db20 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72  ed and the.** tr
1db30 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e  ansaction remain
1db40 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  s open..*/.int s
1db50 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
1db60 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  oint(Btree *p, i
1db70 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65  nt op, int iSave
1db80 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
1db90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1dba0 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72  if( p && p->inTr
1dbb0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1dbc0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
1dbd0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1dbe0 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
1dbf0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1dc00 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
1dc10 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
1dc20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65     assert( iSave
1dc30 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61  point>=0 || (iSa
1dc40 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f  vepoint==-1 && o
1dc50 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
1dc60 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71  LBACK) );.    sq
1dc70 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1dc80 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  p);.    rc = sql
1dc90 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
1dca0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1dcb0 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
1dcc0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1dcd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1dce0 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30  if( iSavepoint<0
1dcf0 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
1dd00 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c  gs & BTS_INITIAL
1dd10 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a  LY_EMPTY)!=0 ){.
1dd20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61          pBt->nPa
1dd30 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
1dd40 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
1dd50 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
1dd60 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1dd70 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42  get4byte(28 + pB
1dd80 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1dd90 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  );..      /* The
1dda0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77   database size w
1ddb0 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
1ddc0 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66  the offset 28 of
1ddd0 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20   the header.    
1dde0 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72    ** when the tr
1ddf0 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
1de00 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68  d, so we know th
1de10 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20  at the value at 
1de20 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20  offset.      ** 
1de30 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a  28 is nonzero. *
1de40 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1de50 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a  pBt->nPage>0 );.
1de60 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1de70 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1de80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1de90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1dea0 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f   a new cursor fo
1deb0 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73  r the BTree whos
1dec0 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65  e root is on the
1ded0 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e   page.** iTable.
1dee0 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   If a read-only 
1def0 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
1df00 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ted, it is assum
1df10 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
1df20 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61  aller already ha
1df30 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61  s at least a rea
1df40 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
1df50 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68  on open.** on th
1df60 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61  e database alrea
1df70 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63  dy. If a write-c
1df80 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
1df90 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ed, then.** the 
1dfa0 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65  caller is assume
1dfb0 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65  d to have an ope
1dfc0 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
1dfd0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  ion..**.** If wr
1dfe0 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68  Flag==0, then th
1dff0 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
1e000 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  y be used for re
1e010 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46  ading..** If wrF
1e020 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  lag==1, then the
1e030 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75   cursor can be u
1e040 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
1e050 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  or for.** writin
1e060 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69  g if other condi
1e070 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e  tions for writin
1e080 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  g are also met. 
1e090 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68   These.** are th
1e0a0 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  e conditions tha
1e0b0 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e  t must be met in
1e0c0 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69   order for writi
1e0d0 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f  ng to.** be allo
1e0e0 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54  wed:.**.** 1:  T
1e0f0 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68  he cursor must h
1e100 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
1e110 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a  with wrFlag==1.*
1e120 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
1e130 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1e140 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
1e150 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
1e160 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
1e170 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
1e180 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
1e190 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
1e1a0 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
1e1b0 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
1e1c0 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
1e1d0 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
1e1e0 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
1e1f0 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
1e200 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
1e210 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
1e220 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
1e230 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
1e240 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
1e250 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1e260 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
1e270 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
1e280 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
1e290 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
1e2a0 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
1e2b0 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
1e2c0 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
1e2d0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  on..**.** No che
1e2e0 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
1e2f0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1e300 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
1e310 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
1e320 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
1e330 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
1e340 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
1e350 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
1e360 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
1e370 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
1e380 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
1e390 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
1e3a0 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61  eCursorZero() ha
1e3b0 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a  s been called.**
1e3c0 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74   on pCur to init
1e3d0 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
1e3e0 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f  y space prior to
1e3f0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
1e400 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
1e410 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
1e420 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
1e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e450 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
1e460 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e480 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1e490 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
1e4a0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
1e4b0 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e4d0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
1e4e0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
1e4f0 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
1e500 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
1e510 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
1e520 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
1e530 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
1e540 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
1e550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e560 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
1e570 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
1e580 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
1e590 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20  pBt = p->pBt;   
1e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e5b0 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61  Shared b-tree ha
1e5c0 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ndle */..  asser
1e5d0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1e5e0 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
1e5f0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1e600 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31  ==0 || wrFlag==1
1e610 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f   );..  /* The fo
1e620 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73  llowing assert s
1e630 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79  tatements verify
1e640 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73   that if this is
1e650 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a   a sharable .  *
1e660 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73  * b-tree databas
1e670 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  e, the connectio
1e680 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  n is holding the
1e690 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20   required table 
1e6a0 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64  locks, .  ** and
1e6b0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63   that no other c
1e6c0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e  onnection has an
1e6d0 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68  y open cursor th
1e6e0 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74  at conflicts wit
1e6f0 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63  h .  ** this loc
1e700 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  k.  */.  assert(
1e710 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1e720 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
1e730 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c  le, pKeyInfo!=0,
1e740 20 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20   wrFlag+1) );.  
1e750 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1e760 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e  0 || !hasReadCon
1e770 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65  flicts(p, iTable
1e780 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  ) );..  /* Asser
1e790 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  t that the calle
1e7a0 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65  r has opened the
1e7b0 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61   required transa
1e7c0 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65  ction. */.  asse
1e7d0 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  rt( p->inTrans>T
1e7e0 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61  RANS_NONE );.  a
1e7f0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
1e800 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   || p->inTrans==
1e810 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1e820 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
1e830 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61  age1 && pBt->pPa
1e840 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20  ge1->aData );.. 
1e850 20 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61   if( NEVER(wrFla
1e860 67 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  g && (pBt->btsFl
1e870 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
1e880 4e 4c 59 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  NLY)!=0) ){.    
1e890 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
1e8a0 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
1e8b0 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrFlag ){.    
1e8c0 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
1e8d0 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  e(pBt);.    if( 
1e8e0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d  pBt->pTmpSpace==
1e8f0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1e900 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
1e910 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20  f( iTable==1 && 
1e920 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
1e930 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Bt)==0 ){.    as
1e940 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1e950 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20  );.    iTable = 
1e960 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  0;.  }..  /* Now
1e970 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65   that no other e
1e980 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c  rrors can occur,
1e990 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20   finish filling 
1e9a0 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a  in the BtCursor.
1e9b0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61    ** variables a
1e9c0 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73  nd link the curs
1e9d0 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68  or into the BtSh
1e9e0 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20  ared list.  */. 
1e9f0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20   pCur->pgnoRoot 
1ea00 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a  = (Pgno)iTable;.
1ea10 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
1ea20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  -1;.  pCur->pKey
1ea30 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
1ea40 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20  .  pCur->pBtree 
1ea50 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  = p;.  pCur->pBt
1ea60 20 3d 20 70 42 74 3b 0a 20 20 61 73 73 65 72 74   = pBt;.  assert
1ea70 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77  ( wrFlag==0 || w
1ea80 72 46 6c 61 67 3d 3d 42 54 43 46 5f 57 72 69 74  rFlag==BTCF_Writ
1ea90 65 46 6c 61 67 20 29 3b 0a 20 20 70 43 75 72 2d  eFlag );.  pCur-
1eaa0 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c  >curFlags = wrFl
1eab0 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78  ag;.  pCur->pNex
1eac0 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  t = pBt->pCursor
1ead0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e  ;.  if( pCur->pN
1eae0 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ext ){.    pCur-
1eaf0 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
1eb00 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  pCur;.  }.  pBt-
1eb10 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b  >pCursor = pCur;
1eb20 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
1eb30 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1eb40 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1eb50 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
1eb60 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
1eb70 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
1eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eba0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
1ebb0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ebe0 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
1ebf0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
1ec00 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
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 20 20 20 2f 2a 20 31 20             /* 1 
1ec30 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
1ec40 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
1ec50 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1ec60 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1ec70 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1ec80 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
1ec90 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
1eca0 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
1ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecc0 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
1ecd0 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
1ece0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1ecf0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1ed00 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  p);.  rc = btree
1ed10 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65  Cursor(p, iTable
1ed20 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e  , wrFlag, pKeyIn
1ed30 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c  fo, pCur);.  sql
1ed40 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1ed50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ed60 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1ed70 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74  the size of a Bt
1ed80 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e  Cursor object in
1ed90 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   bytes..**.** Th
1eda0 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73  is interfaces is
1edb0 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20   needed so that 
1edc0 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73  users of cursors
1edd0 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65   can preallocate
1ede0 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73  .** sufficient s
1edf0 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61  torage to hold a
1ee00 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74   cursor.  The Bt
1ee10 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73  Cursor object is
1ee20 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73   opaque.** to us
1ee30 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e  ers so they cann
1ee40 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66  ot do the sizeof
1ee50 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20  () themselves - 
1ee60 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a  they must call.*
1ee70 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
1ee80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1ee90 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f  reeCursorSize(vo
1eea0 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f  id){.  return RO
1eeb0 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75  UND8(sizeof(BtCu
1eec0 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rsor));.}../*.**
1eed0 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
1eee0 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ry that will be 
1eef0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
1ef00 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1ef10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70  ..**.** The simp
1ef20 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65  le approach here
1ef30 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d   would be to mem
1ef40 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65  set() the entire
1ef50 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65   object.** to ze
1ef60 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e  ro.  But it turn
1ef70 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61  s out that the a
1ef80 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64  pPage[] and aiId
1ef90 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f  x[] arrays.** do
1efa0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
1efb0 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20  zeroed and they 
1efc0 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65  are large, so we
1efd0 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a   can save a lot.
1efe0 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62  ** of run-time b
1eff0 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  y skipping the i
1f000 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
1f010 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e   those elements.
1f020 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1f030 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
1f040 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
1f050 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66  memset(p, 0, off
1f060 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20  setof(BtCursor, 
1f070 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iPage));.}../*.*
1f080 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
1f090 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
1f0a0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1f0b0 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
1f0c0 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
1f0d0 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
1f0e0 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
1f0f0 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
1f100 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
1f110 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
1f120 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
1f130 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65  ree;.  if( pBtre
1f140 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
1f150 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1f160 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
1f170 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1f180 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
1f190 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1f1a0 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
1f1b0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
1f1c0 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43  Prev ){.      pC
1f1d0 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  ur->pPrev->pNext
1f1e0 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
1f1f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f200 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
1f210 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
1f220 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
1f230 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
1f240 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
1f250 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76  ev = pCur->pPrev
1f260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1f270 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
1f280 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
1f290 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
1f2a0 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
1f2b0 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42     }.    unlockB
1f2c0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
1f2d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
1f2e0 46 72 65 65 28 70 42 74 72 65 65 2d 3e 64 62 2c  Free(pBtree->db,
1f2f0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1f300 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  );.    /* sqlite
1f310 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f  3_free(pCur); */
1f320 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1f330 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1f340 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1f350 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1f360 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
1f370 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69  tCursor* given i
1f380 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68  n the argument h
1f390 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74  as a valid.** Bt
1f3a0 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75  Cursor.info stru
1f3b0 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73  cture.  If it is
1f3c0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c   not already val
1f3d0 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65  id, call.** btre
1f3e0 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20  eParseCell() to 
1f3f0 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a  fill it in..**.*
1f400 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
1f410 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68  is a cache of th
1f420 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
1f430 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c   the current cel
1f440 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73  l..** Using this
1f450 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74   cache reduces t
1f460 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c  he number of cal
1f470 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65  ls to btreeParse
1f480 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30  Cell()..**.** 20
1f490 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65  07-06-25:  There
1f4a0 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d   is a bug in som
1f4b0 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53  e versions of MS
1f4c0 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68  VC that cause th
1f4d0 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f  e.** compiler to
1f4e0 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43   crash when getC
1f4f0 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70  ellInfo() is imp
1f500 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61  lemented as a ma
1f510 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72  cro..** But ther
1f520 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62  e is a measureab
1f530 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61  le speed advanta
1f540 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20  ge to using the 
1f550 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20  macro on gcc.** 
1f560 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69  (when less compi
1f570 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ler optimization
1f580 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f  s like -Os or -O
1f590 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74  0 are used and t
1f5a0 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69  he.** compiler i
1f5b0 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 67 72  s not doing aggr
1f5c0 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e  essive inlining.
1f5d0 29 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72  )  So we use a r
1f5e0 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  eal function.** 
1f5f0 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d  for MSVC and a m
1f600 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68  acro for everyth
1f610 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65  ing else.  Ticke
1f620 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e  t #2457..*/.#ifn
1f630 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61  def NDEBUG.  sta
1f640 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43  tic void assertC
1f650 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
1f660 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c   *pCur){.    Cel
1f670 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
1f680 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
1f690 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  ->iPage;.    mem
1f6a0 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
1f6b0 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
1f6c0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1f6d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
1f6e0 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  ge], pCur->aiIdx
1f6f0 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b  [iPage], &info);
1f700 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52  .    assert( COR
1f710 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d  RUPT_DB || memcm
1f720 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
1f730 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
1f740 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
1f750 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
1f760 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
1f770 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d  #endif.#ifdef _M
1f780 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20  SC_VER.  /* Use 
1f790 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
1f7a0 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20  in MSVC to work 
1f7b0 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74  around bugs in t
1f7c0 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f  hat compiler. */
1f7d0 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67  .  static void g
1f7e0 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
1f7f0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
1f800 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
1f810 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
1f820 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1f830 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20  r->iPage;.      
1f840 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
1f850 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
1f860 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
1f870 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
1f880 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  o);.      pCur->
1f890 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
1f8a0 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
1f8b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1f8c0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
1f8d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
1f8e0 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53  se /* if not _MS
1f8f0 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73  C_VER */.  /* Us
1f900 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c  e a macro in all
1f910 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73   other compilers
1f920 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e   so that the fun
1f930 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64  ction is inlined
1f940 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43   */.#define getC
1f950 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20  ellInfo(pCur)   
1f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f990 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d     \.  if( pCur-
1f9a0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
1f9b0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1f9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9e0 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50      \.    int iP
1f9f0 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
1fa00 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa30 20 20 20 20 20 5c 0a 20 20 20 20 62 74 72 65 65       \.    btree
1fa40 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
1fa50 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43  apPage[iPage],pC
1fa60 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
1fa70 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 20  ,&pCur->info);  
1fa80 20 20 20 20 20 20 5c 0a 20 20 20 20 70 43 75 72        \.    pCur
1fa90 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
1faa0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 20 20 20  CF_ValidNKey;   
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fad0 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65         \.  }else
1fae0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73          \.    as
1fb30 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
1fb40 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r);             
1fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb70 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23           \.  }.#
1fb80 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45  endif /* _MSC_VE
1fb90 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44  R */..#ifndef ND
1fba0 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78  EBUG  /* The nex
1fbb0 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f  t routine used o
1fbc0 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
1fbd0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
1fbe0 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  /./*.** Return t
1fbf0 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  rue if the given
1fc00 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c   BtCursor is val
1fc10 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72  id.  A valid cur
1fc20 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68  sor is one.** th
1fc30 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  at is currently 
1fc40 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f  pointing to a ro
1fc50 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74  w in a (non-empt
1fc60 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69  y) table..** Thi
1fc70 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74  s is a verificat
1fc80 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75  ion routine is u
1fc90 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
1fca0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1fcb0 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nts..*/.int sqli
1fcc0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
1fcd0 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Valid(BtCursor *
1fce0 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
1fcf0 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53  pCur && pCur->eS
1fd00 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1fd10 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ID;.}.#endif /* 
1fd20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  NDEBUG */../*.**
1fd30 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
1fd40 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
1fd50 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20  uffer needed to 
1fd60 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f  hold the value o
1fd70 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72  f.** the key for
1fd80 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
1fd90 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  ry.  If the curs
1fda0 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
1fdb0 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64  ng.** to a valid
1fdc0 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69   entry, *pSize i
1fdd0 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a  s set to 0. .**.
1fde0 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77  ** For a table w
1fdf0 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66  ith the INTKEY f
1fe00 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f  lag set, this ro
1fe10 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1fe20 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c  e key.** itself,
1fe30 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20   not the number 
1fe40 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
1fe50 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  key..**.** The c
1fe60 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74  aller must posit
1fe70 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70  ion the cursor p
1fe80 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67  rior to invoking
1fe90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1fea0 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
1feb0 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  ne cannot fail. 
1fec0 20 49 74 20 61 6c 77 61 79 73 20 72 65 74 75 72   It always retur
1fed0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a  ns SQLITE_OK.  .
1fee0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1fef0 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72  reeKeySize(BtCur
1ff00 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
1ff10 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  pSize){.  assert
1ff20 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1ff30 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1ff40 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1ff50 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1ff60 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
1ff70 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1ff80 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1ff90 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
1ffa0 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 53 69  ALID ){.    *pSi
1ffb0 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ze = 0;.  }else{
1ffc0 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  .    getCellInfo
1ffd0 28 70 43 75 72 29 3b 0a 20 20 20 20 2a 70 53 69  (pCur);.    *pSi
1ffe0 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
1fff0 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nKey;.  }.  retu
20000 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
20010 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
20020 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
20030 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
20040 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68   in the entry th
20050 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72  e.** cursor curr
20060 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
20070 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
20080 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  r must guarantee
20090 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
200a0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
200b0 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61  a non-NULL.** va
200c0 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f  lid entry.  In o
200d0 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
200e0 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
200f0 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  e must guarantee
20100 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72  .** that the cur
20110 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65  sor has Cursor.e
20120 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
20130 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75  LID..**.** Failu
20140 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  re is not possib
20150 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  le.  This functi
20160 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  on always return
20170 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  s SQLITE_OK..** 
20180 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73  It might just as
20190 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65   well be a proce
201a0 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20  dure (returning 
201b0 76 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e  void) but we con
201c0 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75  tinue.** to retu
201d0 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65  rn an integer re
201e0 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69  sult code for hi
201f0 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73  storical reasons
20200 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20210 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74  BtreeDataSize(Bt
20220 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
20230 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73  2 *pSize){.  ass
20240 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
20250 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
20260 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
20270 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
20280 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
20290 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
202a0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 6e 74 4b  ur->iPage]->intK
202b0 65 79 4c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 67  eyLeaf==1 );.  g
202c0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
202d0 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75  ;.  *pSize = pCu
202e0 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
202f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
20300 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  E_OK;.}../*.** G
20310 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
20320 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
20330 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
20340 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
20350 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
20360 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
20370 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
20380 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
20390 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
203a0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
203b0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
203c0 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
203d0 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
203e0 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
203f0 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
20400 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
20410 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
20420 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
20430 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
20440 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
20450 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
20460 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
20470 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e:.**.** The pag
20480 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
20490 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  next overflow pa
204a0 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ge in the linked
204b0 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69   list is .** wri
204c0 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65  tten to *pPgnoNe
204d0 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c  xt. If page ovfl
204e0 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
204f0 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20  e in its linked 
20500 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f  .** list, *pPgno
20510 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a  Next is set to z
20520 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ero. .**.** If p
20530 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pPage is not NUL
20540 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e  L, and a referen
20550 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  ce to the MemPag
20560 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  e object corresp
20570 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67  onding.** to pag
20580 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77  e number pOvfl w
20590 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  as obtained, the
205a0 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  n *ppPage is set
205b0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
205c0 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20  t.** reference. 
205d0 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
205e0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
205f0 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72  caller to call r
20600 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20  eleasePage().** 
20610 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72  on *ppPage to fr
20620 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ee the reference
20630 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63  . In no referenc
20640 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28  e was obtained (
20650 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70  because.** the p
20660 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75  ointer-map was u
20670 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  sed to obtain th
20680 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67  e value for *pPg
20690 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a  noNext), then.**
206a0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
206b0 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  to zero..*/.stat
206c0 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
206d0 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
206e0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
206f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
20700 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
20710 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20   Pgno ovfl,     
20720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20730 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f   Current overflo
20740 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
20750 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
20760 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
20770 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
20780 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e  handle (may be N
20790 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  ULL) */.  Pgno *
207a0 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20  pPgnoNext       
207b0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
207c0 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
207d0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
207e0 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a   Pgno next = 0;.
207f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
20800 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
20810 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
20820 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
20830 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
20840 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
20850 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23  t(pPgnoNext);..#
20860 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20870 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
20880 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74  /* Try to find t
20890 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
208a0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
208b0 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
208c0 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e   autovacuum poin
208d0 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47  ter-map pages. G
208e0 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65  uess that the ne
208f0 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a  xt page in .  **
20900 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
20910 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65  st is page numbe
20920 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74  r (ovfl+1). If t
20930 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20  hat guess turns 
20940 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20  .  ** out to be 
20950 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b  wrong, fall back
20960 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   to loading the 
20970 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20  data of page .  
20980 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74  ** number ovfl t
20990 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
209a0 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72  next page number
209b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
209c0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
209d0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
209e0 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d     Pgno iGuess =
209f0 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20   ovfl+1;.    u8 
20a00 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c  eType;..    whil
20a10 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
20a20 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c  (pBt, iGuess) ||
20a30 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47   iGuess==PENDING
20a40 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
20a50 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b  ){.      iGuess+
20a60 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
20a70 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50  ( iGuess<=btreeP
20a80 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
20a90 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
20aa0 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73  apGet(pBt, iGues
20ab0 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f  s, &eType, &pgno
20ac0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
20ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54  =SQLITE_OK && eT
20ae0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
20af0 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f  FLOW2 && pgno==o
20b00 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  vfl ){.        n
20b10 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20  ext = iGuess;.  
20b20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
20b30 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
20b40 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
20b50 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74  ..  assert( next
20b60 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
20b70 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  E_DONE );.  if( 
20b80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20b90 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
20ba0 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
20bb0 2c 20 26 70 50 61 67 65 2c 20 28 70 70 50 61 67  , &pPage, (ppPag
20bc0 65 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45  e==0) ? PAGER_GE
20bd0 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b  T_READONLY : 0);
20be0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
20bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
20c00 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  age==0 );.    if
20c10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20c20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20  ){.      next = 
20c30 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
20c40 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
20c50 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20  }..  *pPgnoNext 
20c60 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70  = next;.  if( pp
20c70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50  Page ){.    *ppP
20c80 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d  age = pPage;.  }
20c90 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73  else{.    releas
20ca0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
20cb0 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  }.  return (rc==
20cc0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51  SQLITE_DONE ? SQ
20cd0 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d  LITE_OK : rc);.}
20ce0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74  ../*.** Copy dat
20cf0 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
20d00 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72  to a page, or fr
20d10 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62  om a page to a b
20d20 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  uffer..**.** pPa
20d30 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74  yload is a point
20d40 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65  er to data store
20d50 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61  d on database pa
20d60 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49  ge pDbPage..** I
20d70 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69  f argument eOp i
20d80 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42  s false, then nB
20d90 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  yte bytes of dat
20da0 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20  a are copied.** 
20db0 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f  from pPayload to
20dc0 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
20dd0 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20  ted at by pBuf. 
20de0 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a  If eOp is true,.
20df0 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50  ** then sqlite3P
20e00 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
20e10 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65  alled on pDbPage
20e20 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73   and nByte bytes
20e30 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20  .** of data are 
20e40 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20  copied from the 
20e50 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70  buffer pBuf to p
20e60 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53  Payload..**.** S
20e70 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
20e80 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c  rned on success,
20e90 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
20ea0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
20eb0 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c  tic int copyPayl
20ec0 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61  oad(.  void *pPa
20ed0 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20  yload,          
20ee0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
20ef0 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  age data */.  vo
20f00 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
20f10 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
20f20 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a  er to buffer */.
20f30 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
20f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20f50 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
20f60 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
20f70 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eOp,            
20f80 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f        /* 0 -> co
20f90 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20  py from page, 1 
20fa0 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20  -> copy to page 
20fb0 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  */.  DbPage *pDb
20fc0 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f  Page           /
20fd0 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
20fe0 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b  g pPayload */.){
20ff0 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20  .  if( eOp ){.  
21000 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
21010 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61  rom buffer to pa
21020 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72  ge (a write oper
21030 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  ation) */.    in
21040 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
21050 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
21060 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
21070 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21080 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
21090 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50   }.    memcpy(pP
210a0 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42  ayload, pBuf, nB
210b0 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
210c0 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
210d0 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66  from page to buf
210e0 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72  fer (a read oper
210f0 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65  ation) */.    me
21100 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c  mcpy(pBuf, pPayl
21110 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  oad, nByte);.  }
21120 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
21130 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
21140 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
21150 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f  sed to read or o
21160 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64  verwrite payload
21170 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
21180 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
21190 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73  at the pCur curs
211a0 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
211b0 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72  o. The eOp.** ar
211c0 67 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70  gument is interp
211d0 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
211e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65  :.**.**   0: The
211f0 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
21200 72 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74  read. Populate t
21210 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
21220 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f  e..**   1: The o
21230 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72  peration is a wr
21240 69 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ite. Populate th
21250 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
21260 2e 0a 2a 2a 20 20 20 32 3a 20 54 68 65 20 6f 70  ..**   2: The op
21270 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61  eration is a rea
21280 64 2e 20 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61  d. Do not popula
21290 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
212a0 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  cache..**.** A t
212b0 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
212c0 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
212d0 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
212e0 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
212f0 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
21300 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
21310 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
21320 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69   The content bei
21330 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  ng read or writt
21340 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  en might appear 
21350 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
21360 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65  .** or be scatte
21370 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69  red out on multi
21380 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ple overflow pag
21390 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
213a0 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
213b0 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f  entry uses one o
213c0 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
213d0 70 61 67 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a  pages and the.**
213e0 20 65 4f 70 20 61 72 67 75 6d 65 6e 74 20 69 73   eOp argument is
213f0 20 6e 6f 74 20 32 2c 20 74 68 69 73 20 66 75 6e   not 2, this fun
21400 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61  ction may alloca
21410 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  te space for and
21420 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 75   lazily .** popu
21430 6c 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c  lates the overfl
21440 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
21450 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73  he array (BtCurs
21460 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a  or.aOverflow). .
21470 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ** Subsequent ca
21480 6c 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63  lls use this cac
21490 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69  he to make seeki
214a0 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
214b0 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f  ed offset .** mo
214c0 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  re efficient..**
214d0 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72  .** Once an over
214e0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
214f0 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
21500 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20  located, it may 
21510 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
21520 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
21530 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
21540 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
21550 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
21560 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
21570 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
21580 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
21590 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
215a0 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
215b0 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
215c0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
215d0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
215e0 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
215f0 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
21600 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
21610 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
21620 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
21630 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
21640 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
21650 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
21660 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
21670 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
21680 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
21690 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
216a0 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
216b0 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
216c0 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
216d0 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65  m */.  u32 offse
216e0 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
216f0 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
21700 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
21710 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c  ad */.  u32 amt,
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21730 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
21740 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
21750 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
21760 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
21770 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
21780 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70  er */ .  int eOp
21790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
217a0 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
217b0 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
217c0 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
217d0 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
217e0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
217f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
21800 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
21810 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
21820 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21830 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
21840 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
21850 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
21860 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
21870 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
21880 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
21890 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
218a0 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66  ngs to */.#ifdef
218b0 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
218c0 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75  VERFLOW_READ.  u
218d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63  nsigned char * c
218e0 6f 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d  onst pBufStart =
218f0 20 70 42 75 66 3b 0a 20 20 69 6e 74 20 62 45 6e   pBuf;.  int bEn
21900 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21920 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
21930 61 64 69 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20  ading to end of 
21940 64 61 74 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  data */.#endif..
21950 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
21960 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
21970 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
21980 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
21990 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
219a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
219b0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
219c0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
219d0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
219e0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 21  ;.  assert( eOp!
219f0 3d 32 20 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20  =2 || offset==0 
21a00 29 3b 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  );    /* Always 
21a10 73 74 61 72 74 20 66 72 6f 6d 20 62 65 67 69 6e  start from begin
21a20 6e 69 6e 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20  ning for eOp==2 
21a30 2a 2f 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  */..  getCellInf
21a40 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
21a50 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
21a60 2e 70 50 61 79 6c 6f 61 64 3b 0a 23 69 66 64 65  .pPayload;.#ifde
21a70 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
21a80 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
21a90 62 45 6e 64 20 3d 20 6f 66 66 73 65 74 2b 61 6d  bEnd = offset+am
21aa0 74 3d 3d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  t==pCur->info.nP
21ab0 61 79 6c 6f 61 64 3b 0a 23 65 6e 64 69 66 0a 20  ayload;.#endif. 
21ac0 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b   assert( offset+
21ad0 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66  amt <= pCur->inf
21ae0 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20  o.nPayload );.. 
21af0 20 69 66 28 20 26 61 50 61 79 6c 6f 61 64 5b 70   if( &aPayload[p
21b00 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
21b10 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74  ] > &pPage->aDat
21b20 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
21b30 65 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79  e] ){.    /* Try
21b40 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ing to read or w
21b50 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  rite past the en
21b60 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73  d of the data is
21b70 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
21b80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
21b90 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
21ba0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
21bb0 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61  data must be rea
21bc0 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f  d/written to/fro
21bd0 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65  m the btree page
21be0 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66   itself. */.  if
21bf0 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69  ( offset<pCur->i
21c00 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
21c10 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
21c20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e     if( a+offset>
21c30 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
21c40 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70  l ){.      a = p
21c50 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
21c60 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d   - offset;.    }
21c70 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61  .    rc = copyPa
21c80 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
21c90 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
21ca0 2c 20 28 65 4f 70 20 26 20 30 78 30 31 29 2c 20  , (eOp & 0x01), 
21cb0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
21cc0 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b  .    offset = 0;
21cd0 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a  .    pBuf += a;.
21ce0 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
21cf0 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65  }else{.    offse
21d00 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t -= pCur->info.
21d10 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69  nLocal;.  }..  i
21d20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21d30 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
21d40 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53   const u32 ovflS
21d50 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
21d60 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42  eSize - 4;  /* B
21d70 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72  ytes content per
21d80 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20   ovfl page */.  
21d90 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b    Pgno nextPage;
21da0 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  ..    nextPage =
21db0 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
21dc0 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
21dd0 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a  Local]);..    /*
21de0 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72   If the BtCursor
21df0 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73  .aOverflow[] has
21e00 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
21e10 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
21e20 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63   now..    ** Exc
21e30 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f  ept, do not allo
21e40 63 61 74 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d  cate aOverflow[]
21e50 20 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20   for eOp==2..   
21e60 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61   **.    ** The a
21e70 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
21e80 20 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65   is sized at one
21e90 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
21ea0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
21eb0 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72    ** in the over
21ec0 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
21ed0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
21ee0 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
21ef0 77 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a  w page is.    **
21f00 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72   stored in aOver
21f10 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20  flow[0], etc. A 
21f20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68  value of 0 in th
21f30 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
21f40 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73  ray.    ** means
21f50 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22   "not yet known"
21f60 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c   (the cache is l
21f70 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29  azily populated)
21f80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
21f90 20 65 4f 70 21 3d 32 20 26 26 20 28 70 43 75 72   eOp!=2 && (pCur
21fa0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
21fb0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
21fc0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
21fd0 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
21fe0 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
21ff0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
22000 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
22010 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66  ;.      if( nOvf
22020 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c  l>pCur->nOvflAll
22030 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  oc ){.        Pg
22040 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f  no *aNew = (Pgno
22050 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  *)sqlite3DbReall
22060 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  oc(.            
22070 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
22080 2c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  , pCur->aOverflo
22090 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f  w, nOvfl*2*sizeo
220a0 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20  f(Pgno).        
220b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
220c0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
220d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
220e0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d  NOMEM;.        }
220f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
22100 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63  pCur->nOvflAlloc
22110 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20 20   = nOvfl*2;.    
22120 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
22130 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20  rflow = aNew;.  
22140 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
22150 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
22160 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22170 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e     memset(pCur->
22180 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f  aOverflow, 0, nO
22190 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29  vfl*sizeof(Pgno)
221a0 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
221b0 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
221c0 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20  F_ValidOvfl;.   
221d0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
221e0 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c  /* If the overfl
221f0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
22200 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
22210 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20  cated and the.  
22220 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
22230 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
22240 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
22250 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
22260 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74     ** directly t
22270 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o it..    */.   
22280 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46   if( (pCur->curF
22290 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
222a0 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20 20 20 26  dOvfl)!=0.     &
222b0 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
222c0 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a  w[offset/ovflSiz
222d0 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e].    ){.      
222e0 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f  iIdx = (offset/o
222f0 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
22300 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
22310 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
22320 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d  ;.      offset =
22330 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a   (offset%ovflSiz
22340 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  e);.    }..    f
22350 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45  or( ; rc==SQLITE
22360 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20  _OK && amt>0 && 
22370 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b  nextPage; iIdx++
22380 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  ){..      /* If 
22390 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61  required, popula
223a0 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
223b0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
223c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70   */.      if( (p
223d0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
223e0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21  BTCF_ValidOvfl)!
223f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
22400 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65  sert(!pCur->aOve
22410 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70  rflow[iIdx] || p
22420 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
22430 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b  Idx]==nextPage);
22440 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61  .        pCur->a
22450 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d  Overflow[iIdx] =
22460 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20   nextPage;.     
22470 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66   }..      if( of
22480 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29  fset>=ovflSize )
22490 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
224a0 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20   only reason to 
224b0 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69  read this page i
224c0 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  s to obtain the 
224d0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
224e0 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e  number for the n
224f0 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
22500 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
22510 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  The page.       
22520 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20   ** data is not 
22530 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72  required. So fir
22540 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70  st try to lookup
22550 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20   the overflow.  
22560 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69        ** page-li
22570 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79  st cache, if any
22580 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b  , then fall back
22590 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66   to the getOverf
225a0 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20  lowPage().      
225b0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20    ** function.. 
225c0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
225d0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
225e0 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
225f0 72 72 61 79 20 6d 75 73 74 20 62 65 20 61 6c 6c  rray must be all
22600 6f 63 61 74 65 64 20 62 65 63 61 75 73 65 20 65  ocated because e
22610 4f 70 21 3d 32 0a 20 20 20 20 20 20 20 20 2a 2a  Op!=2.        **
22620 20 68 65 72 65 2e 20 20 49 66 20 65 4f 70 3d 3d   here.  If eOp==
22630 32 2c 20 74 68 65 6e 20 6f 66 66 73 65 74 3d 3d  2, then offset==
22640 30 20 61 6e 64 20 74 68 69 73 20 62 72 61 6e 63  0 and this branc
22650 68 20 69 73 20 6e 65 76 65 72 20 74 61 6b 65 6e  h is never taken
22660 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
22670 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70       assert( eOp
22680 21 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 61  !=2 );.        a
22690 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72  ssert( pCur->cur
226a0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
226b0 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20  idOvfl );.      
226c0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
226d0 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b  rflow[iIdx+1] ){
226e0 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
226f0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
22700 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20  rflow[iIdx+1];. 
22710 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22720 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
22730 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
22740 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26  , nextPage, 0, &
22750 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
22760 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66     }.        off
22770 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b  set -= ovflSize;
22780 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
22790 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f        /* Need to
227a0 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
227b0 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e  properly. It con
227c0 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68  tains some of th
227d0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e  e.        ** ran
227e0 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ge of data that 
227f0 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65  is being read (e
22800 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65  Op==0) or writte
22810 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20  n (eOp!=0)..    
22820 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
22830 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
22840 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
22850 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
22860 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  fd;.#endif.     
22870 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
22880 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20          if( a + 
22890 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a  offset > ovflSiz
228a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  e ){.          a
228b0 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66   = ovflSize - of
228c0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fset;.        }.
228d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
228e0 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
228f0 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  EAD.        /* I
22900 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77  f all the follow
22910 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
22920 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
22930 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73   **   1) this is
22940 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
22950 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20  n, and .        
22960 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20  **   2) data is 
22970 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68  required from th
22980 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  e start of this 
22990 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61  overflow page, a
229a0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
229b0 33 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  3) the database 
229c0 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20  is file-backed, 
229d0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
229e0 20 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20   4) there is no 
229f0 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73  open write-trans
22a00 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
22a10 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20      **   5) the 
22a20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
22a30 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a  a WAL database,.
22a40 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20          **   6) 
22a50 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  all data from th
22a60 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
22a70 72 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a  read..        **
22a80 20 20 20 37 29 20 61 74 20 6c 65 61 73 74 20 34     7) at least 4
22a90 20 62 79 74 65 73 20 68 61 76 65 20 61 6c 72 65   bytes have alre
22aa0 61 64 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e  ady been read in
22ab0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
22ac0 66 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  ffer .        **
22ad0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
22ae0 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61   data can be rea
22af0 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20  d directly from 
22b00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22b10 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  e into the.     
22b20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66     ** output buf
22b30 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74  fer, bypassing t
22b40 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c  he page-cache al
22b50 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73  together. This s
22b60 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a  peeds.        **
22b70 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67   up loading larg
22b80 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73  e records that s
22b90 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f  pan many overflo
22ba0 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20  w pages..       
22bb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
22bc0 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20 20  (eOp&0x01)==0   
22bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bf0 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20     /* (1) */.   
22c00 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d        && offset=
22c10 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
22c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
22c40 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  2) */.         &
22c50 26 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76  & (bEnd || a==ov
22c60 66 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20 20  flSize)         
22c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c80 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20       /* (6) */. 
22c90 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e          && pBt->
22ca0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
22cb0 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20  RANS_READ       
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22cd0 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (4) */.        
22ce0 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65   && (fd = sqlite
22cf0 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
22d00 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f  pPager))->pMetho
22d10 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f  ds     /* (3) */
22d20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74  .         && pBt
22d30 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
22d40 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20  19]==0x01       
22d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d60 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20  /* (5) */.      
22d70 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e     && &pBuf[-4]>
22d80 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20  =pBufStart      
22d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22da0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 37 29 20           /* (7) 
22db0 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  */.        ){.  
22dc0 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65          u8 aSave
22dd0 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75  [4];.          u
22de0 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75  8 *aWrite = &pBu
22df0 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  f[-4];.         
22e00 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e   assert( aWrite>
22e10 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20  =pBufStart );   
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e30 20 20 20 20 20 20 2f 2a 20 68 65 6e 63 65 20 28        /* hence (
22e40 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  7) */.          
22e50 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57  memcpy(aSave, aW
22e60 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  rite, 4);.      
22e70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22e80 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74  OsRead(fd, aWrit
22e90 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74  e, a+4, (i64)pBt
22ea0 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74  ->pageSize*(next
22eb0 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20  Page-1));.      
22ec0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
22ed0 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b  et4byte(aWrite);
22ee0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
22ef0 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c  y(aWrite, aSave,
22f00 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   4);.        }el
22f10 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  se.#endif..     
22f20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44     {.          D
22f30 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
22f40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
22f50 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
22f60 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  re(pBt->pPager, 
22f70 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61  nextPage, &pDbPa
22f80 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge,.            
22f90 20 20 28 28 65 4f 70 26 30 78 30 31 29 3d 3d 30    ((eOp&0x01)==0
22fa0 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
22fb0 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20  DONLY : 0).     
22fc0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
22fd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22fe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
22ff0 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
23000 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
23010 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
23020 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
23030 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
23040 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
23050 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
23060 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
23070 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61  fset+4], pBuf, a
23080 2c 20 28 65 4f 70 26 30 78 30 31 29 2c 20 70 44  , (eOp&0x01), pD
23090 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
230a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
230b0 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
230c0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73              offs
230d0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
230e0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
230f0 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a        amt -= a;.
23100 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20          pBuf += 
23110 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  a;.      }.    }
23120 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
23130 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
23140 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
23150 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
23160 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
23170 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23180 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
23190 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
231a0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
231b0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
231c0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
231d0 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e  e transferred in
231e0 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
231f0 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
23200 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
23210 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
23220 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
23230 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69  t pCur is pointi
23240 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f  ng to a valid ro
23250 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c  w.** in the tabl
23260 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
23270 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
23280 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
23290 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
232a0 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
232b0 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
232c0 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
232d0 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
232e0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
232f0 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
23300 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
23310 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
23320 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
23330 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
23340 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72   *pBuf){.  asser
23350 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
23360 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
23370 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
23380 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
23390 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
233a0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
233b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
233c0 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
233d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
233e0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
233f0 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
23400 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
23410 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63  l );.  return ac
23420 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
23430 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28  , offset, amt, (
23440 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
23450 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Buf, 0);.}../*.*
23460 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
23470 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  he data associat
23480 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
23490 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
234a0 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
234b0 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
234c0 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
234d0 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
234e0 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
234f0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
23500 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
23510 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
23520 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
23530 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
23540 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
23550 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
23560 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
23570 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
23580 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
23590 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
235a0 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20  eeData(BtCursor 
235b0 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
235c0 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
235d0 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
235e0 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  c;..#ifndef SQLI
235f0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
23600 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
23610 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
23620 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
23630 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
23640 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
23650 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
23660 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
23670 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
23680 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
23690 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
236a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
236b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
236c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
236d0 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ID );.    assert
236e0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
236f0 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
23700 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
23710 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
23720 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
23730 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
23740 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
23750 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
23760 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
23770 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
23780 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20  mt, pBuf, 0);.  
23790 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
237a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
237b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c   pointer to payl
237c0 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oad information 
237d0 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74  from the entry t
237e0 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72  hat the .** pCur
237f0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
23800 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69  ing to.  The poi
23810 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62  nter is to the b
23820 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74  eginning of.** t
23830 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20  he key if index 
23840 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69  btrees (pPage->i
23850 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73  ntKey==0) and is
23860 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a   the data for.**
23870 20 74 61 62 6c 65 20 62 74 72 65 65 73 20 28 70   table btrees (p
23880 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29  Page->intKey==1)
23890 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  . The number of 
238a0 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62  bytes of availab
238b0 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69  le.** key/data i
238c0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
238d0 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d  pAmt.  If *pAmt=
238e0 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  =0, then the val
238f0 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  ue.** returned w
23900 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c  ill not be a val
23910 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  id pointer..**.*
23920 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
23930 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
23940 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e  n.  It is common
23950 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
23960 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20  key.** and data 
23970 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f  to fit on the lo
23980 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72  cal page and for
23990 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20   there to be no 
239a0 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65  overflow.** page
239b0 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73  s.  When that is
239c0 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e   so, this routin
239d0 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  e can be used to
239e0 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b   access the.** k
239f0 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68  ey and data with
23a00 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70  out making a cop
23a10 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61  y.  If the key a
23a20 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c  nd/or data spill
23a30 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c  s.** onto overfl
23a40 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61  ow pages, then a
23a50 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d  ccessPayload() m
23a60 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72  ust be used to r
23a70 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65  eassemble.** the
23a80 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f   key/data and co
23a90 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65  py it into a pre
23aa0 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
23ab0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
23ac0 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
23ad0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f  this routine loo
23ae0 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f  ks directly into
23af0 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70   the cached.** p
23b00 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
23b10 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d  ase.  The data m
23b20 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d  ight change or m
23b30 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ove the next tim
23b40 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72  e.** any btree r
23b50 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
23b60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
23b70 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79  t void *fetchPay
23b80 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
23b90 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
23ba0 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
23bb0 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
23bc0 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a   from */.  u32 *
23bd0 70 41 6d 74 20 20 20 20 20 20 20 20 20 20 20 20  pAmt            
23be0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
23bf0 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
23c00 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29   bytes here */.)
23c10 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  {.  assert( pCur
23c20 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
23c30 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
23c40 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
23c50 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
23c60 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
23c70 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
23c80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
23c90 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
23ca0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
23cb0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
23cc0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
23cd0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
23ce0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
23cf0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
23d00 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
23d10 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
23d20 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
23d30 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b  >info.nSize>0 );
23d40 0a 20 20 2a 70 41 6d 74 20 3d 20 70 43 75 72 2d  .  *pAmt = pCur-
23d50 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
23d60 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43  return (void*)pC
23d70 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
23d80 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  d;.}.../*.** For
23d90 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
23da0 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70  cursor pCur is p
23db0 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20  oint to, return 
23dc0 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73  as.** many bytes
23dd0 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64   of the key or d
23de0 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c  ata as are avail
23df0 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  able on the loca
23e00 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65  l.** b-tree page
23e10 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  .  Write the num
23e20 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
23e30 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d   bytes into *pAm
23e40 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  t..**.** The poi
23e50 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  nter returned is
23e60 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65   ephemeral.  The
23e70 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f   key/data may mo
23e80 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74  ve.** or be dest
23e90 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78  royed on the nex
23ea0 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74  t call to any Bt
23eb0 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20  ree routine,.** 
23ec0 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20  including calls 
23ed0 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61  from other threa
23ee0 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73  ds against the s
23ef0 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65  ame cache..** He
23f00 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20  nce, a mutex on 
23f10 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f  the BtShared sho
23f20 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f  uld be held prio
23f30 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20  r to calling.** 
23f40 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
23f50 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
23f60 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  es is used to ge
23f70 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74  t quick access t
23f80 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a  o key and data.*
23f90 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  * in the common 
23fa0 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76  case where no ov
23fb0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
23fc0 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   used..*/.const 
23fd0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
23fe0 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72  eeKeyFetch(BtCur
23ff0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
24000 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  pAmt){.  return 
24010 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
24020 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73  r, pAmt);.}.cons
24030 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
24040 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74  treeDataFetch(Bt
24050 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
24060 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75  2 *pAmt){.  retu
24070 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28  rn fetchPayload(
24080 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a  pCur, pAmt);.}..
24090 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
240a0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61  cursor down to a
240b0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
240c0 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72    The newPgno ar
240d0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
240e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
240f0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74  the child page t
24100 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a  o move to..**.**
24110 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
24120 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f  eturns SQLITE_CO
24130 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67  RRUPT if the pag
24140 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66  e-header flags f
24150 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ield of.** the n
24160 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f  ew child page do
24170 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
24180 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20   flags field of 
24190 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e  the parent (i.e.
241a0 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79  .** if an intkey
241b0 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f   page appears to
241c0 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f   be the parent o
241d0 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70  f a non-intkey p
241e0 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d  age, or.** vice-
241f0 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69  versa)..*/.stati
24200 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c  c int moveToChil
24210 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
24220 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a  , u32 newPgno){.
24230 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
24240 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  i = pCur->iPage;
24250 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
24260 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64  Page;.  BtShared
24270 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
24280 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
24290 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
242a0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
242b0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
242c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
242d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
242e0 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
242f0 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  AX_DEPTH );.  as
24300 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
24310 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e>=0 );.  if( pC
24320 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55  ur->iPage>=(BTCU
24330 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31  RSOR_MAX_DEPTH-1
24340 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
24350 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
24360 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  KPT;.  }.  rc = 
24370 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
24380 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e  Bt, newPgno, &pN
24390 65 77 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20  ewPage,.        
243a0 20 20 20 20 20 20 20 28 70 43 75 72 2d 3e 63 75         (pCur->cu
243b0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72  rFlags & BTCF_Wr
243c0 69 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41  iteFlag)==0 ? PA
243d0 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
243e0 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20   : 0);.  if( rc 
243f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
24400 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d  Cur->apPage[i+1]
24410 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70   = pNewPage;.  p
24420 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20  Cur->aiIdx[i+1] 
24430 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  = 0;.  pCur->iPa
24440 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ge++;..  pCur->i
24450 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
24460 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
24470 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
24480 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
24490 66 6c 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 50  fl);.  if( pNewP
244a0 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20  age->nCell<1 || 
244b0 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79  pNewPage->intKey
244c0 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  !=pCur->apPage[i
244d0 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ]->intKey ){.   
244e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
244f0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
24500 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24510 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a  _OK;.}..#if 0./*
24520 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74  .** Page pParent
24530 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
24540 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20  (non-leaf) tree 
24550 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
24560 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20  ion .** asserts 
24570 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
24580 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c   iChild is the l
24590 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65  eft-child if the
245a0 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c   iIdx'th.** cell
245b0 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74   in page pParent
245c0 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73  . Or, if iIdx is
245d0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f   equal to the to
245e0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  tal number of.**
245f0 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
24600 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  t, that page num
24610 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
24620 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
24630 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  .** the page..*/
24640 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
24650 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d  ertParentIndex(M
24660 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
24670 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20   int iIdx, Pgno 
24680 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72  iChild){.  asser
24690 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74  t( iIdx<=pParent
246a0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
246b0 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e   iIdx==pParent->
246c0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73  nCell ){.    ass
246d0 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70  ert( get4byte(&p
246e0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
246f0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
24700 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  +8])==iChild );.
24710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
24720 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69  ert( get4byte(fi
24730 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
24740 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29  iIdx))==iChild )
24750 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
24760 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61   define assertPa
24770 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29  rentIndex(x,y,z)
24780 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20   .#endif../*.** 
24790 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
247a0 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
247b0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
247c0 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
247d0 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
247e0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
247f0 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
24800 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
24810 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
24820 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
24830 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
24840 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
24850 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
24860 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
24870 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
24880 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
24890 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
248a0 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  d moveToParent(B
248b0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
248c0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
248d0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
248e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
248f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
24900 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
24910 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
24920 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
24930 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24940 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 0a 20  ur->iPage] );.. 
24950 20 2f 2a 20 55 50 44 41 54 45 3a 20 49 74 20 69   /* UPDATE: It i
24960 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69  s actually possi
24970 62 6c 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 64  ble for the cond
24980 69 74 69 6f 6e 20 74 65 73 74 65 64 20 62 79 20  ition tested by 
24990 74 68 65 20 61 73 73 65 72 74 0a 20 20 2a 2a 20  the assert.  ** 
249a0 62 65 6c 6f 77 20 74 6f 20 62 65 20 75 6e 74 72  below to be untr
249b0 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ue if the databa
249c0 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  se file is corru
249d0 70 74 2e 20 54 68 69 73 20 63 61 6e 20 6f 63 63  pt. This can occ
249e0 75 72 20 69 66 0a 20 20 2a 2a 20 6f 6e 65 20 63  ur if.  ** one c
249f0 75 72 73 6f 72 20 68 61 73 20 6d 6f 64 69 66 69  ursor has modifi
24a00 65 64 20 70 61 67 65 20 70 50 61 72 65 6e 74 20  ed page pParent 
24a10 77 68 69 6c 65 20 61 20 72 65 66 65 72 65 6e 63  while a referenc
24a20 65 20 74 6f 20 69 74 20 69 73 20 68 65 6c 64 20  e to it is held 
24a30 0a 20 20 2a 2a 20 62 79 20 61 20 73 65 63 6f 6e  .  ** by a secon
24a40 64 20 63 75 72 73 6f 72 2e 20 57 68 69 63 68 20  d cursor. Which 
24a50 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
24a60 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  if a single page
24a70 20 69 73 20 6c 69 6e 6b 65 64 0a 20 20 2a 2a 20   is linked.  ** 
24a80 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  into more than o
24a90 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ne b-tree struct
24aa0 75 72 65 20 69 6e 20 61 20 63 6f 72 72 75 70 74  ure in a corrupt
24ab0 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 23   database.  */.#
24ac0 69 66 20 30 0a 20 20 61 73 73 65 72 74 50 61 72  if 0.  assertPar
24ad0 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43  entIndex(.    pC
24ae0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24af0 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
24b00 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
24b10 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
24b20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24b30 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f  ur->iPage]->pgno
24b40 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 74  .  );.#endif.  t
24b50 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61  estcase( pCur->a
24b60 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
24b70 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61  -1] > pCur->apPa
24b80 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
24b90 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 72  ]->nCell );..  r
24ba0 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
24bb0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
24bc0 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69  age]);.  pCur->i
24bd0 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e  Page--;.  pCur->
24be0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
24bf0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
24c00 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
24c10 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
24c20 76 66 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  vfl);.}../*.** M
24c30 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
24c40 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72  o point to the r
24c50 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20  oot page of its 
24c60 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
24c70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ..**.** If the t
24c80 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75  able has a virtu
24c90 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  al root page, th
24ca0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
24cb0 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a   moved to point.
24cc0 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61  ** to the virtua
24cd0 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74  l root page inst
24ce0 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61  ead of the actua
24cf0 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74  l root page. A t
24d00 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69  able has a.** vi
24d10 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
24d20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20  when the actual 
24d30 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69  root page contai
24d40 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20  ns no cells and 
24d50 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69  a .** single chi
24d60 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61  ld page. This ca
24d70 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69  n only happen wi
24d80 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  th the table roo
24d90 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a  ted at page 1..*
24da0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72  *.** If the b-tr
24db0 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ee structure is 
24dc0 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f  empty, the curso
24dd0 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  r state is set t
24de0 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56  o .** CURSOR_INV
24df0 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c  ALID. Otherwise,
24e00 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73   the cursor is s
24e10 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
24e20 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c  he first.** cell
24e30 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20   located on the 
24e40 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c  root (or virtual
24e50 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20   root) page and 
24e60 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
24e70 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55  .** is set to CU
24e80 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
24e90 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
24ea0 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  on returns succe
24eb0 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20  ssfully, it may 
24ec0 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  be assumed that 
24ed0 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64  the.** page-head
24ee0 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74  er flags indicat
24ef0 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74  e that the [virt
24f00 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69  ual] root-page i
24f10 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  s the expected .
24f20 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65  ** kind of b-tre
24f30 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20  e page (i.e. if 
24f40 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
24f50 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c   cursor the call
24f60 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70  er did not.** sp
24f70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
24f80 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
24f90 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
24fa0 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c  to 0x05 or 0x0D,
24fb0 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61  .** indicating a
24fc0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f   table b-tree, o
24fd0 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20  r if the caller 
24fe0 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65  did specify a Ke
24ff0 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
25000 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
25010 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
25020 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63  2 or 0x0A, indic
25030 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a  ating an index.*
25040 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74  * b-tree)..*/.st
25050 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
25060 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
25070 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
25080 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
25090 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
250a0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
250b0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
250c0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
250d0 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
250e0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
250f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
25100 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
25110 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
25120 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
25130 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
25140 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
25150 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
25160 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
25170 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
25180 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
25190 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
251a0 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
251b0 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
251c0 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  t!=SQLITE_OK );.
251d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
251e0 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  r->skipNext;.   
251f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
25200 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
25210 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
25220 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
25230 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  ){.    while( pC
25240 75 72 2d 3e 69 50 61 67 65 20 29 20 72 65 6c 65  ur->iPage ) rele
25250 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
25260 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25270 2d 2d 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  --]);.  }else if
25280 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
25290 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
252a0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
252b0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65  _INVALID;.    re
252c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
252d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
252e0 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
252f0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70  (pCur->pBtree->p
25300 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
25310 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ot, &pCur->apPag
25320 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  e[0],.          
25330 20 20 20 20 20 20 20 28 70 43 75 72 2d 3e 63 75         (pCur->cu
25340 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72  rFlags & BTCF_Wr
25350 69 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41  iteFlag)==0 ? PA
25360 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
25370 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72   : 0);.    if( r
25380 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
25390 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
253a0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
253b0 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LID;.      retur
253c0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
253d0 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b  pCur->iPage = 0;
253e0 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70  .  }.  pRoot = p
253f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
25400 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
25410 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
25420 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  oRoot );..  /* I
25430 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  f pCur->pKeyInfo
25440 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
25450 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68  en the caller th
25460 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63  at opened this c
25470 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63  ursor.  ** expec
25480 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
25490 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
254a0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
254b0 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a   pKeyInfo is.  *
254c0 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c  * NULL, the call
254d0 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62  er expects a tab
254e0 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68  le b-tree. If th
254f0 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
25500 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  se,.  ** return 
25510 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
25520 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20  T error. .  **. 
25530 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73   ** Earlier vers
25540 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61  ions of SQLite a
25550 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73  ssumed that this
25560 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20   test could not 
25570 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65  fail.  ** if the
25580 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61   root page was a
25590 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68  lready loaded wh
255a0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
255b0 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65   was called (i.e
255c0 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e  ..  ** if pCur->
255d0 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74  iPage>=0). But t
255e0 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66  his is not so if
255f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
25600 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a   corrupted .  **
25610 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
25620 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69  hat page pRoot i
25630 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20  s linked into a 
25640 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61  second b-tree ta
25650 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68  ble .  ** (or th
25660 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f  e freelist).  */
25670 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
25680 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70  ->intKey==1 || p
25690 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20  Root->intKey==0 
256a0 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  );.  if( pRoot->
256b0 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43  isInit==0 || (pC
256c0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
256d0 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20  !=pRoot->intKey 
256e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
256f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
25700 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e  T;.  }..  pCur->
25710 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
25720 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
25730 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
25740 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
25750 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
25760 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
25770 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28 20 70  dOvfl);..  if( p
25780 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Root->nCell>0 ){
25790 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
257a0 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
257b0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
257c0 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
257d0 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
257e0 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70      if( pRoot->p
257f0 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20  gno!=1 ) return 
25800 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
25810 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65  KPT;.    subpage
25820 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f   = get4byte(&pRo
25830 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
25840 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
25850 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
25860 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
25870 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
25880 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70  Child(pCur, subp
25890 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
258a0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
258b0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
258c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
258d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
258e0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
258f0 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   to the left-mos
25900 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
25910 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72  eath the.** entr
25920 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  y to which it is
25930 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
25940 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ing..**.** The l
25950 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73  eft-most leaf is
25960 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
25970 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d  e smallest key -
25980 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
25990 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
259a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
259b0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42  moveToLeftmost(B
259c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
259d0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
259e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
259f0 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
25a00 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
25a10 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
25a20 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
25a30 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
25a40 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
25a50 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
25a60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
25a70 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
25a80 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
25a90 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73  ->leaf ){.    as
25aa0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
25ab0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
25ac0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
25ad0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
25ae0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
25af0 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e, pCur->aiIdx[p
25b00 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20  Cur->iPage]));. 
25b10 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
25b20 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
25b30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
25b40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
25b50 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
25b60 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
25b70 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
25b80 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65  eath the.** page
25b90 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
25ba0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
25bb0 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20  ng.  Notice the 
25bc0 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65  difference.** be
25bd0 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  tween moveToLeft
25be0 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54  most() and moveT
25bf0 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d  oRightmost().  m
25c00 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a  oveToLeftmost().
25c10 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66  ** finds the lef
25c20 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
25c30 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a  eath the *entry*
25c40 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52   whereas moveToR
25c50 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  ightmost().** fi
25c60 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  nds the right-mo
25c70 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
25c80 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a   the *page*..**.
25c90 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  ** The right-mos
25ca0 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f  t entry is the o
25cb0 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  ne with the larg
25cc0 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61  est key - the la
25cd0 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63  st.** key in asc
25ce0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
25cf0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
25d00 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75  ToRightmost(BtCu
25d10 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
25d20 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
25d30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25d40 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
25d50 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
25d60 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
25d70 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
25d80 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
25d90 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
25da0 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50  );.  while( !(pP
25db0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
25dc0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
25dd0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
25de0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
25df0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
25e00 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
25e10 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ;.    pCur->aiId
25e20 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
25e30 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
25e40 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
25e50 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
25e60 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
25e70 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
25e80 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
25e90 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
25ea0 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65  >nCell-1;.  asse
25eb0 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
25ec0 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Size==0 );.  ass
25ed0 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
25ee0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
25ef0 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72  dNKey)==0 );.  r
25f00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25f10 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
25f20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
25f30 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
25f40 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
25f50 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
25f60 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
25f70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
25f80 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
25f90 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
25fa0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
25fb0 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
25fc0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
25fd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
25fe0 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
25ff0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
26000 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
26010 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
26020 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
26030 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
26040 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
26050 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
26060 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
26070 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
26080 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
26090 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
260a0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
260b0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
260c0 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  D ){.      asser
260d0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
260e0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
260f0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
26100 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
26110 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
26120 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26130 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
26140 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26150 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  e]->nCell>0 );. 
26160 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
26170 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
26180 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
26190 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
261a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
261b0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
261c0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
261d0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
261e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
261f0 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
26200 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
26210 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
26220 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
26230 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
26240 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
26250 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
26260 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
26270 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74  ite3BtreeLast(Bt
26280 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
26290 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
262a0 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20  rc;. .  assert( 
262b0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
262c0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
262d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
262e0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
262f0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
26300 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
26310 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70  cursor already p
26320 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73  oints to the las
26330 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73  t entry, this is
26340 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
26350 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  f( CURSOR_VALID=
26360 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26  =pCur->eState &&
26370 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
26380 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
26390 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  =0 ){.#ifdef SQL
263a0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
263b0 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
263c0 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  es to assert() t
263d0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72  hat the cursor r
263e0 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74  eally does point
263f0 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20   .    ** to the 
26400 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
26410 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20  e b-tree. */.   
26420 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72   int ii;.    for
26430 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e  (ii=0; ii<pCur->
26440 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  iPage; ii++){.  
26450 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
26460 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75  ->aiIdx[ii]==pCu
26470 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e  r->apPage[ii]->n
26480 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Cell );.    }.  
26490 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
264a0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
264b0 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  e]==pCur->apPage
264c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
264d0 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73  Cell-1 );.    as
264e0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
264f0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
26500 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a  >leaf );.#endif.
26510 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26520 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
26530 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
26540 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
26550 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
26560 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
26570 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
26580 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
26590 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
265a0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
265b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
265c0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
265d0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
265e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
265f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
26600 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
26610 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  D );.      *pRes
26620 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
26630 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
26640 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66  (pCur);.      if
26650 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26660 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
26670 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
26680 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
26690 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
266a0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
266b0 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20   ~BTCF_AtLast;. 
266c0 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d       }.   .    }
266d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
266e0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
266f0 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
26700 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
26710 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
26720 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
26730 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
26740 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
26750 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
26760 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
26770 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
26780 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
26790 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
267a0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
267b0 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
267c0 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
267d0 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
267e0 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
267f0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
26800 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
26810 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
26820 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
26830 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
26840 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
26850 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
26860 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
26870 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
26880 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
26890 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
268a0 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
268b0 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
268c0 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
268d0 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
268e0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52  written into *pR
268f0 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20  es which is the 
26900 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d  result of.** com
26910 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
26920 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
26930 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
26940 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  r is .** pointin
26950 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  g.  The meaning 
26960 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77  of the integer w
26970 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a  ritten into.** *
26980 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  pRes is as follo
26990 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
269a0 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
269b0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
269c0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
269d0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
269e0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
269f0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b  maller than intK
26a00 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66  ey/pIdxKey or if
26a10 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
26a20 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
26a30 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
26a40 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
26a50 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
26a60 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
26a70 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
26a80 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
26a90 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
26aa0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
26ab0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
26ac0 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
26ad0 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  es intKey/pIdxKe
26ae0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
26af0 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
26b00 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
26b10 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
26b20 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
26b30 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
26b40 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  rger than intKey
26b50 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a  /pIdxKey..**.*/.
26b60 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
26b70 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a  MovetoUnpacked(.
26b80 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
26b90 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
26ba0 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d  e cursor to be m
26bb0 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  oved */.  Unpack
26bc0 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
26bd0 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69  y, /* Unpacked i
26be0 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36  ndex key */.  i6
26bf0 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20  4 intKey,       
26c00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
26c10 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ble key */.  int
26c20 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20   biasRight,     
26c30 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
26c40 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
26c50 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
26c60 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
26c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c80 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
26c90 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
26ca0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52  ){.  int rc;.  R
26cb0 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65  ecordCompare xRe
26cc0 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20  cordCompare;..  
26cd0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
26ce0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
26cf0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
26d00 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
26d10 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
26d20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
26d30 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61  ert( pRes );.  a
26d40 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d  ssert( (pIdxKey=
26d50 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79  =0)==(pCur->pKey
26d60 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  Info==0) );..  /
26d70 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
26d80 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74  is already posit
26d90 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69  ioned at the poi
26da0 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  nt we are trying
26db0 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f  .  ** to move to
26dc0 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
26dd0 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
26de0 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69   any work */.  i
26df0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
26e00 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26  =CURSOR_VALID &&
26e10 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
26e20 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
26e30 79 29 21 3d 30 0a 20 20 20 26 26 20 70 43 75 72  y)!=0.   && pCur
26e40 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
26e50 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66  Key .  ){.    if
26e60 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
26e70 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
26e80 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
26e90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26ea0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
26eb0 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
26ec0 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
26ed0 74 29 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  t)!=0 && pCur->i
26ee0 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20  nfo.nKey<intKey 
26ef0 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
26f00 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
26f10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
26f20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49   }.  }..  if( pI
26f30 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65  dxKey ){.    xRe
26f40 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71  cordCompare = sq
26f50 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d  lite3VdbeFindCom
26f60 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20  pare(pIdxKey);. 
26f70 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43     pIdxKey->errC
26f80 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  ode = 0;.    ass
26f90 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65  ert( pIdxKey->de
26fa0 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20  fault_rc==1 .   
26fb0 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79        || pIdxKey
26fc0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20  ->default_rc==0 
26fd0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64  .         || pId
26fe0 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
26ff0 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65  ==-1.    );.  }e
27000 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64  lse{.    xRecord
27010 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20  Compare = 0; /* 
27020 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74  All keys are int
27030 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20  egers */.  }..  
27040 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
27050 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
27060 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
27070 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
27080 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
27090 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
270a0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
270b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
270c0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
270d0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
270e0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e  ur->iPage]->isIn
270f0 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
27100 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
27110 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
27120 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27130 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
27140 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  >0 );.  if( pCur
27150 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
27160 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
27170 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
27180 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
27190 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
271a0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
271b0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
271c0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
271d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
271e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
271f0 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
27200 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20  || pIdxKey );.  
27210 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
27220 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20   lwr, upr, idx, 
27230 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64  c;.    Pgno chld
27240 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  Pg;.    MemPage 
27250 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
27260 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27270 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  e];.    u8 *pCel
27280 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
27290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
272a0 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
272b0 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
272c0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65  */..    /* pPage
272d0 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20  ->nCell must be 
272e0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
272f0 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  o. If this is th
27300 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
27310 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f  ** the cursor wo
27320 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e  uld have been IN
27330 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20  VALID above and 
27340 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f  this for(;;) loo
27350 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e  p.    ** not run
27360 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
27370 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20   the root-page, 
27380 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43  then the moveToC
27390 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20  hild() routine. 
273a0 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65     ** would have
273b0 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65   already detecte
273c0 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d db corruption.
273d0 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67   Similarly, pPag
273e0 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  e must.    ** be
273f0 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20   the right kind 
27400 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29  (index or table)
27410 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e   of b-tree page.
27420 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
27430 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  * a moveToChild(
27440 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  ) or moveToRoot(
27450 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76  ) call would hav
27460 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
27470 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61  ption.  */.    a
27480 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
27490 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ell>0 );.    ass
274a0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
274b0 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29  ey==(pIdxKey==0)
274c0 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   );.    lwr = 0;
274d0 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
274e0 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61  ->nCell-1;.    a
274f0 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74  ssert( biasRight
27500 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74  ==0 || biasRight
27510 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d  ==1 );.    idx =
27520 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67   upr>>(1-biasRig
27530 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69  ht); /* idx = bi
27540 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20  asRight ? upr : 
27550 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
27560 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
27570 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
27580 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28  u16)idx;.    if(
27590 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d   xRecordCompare=
275a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
275b0 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ;;){.        i64
275c0 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
275d0 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
275e0 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20  ell(pPage, idx) 
275f0 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
27600 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
27610 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
27620 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
27630 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d    while( 0x80 <=
27640 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20   *(pCell++) ){. 
27650 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
27660 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61  Cell>=pPage->aDa
27670 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53  taEnd ) return S
27680 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
27690 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  PT;.          }.
276a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
276b0 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c    getVarint(pCel
276c0 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b  l, (u64*)&nCellK
276d0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
276e0 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79   nCellKey<intKey
276f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
27700 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
27710 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
27720 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61   ){ c = -1; brea
27730 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
27740 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e  se if( nCellKey>
27750 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
27760 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
27770 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
27780 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31  wr>upr ){ c = +1
27790 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
277a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
277b0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
277c0 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a  lKey==intKey );.
277d0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
277e0 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
277f0 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
27800 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
27810 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79  .nKey = nCellKey
27820 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
27830 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
27840 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
27850 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
27860 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
27870 20 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d             lwr =
27880 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
27890 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65    goto moveto_ne
278a0 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20  xt_layer;.      
278b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
278c0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
278d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
278e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
278f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
27900 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
27910 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27920 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
27930 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
27940 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
27950 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
27960 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
27970 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  )/2; */.      }.
27980 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27990 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
279a0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20    int nCell;.   
279b0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
279c0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
279d0 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ) + pPage->child
279e0 50 74 72 53 69 7a 65 3b 0a 0a 20 20 20 20 20 20  PtrSize;..      
279f0 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
27a00 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d   supported page-
27a10 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79  size is 65536 by
27a20 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  tes. This means 
27a30 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
27a40 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
27a50 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74  er of record byt
27a60 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20  es stored on an 
27a70 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20  index B-Tree.   
27a80 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20       ** page is 
27a90 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20  less than 16384 
27aa0 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65  bytes and may be
27ab0 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62   stored as a 2-b
27ac0 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  yte.        ** v
27ad0 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f  arint. This info
27ae0 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
27af0 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76  to attempt to av
27b00 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20  oid parsing .   
27b10 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69       ** the enti
27b20 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b  re cell by check
27b30 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65  ing for the case
27b40 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f  s where the reco
27b50 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  rd is .        *
27b60 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c  * stored entirel
27b70 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74  y within the b-t
27b80 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70  ree page by insp
27b90 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  ecting the first
27ba0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62   .        ** 2 b
27bb0 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
27bc0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
27bd0 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65       nCell = pCe
27be0 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[0];.        i
27bf0 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d  f( nCell<=pPage-
27c00 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
27c10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
27c20 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e   This branch run
27c30 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d  s if the record-
27c40 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
27c50 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20  e cell is a.    
27c60 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
27c70 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
27c80 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20  the record fits 
27c90 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
27ca0 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  main.          *
27cb0 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
27cc0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
27cd0 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65  tcase( pCell+nCe
27ce0 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61  ll+1==pPage->aDa
27cf0 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20  taEnd );.       
27d00 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
27d10 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
27d20 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70  id*)&pCell[1], p
27d30 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
27d40 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65   }else if( !(pCe
27d50 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20  ll[1] & 0x80) . 
27d60 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65           && (nCe
27d70 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37  ll = ((nCell&0x7
27d80 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31  f)<<7) + pCell[1
27d90 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ])<=pPage->maxLo
27da0 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  cal.        ){. 
27db0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
27dc0 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
27dd0 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61  d is a 2 byte va
27de0 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
27df0 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ord .          *
27e00 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  * fits entirely 
27e10 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72  on the main b-tr
27e20 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
27e30 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
27e40 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d   pCell+nCell+2==
27e50 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
27e60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
27e70 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
27e80 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
27e90 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79  Cell[2], pIdxKey
27ea0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
27eb0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
27ec0 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20  he record flows 
27ed0 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72  over onto one or
27ee0 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
27ef0 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20  ages. In.       
27f00 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20     ** this case 
27f10 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e  the whole cell n
27f20 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65  eeds to be parse
27f30 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f  d, a buffer allo
27f40 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  cated.          
27f50 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79  ** and accessPay
27f60 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72  load() used to r
27f70 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f  etrieve the reco
27f80 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  rd into the.    
27f90 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20        ** buffer 
27fa0 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72  before VdbeRecor
27fb0 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62  dCompare() can b
27fc0 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20  e called. */.   
27fd0 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65         void *pCe
27fe0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
27ff0 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c   u8 * const pCel
28000 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20  lBody = pCell - 
28010 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
28020 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ize;.          b
28030 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
28040 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64  (pPage, pCellBod
28050 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  y, &pCur->info);
28060 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  .          nCell
28070 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
28080 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
28090 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71     pCellKey = sq
280a0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65  lite3Malloc( nCe
280b0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ll );.          
280c0 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20  if( pCellKey==0 
280d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
280e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
280f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
28100 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
28110 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
28120 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
28130 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
28140 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
28150 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65         rc = acce
28160 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
28170 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67  0, nCell, (unsig
28180 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b  ned char*)pCellK
28190 65 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  ey, 2);.        
281a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
281b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
281c0 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
281d0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
281e0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
281f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28200 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72        c = xRecor
28210 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
28220 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65  pCellKey, pIdxKe
28230 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  y);.          sq
28240 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
28250 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Key);.        }.
28260 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28270 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49  .            (pI
28280 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d  dxKey->errCode!=
28290 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c  SQLITE_CORRUPT |
282a0 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  | c==0).        
282b0 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72   && (pIdxKey->er
282c0 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f  rCode!=SQLITE_NO
282d0 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74  MEM || pCur->pBt
282e0 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ree->db->mallocF
282f0 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29  ailed).        )
28300 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3c  ;.        if( c<
28310 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  0 ){.          l
28320 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20  wr = idx+1;.    
28330 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e      }else if( c>
28340 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
28350 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
28360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28370 20 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d       assert( c==
28380 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  0 );.          *
28390 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
283a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
283b0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  OK;.          pC
283c0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
283d0 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
283e0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  x;.          if(
283f0 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64   pIdxKey->errCod
28400 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  e ) rc = SQLITE_
28410 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
28420 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
28430 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d  inish;.        }
28440 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72  .        if( lwr
28450 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  >upr ) break;.  
28460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77        assert( lw
28470 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20  r+upr>=0 );.    
28480 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75      idx = (lwr+u
28490 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20  pr)>>1;  /* idx 
284a0 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f  = (lwr+upr)/2 */
284b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
284c0 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d     assert( lwr==
284d0 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d  upr+1 || (pPage-
284e0 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
284f0 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20  e->leaf) );.    
28500 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
28510 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28  sInit );.    if(
28520 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
28530 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
28540 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
28550 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
28560 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28570 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ->nCell );.     
28580 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
28590 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
285a0 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65  )idx;.      *pRe
285b0 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20  s = c;.      rc 
285c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
285d0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
285e0 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76  inish;.    }.mov
285f0 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a  eto_next_layer:.
28600 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61      if( lwr>=pPa
28610 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
28620 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
28630 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
28640 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
28650 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c  set+8]);.    }el
28660 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67  se{.      chldPg
28670 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
28680 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29  Cell(pPage, lwr)
28690 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  );.    }.    pCu
286a0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
286b0 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72  Page] = (u16)lwr
286c0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
286d0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c  oChild(pCur, chl
286e0 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  dPg);.    if( rc
286f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f   ) break;.  }.mo
28700 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70  veto_finish:.  p
28710 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
28720 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
28730 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
28740 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
28750 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65 74  alidOvfl);.  ret
28760 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
28770 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
28780 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
28790 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ot pointing at a
287a0 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74  n entry of the t
287b0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45  able..**.** TRUE
287c0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
287d0 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  d after a call t
287e0 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  o sqlite3BtreeNe
287f0 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61  xt() moves.** pa
28800 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  st the last entr
28810 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  y in the table o
28820 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  r sqlite3BtreePr
28830 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a  ev() moves past.
28840 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  ** the first ent
28850 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73  ry.  TRUE is als
28860 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
28870 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
28880 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28890 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f  BtreeEof(BtCurso
288a0 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54  r *pCur){.  /* T
288b0 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65  ODO: What if the
288c0 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55   cursor is in CU
288d0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
288e0 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65   but all table e
288f0 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65  ntries.  ** have
28900 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54   been deleted? T
28910 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65  his API will nee
28920 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72  d to change to r
28930 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
28940 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c  ode.  ** as well
28950 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20   as the boolean 
28960 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20  result value..  
28970 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52  */.  return (CUR
28980 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d  SOR_VALID!=pCur-
28990 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  >eState);.}../*.
289a0 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  ** Advance the c
289b0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
289c0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
289d0 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
289e0 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
289f0 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
28a00 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
28a10 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
28a20 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ing to the last 
28a30 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
28a40 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
28a50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
28a60 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
28a70 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a  t *pRes=1..**.**
28a80 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20   The main entry 
28a90 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33  point is sqlite3
28aa0 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68  BtreeNext().  Th
28ab0 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
28ac0 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
28ad0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
28ae0 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65  f merely increme
28af0 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
28b00 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
28b10 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
28b20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65  next cell on the
28b30 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
28b40 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
28b50 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a  eeNext() helper.
28b60 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
28b70 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  lled when it is 
28b80 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76  necessary to mov
28b90 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  e to a different
28ba0 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72   page or.** to r
28bb0 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
28bc0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  r..**.** The cal
28bd0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69  ling function wi
28be0 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ll set *pRes to 
28bf0 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69  0 or 1.  The ini
28c00 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
28c10 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66  .** will be 1 if
28c20 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e   the cursor bein
28c30 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73  g stepped corres
28c40 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
28c50 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20  index and.** if 
28c60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75  this routine cou
28c70 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ld have been ski
28c80 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c  pped if that SQL
28c90 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a   index had been.
28ca0 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  ** a unique inde
28cb0 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  x.  Otherwise th
28cc0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61  e caller will ha
28cd0 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ve set *pRes to 
28ce0 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73  zero..** Zero is
28cf0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
28d00 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c  . The btree impl
28d10 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72  ementation is fr
28d20 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  ee to use the.**
28d30 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
28d40 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74  alue as a hint t
28d50 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72  o improve perfor
28d60 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63  mance, but the c
28d70 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65  urrent.** SQLite
28d80 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
28d90 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20  ation does not. 
28da0 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63  (Note that the c
28db0 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69  omdb2 btree.** i
28dc0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
28dd0 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  es use this hint
28de0 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73  , however.).*/.s
28df0 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
28e00 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e  NLINE int btreeN
28e10 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
28e20 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
28e30 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
28e40 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
28e50 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
28e60 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
28e70 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
28e80 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
28e90 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
28ea0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
28eb0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
28ec0 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20  t( *pRes==0 );. 
28ed0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
28ee0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
28ef0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
28f00 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
28f10 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
28f20 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
28f30 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
28f40 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
28f50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28f60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
28f70 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
28f80 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
28f90 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
28fa0 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  e ){.      *pRes
28fb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
28fc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
28fd0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
28fe0 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20  ->skipNext ){.  
28ff0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
29000 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29010 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
29020 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
29030 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20  KIPNEXT );.     
29040 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
29050 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
29060 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
29070 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20  ipNext>0 ){.    
29080 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
29090 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
290a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
290b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
290c0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
290d0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
290e0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
290f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29100 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43  e];.  idx = ++pC
29110 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
29120 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
29130 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
29140 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
29150 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
29160 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20   corrupt, it is 
29170 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
29180 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20   value of idx . 
29190 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69   ** to be invali
291a0 64 20 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e  d here. This can
291b0 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61   only occur if a
291c0 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d   second cursor m
291d0 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65  odifies.  ** the
291e0 20 70 61 67 65 20 77 68 69 6c 65 20 63 75 72 73   page while curs
291f0 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69  or pCur is holdi
29200 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ng a reference t
29210 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a  o it. Which can.
29220 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e    ** only happen
29230 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
29240 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73   is corrupt in s
29250 75 63 68 20 61 20 77 61 79 20 61 73 20 74 6f 20  uch a way as to 
29260 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61  link the.  ** pa
29270 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61  ge into more tha
29280 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72  n one b-tree str
29290 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73  ucture. */.  tes
292a0 74 63 61 73 65 28 20 69 64 78 3e 70 50 61 67 65  tcase( idx>pPage
292b0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66  ->nCell );..  if
292c0 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( idx>=pPage->nC
292d0 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ell ){.    if( !
292e0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
292f0 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
29300 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
29310 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
29320 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
29330 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
29340 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
29350 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
29360 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
29370 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
29380 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70   do{.      if( p
29390 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
293a0 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
293b0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   1;.        pCur
293c0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
293d0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
293e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
293f0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
29400 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
29410 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61  pCur);.      pPa
29420 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
29430 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
29440 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72      }while( pCur
29450 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
29460 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  age]>=pPage->nCe
29470 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ll );.    if( pP
29480 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
29490 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
294a0 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
294b0 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
294c0 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
294d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
294e0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61   }.  }.  if( pPa
294f0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
29500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29510 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
29520 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
29530 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  most(pCur);.  }.
29540 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
29550 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
29560 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
29570 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
29580 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63  age;.  assert( c
29590 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
295a0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
295b0 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
295c0 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
295d0 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a   || *pRes==1 );.
295e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
295f0 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
29600 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
29610 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70  SOR_VALID );.  p
29620 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
29630 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
29640 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
29650 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
29660 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a 70 52  alidOvfl);.  *pR
29670 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43  es = 0;.  if( pC
29680 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
29690 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72  OR_VALID ) retur
296a0 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  n btreeNext(pCur
296b0 2c 20 70 52 65 73 29 3b 0a 20 20 70 50 61 67 65  , pRes);.  pPage
296c0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
296d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
296e0 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 61 69 49  if( (++pCur->aiI
296f0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  dx[pCur->iPage])
29700 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
29710 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  {.    pCur->aiId
29720 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
29730 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  ;.    return btr
29740 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
29750 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  s);.  }.  if( pP
29760 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
29770 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29780 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
29790 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
297a0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
297b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  .}../*.** Step t
297c0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
297d0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
297e0 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
297f0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
29800 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
29810 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
29820 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
29830 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
29840 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
29850 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
29860 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
29870 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
29880 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
29890 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
298a0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
298b0 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
298c0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
298d0 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74  us().  That rout
298e0 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ine is optimized
298f0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  .** for the comm
29900 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c  on case of merel
29910 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74  y decrementing t
29920 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20  he cell counter 
29930 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a  BtCursor.aiIdx.*
29940 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  * to the previou
29950 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75  s cell on the cu
29960 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65  rrent page.  The
29970 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50   (slower) btreeP
29980 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c  revious().** hel
29990 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63  per routine is c
299a0 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73  alled when it is
299b0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f   necessary to mo
299c0 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ve to a differen
299d0 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20  t page.** or to 
299e0 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  restore the curs
299f0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  or..**.** The ca
29a00 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77  lling function w
29a10 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f  ill set *pRes to
29a20 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e   0 or 1.  The in
29a30 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
29a40 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69  e.** will be 1 i
29a50 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69  f the cursor bei
29a60 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65  ng stepped corre
29a70 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c  sponds to an SQL
29a80 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66   index and.** if
29a90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
29aa0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b  uld have been sk
29ab0 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51  ipped if that SQ
29ac0 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e  L index had been
29ad0 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64  .** a unique ind
29ae0 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74  ex.  Otherwise t
29af0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  he caller will h
29b00 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f  ave set *pRes to
29b10 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69   zero..** Zero i
29b20 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  s the common cas
29b30 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70  e. The btree imp
29b40 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66  lementation is f
29b50 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a  ree to use the.*
29b60 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  * initial *pRes 
29b70 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20  value as a hint 
29b80 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f  to improve perfo
29b90 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20  rmance, but the 
29ba0 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74  current.** SQLit
29bb0 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
29bc0 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e  tation does not.
29bd0 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20   (Note that the 
29be0 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20  comdb2 btree.** 
29bf0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
29c00 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e  oes use this hin
29c10 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a  t, however.).*/.
29c20 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
29c30 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65  INLINE int btree
29c40 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
29c50 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
29c60 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
29c70 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
29c80 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
29c90 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
29ca0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
29cb0 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pRes!=0 );.  ass
29cc0 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b  ert( *pRes==0 );
29cd0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29ce0 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
29cf0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
29d00 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
29d10 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
29d20 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f  urFlags & (BTCF_
29d30 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69  AtLast|BTCF_Vali
29d40 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64  dOvfl|BTCF_Valid
29d50 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61  NKey))==0 );.  a
29d60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
29d70 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  o.nSize==0 );.  
29d80 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
29d90 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
29da0 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f  {.    rc = resto
29db0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
29dc0 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
29dd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29de0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
29df0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
29e00 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
29e10 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
29e20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
29e30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
29e40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
29e50 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
29e60 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61  pNext ){.      a
29e70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
29e80 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
29e90 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
29ea0 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
29eb0 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  XT );.      pCur
29ec0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
29ed0 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69  R_VALID;.      i
29ee0 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
29ef0 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  t<0 ){.        p
29f00 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
29f10 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
29f20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
29f30 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
29f40 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
29f50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
29f60 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
29f70 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
29f80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
29f90 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
29fa0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
29fb0 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
29fc0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
29fd0 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d  iPage];.    rc =
29fe0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
29ff0 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  r, get4byte(find
2a000 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
2a010 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
2a020 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a030 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
2a040 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65  most(pCur);.  }e
2a050 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
2a060 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2a070 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20  ->iPage]==0 ){. 
2a080 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
2a090 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
2a0a0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2a0b0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2a0c0 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  ;.        *pRes 
2a0d0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
2a0e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2a0f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
2a100 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
2a110 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2a120 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
2a130 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ize==0 );.    as
2a140 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
2a150 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56 61  Flags & (BTCF_Va
2a160 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
2a170 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a  idOvfl))==0 );..
2a180 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2a190 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a  pCur->iPage]--;.
2a1a0 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
2a1b0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2a1c0 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70  Page];.    if( p
2a1d0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
2a1e0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2a1f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a200 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
2a210 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
2a220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2a230 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2a240 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2a250 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
2a260 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
2a270 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2a280 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 61 73  int *pRes){.  as
2a290 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2a2a0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2a2b0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
2a2c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  0 );.  assert( *
2a2d0 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73  pRes==0 || *pRes
2a2e0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
2a2f0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2a300 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2a310 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2a320 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b   );.  *pRes = 0;
2a330 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2a340 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61  s &= ~(BTCF_AtLa
2a350 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
2a360 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
2a370 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
2a380 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28  nSize = 0;.  if(
2a390 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2a3a0 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c  URSOR_VALID.   |
2a3b0 7c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  | pCur->aiIdx[pC
2a3c0 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a 20 20  ur->iPage]==0.  
2a3d0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
2a3e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c  [pCur->iPage]->l
2a3f0 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  eaf==0.  ){.    
2a400 72 65 74 75 72 6e 20 62 74 72 65 65 50 72 65 76  return btreePrev
2a410 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29  ious(pCur, pRes)
2a420 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69  ;.  }.  pCur->ai
2a430 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2a440 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  --;.  return SQL
2a450 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2a460 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
2a470 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
2a480 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
2a490 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  ** The new page 
2a4a0 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  is marked as dir
2a4b0 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77  ty.  (In other w
2a4c0 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67  ords, sqlite3Pag
2a4d0 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73  erWrite().** has
2a4e0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
2a4f0 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20  lled on the new 
2a500 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20  page.)  The new 
2a510 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a  page has also.**
2a520 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
2a530 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67   and the calling
2a540 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70   routine is resp
2a550 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
2a560 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ing.** sqlite3Pa
2a570 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68  gerUnref() on th
2a580 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20  e new page when 
2a590 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a  it is done..**.*
2a5a0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
2a5b0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
2a5c0 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  ss.  Any other r
2a5d0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
2a5e0 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  cates.** an erro
2a5f0 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20  r.  *ppPage and 
2a600 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66  *pPgno are undef
2a610 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ined in the even
2a620 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t of an error..*
2a630 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20  * Do not invoke 
2a640 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2a650 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69  f() on *ppPage i
2a660 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  f an error is re
2a670 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
2a680 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
2a690 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
2a6a0 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74  , then an effort
2a6b0 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
2a6c0 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
2a6d0 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
2a6e0 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
2a6f0 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
2a700 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
2a710 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
2a720 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
2a730 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
2a740 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a750 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
2a760 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
2a770 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
2a780 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
2a790 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74  he eMode paramet
2a7a0 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58  er is BTALLOC_EX
2a7b0 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72  ACT and the near
2a7c0 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a  by page exists.*
2a7d0 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  * anywhere on th
2a7e0 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
2a7f0 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  n it is guarante
2a800 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ed to be returne
2a810 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20  d.  If.** eMode 
2a820 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68  is BTALLOC_LT th
2a830 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75  en the page retu
2a840 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73  rned will be les
2a850 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
2a860 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20  ** to nearby if 
2a870 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78  any such page ex
2a880 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20  ists.  If eMode 
2a890 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74  is BTALLOC_ANY t
2a8a0 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65  hen there.** are
2a8b0 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73   no restrictions
2a8c0 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69   on which page i
2a8d0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
2a8e0 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
2a8f0 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42  teBtreePage(.  B
2a900 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
2a910 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
2a920 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
2a930 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f  **ppPage,      /
2a940 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20  * Store pointer 
2a950 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
2a960 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
2a970 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20  Pgno *pPgno,    
2a980 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
2a990 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2a9a0 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  here */.  Pgno n
2a9b0 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20  earby,          
2a9c0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
2a9d0 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20   page near this 
2a9e0 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64  one */.  u8 eMod
2a9f0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2aa00 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  /* BTALLOC_EXACT
2aa10 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72  , BTALLOC_LT, or
2aa20 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a   BTALLOC_ANY */.
2aa30 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
2aa40 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
2aa50 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20    u32 n;     /* 
2aa60 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2aa70 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
2aa80 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20  */.  u32 k;     
2aa90 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
2aaa0 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
2aab0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
2aac0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2aad0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d  Trunk = 0;.  Mem
2aae0 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b  Page *pPrevTrunk
2aaf0 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50   = 0;.  Pgno mxP
2ab00 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61  age;     /* Tota
2ab10 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
2ab20 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
2ab30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2ab40 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
2ab50 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2ab60 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41  sert( eMode==BTA
2ab70 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61  LLOC_ANY || (nea
2ab80 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d  rby>0 && IfNotOm
2ab90 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61  itAV(pBt->autoVa
2aba0 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67  cuum)) );.  pPag
2abb0 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
2abc0 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72  ;.  mxPage = btr
2abd0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
2abe0 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  ;.  n = get4byte
2abf0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2ac00 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65  36]);.  testcase
2ac10 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b  ( n==mxPage-1 );
2ac20 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65  .  if( n>=mxPage
2ac30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2ac40 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2ac50 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e  PT;.  }.  if( n>
2ac60 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
2ac70 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
2ac80 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
2ac90 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
2aca0 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
2acb0 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
2acc0 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
2acd0 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
2ace0 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
2acf0 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
2ad00 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20  rby' */.    .   
2ad10 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54   /* If eMode==BT
2ad20 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20  ALLOC_EXACT and 
2ad30 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
2ad40 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
2ad50 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
2ad60 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
2ad70 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
2ad80 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
2ad90 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
2ada0 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
2adb0 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
2adc0 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
2add0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ade0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2adf0 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
2ae00 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a  TALLOC_EXACT ){.
2ae10 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
2ae20 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  <=mxPage ){.    
2ae30 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
2ae40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
2ae50 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
2ae60 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
2ae70 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
2ae80 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2ae90 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c  Get(pBt, nearby,
2aea0 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20   &eType, 0);.   
2aeb0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2aec0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2aed0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
2aee0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
2aef0 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
2af00 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ist = 1;.       
2af10 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2af20 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d  else if( eMode==
2af30 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
2af40 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
2af50 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
2af60 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
2af70 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
2af80 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
2af90 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
2afa0 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
2afb0 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
2afc0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
2afd0 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
2afe0 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
2aff0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2b000 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2b010 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
2b020 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2b030 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
2b040 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2b050 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
2b060 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
2b070 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
2b080 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
2b090 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
2b0a0 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
2b0b0 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
2b0c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
2b0d0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
2b0e0 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
2b0f0 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
2b100 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
2b110 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
2b120 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
2b130 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20  BTALLOC_EXACT). 
2b140 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61     ** or until a
2b150 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20   page less than 
2b160 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
2b170 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
2b180 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20  LOC_LT).    */. 
2b190 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
2b1a0 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
2b1b0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
2b1c0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
2b1d0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
2b1e0 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
2b1f0 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
2b200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b210 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
2b220 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2b230 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
2b240 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2b250 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20   iTrunk==mxPage 
2b260 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  );.      if( iTr
2b270 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  unk>mxPage ){.  
2b280 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2b290 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2b2a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b2b0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
2b2c0 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
2b2d0 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
2b2e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2b2f0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2b300 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
2b310 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2b320 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2b330 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
2b340 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a  t( pTrunk!=0 );.
2b350 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2b360 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29  runk->aData!=0 )
2b370 3b 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74  ;..      k = get
2b380 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
2b390 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20 23 20 6f  Data[4]); /* # o
2b3a0 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 69 73  f leaves on this
2b3b0 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
2b3c0 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
2b3d0 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
2b3e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2b3f0 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
2b400 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
2b410 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
2b420 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
2b430 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
2b440 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
2b450 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
2b460 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
2b470 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
2b480 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
2b490 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
2b4a0 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
2b4b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2b4c0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
2b4d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2b4e0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2b4f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2b500 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2b510 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b520 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
2b530 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
2b540 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2b550 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2b560 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2b570 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2b580 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
2b590 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
2b5a0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2b5b0 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
2b5c0 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
2b5d0 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
2b5e0 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
2b5f0 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42  e if( k>(u32)(pB
2b600 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
2b610 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  - 2) ){.        
2b620 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
2b630 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
2b640 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
2b650 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
2b660 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2b670 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2b680 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2b690 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
2b6a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2b6b0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
2b6c0 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
2b6d0 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
2b6e0 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
2b6f0 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
2b700 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
2b710 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
2b720 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
2b730 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
2b740 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
2b750 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
2b760 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
2b770 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
2b780 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
2b790 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
2b7a0 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
2b7b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
2b7c0 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
2b7d0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2b7e0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
2b7f0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
2b800 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2b810 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2b820 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2b830 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2b840 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2b850 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2b860 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
2b870 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
2b880 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2b890 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
2b8a0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2b8b0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2b8c0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2b8d0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2b8e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2b8f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2b900 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2b910 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
2b920 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2b930 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2b940 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2b950 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2b960 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2b970 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b980 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2b990 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
2b9a0 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
2b9b0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2b9c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b9d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b9e0 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
2b9f0 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
2ba00 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
2ba10 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
2ba20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
2ba30 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
2ba40 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
2ba50 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
2ba60 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
2ba70 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
2ba80 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
2ba90 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2baa0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
2bab0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
2bac0 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
2bad0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2bae0 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
2baf0 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
2bb00 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
2bb10 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2bb20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2bb30 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2bb40 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2bb50 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2bb60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
2bb70 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75  estcase( iNewTru
2bb80 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
2bb90 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2bba0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2bbb0 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
2bbc0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
2bbd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2bbe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2bbf0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2bc00 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2bc10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bc20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2bc30 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
2bc40 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2bc50 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2bc60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bc70 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
2bc80 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
2bc90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2bca0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2bcb0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2bcc0 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
2bcd0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
2bce0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
2bcf0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2bd00 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
2bd10 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
2bd20 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
2bd30 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
2bd40 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
2bd50 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
2bd60 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
2bd70 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
2bd80 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
2bd90 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
2bda0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
2bdb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
2bdc0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2bdd0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2bde0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20  Page1->pDbPage) 
2bdf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
2be00 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
2be10 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
2be20 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2be30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2be40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2be50 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
2be60 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
2be70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2be80 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2be90 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2bea0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2beb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2bec0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
2bed0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
2bee0 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
2bef0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
2bf00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bf10 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
2bf20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2bf30 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
2bf40 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
2bf50 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
2bf60 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
2bf70 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2bf80 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  k>0 ){.        /
2bf90 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66  * Extract a leaf
2bfa0 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20   from the trunk 
2bfb0 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  */.        u32 c
2bfc0 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20  losest;.        
2bfd0 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20  Pgno iPage;.    
2bfe0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
2bff0 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e  r *aData = pTrun
2c000 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  k->aData;.      
2c010 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
2c020 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
2c030 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  i;.          clo
2c040 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
2c050 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
2c060 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20  TALLOC_LE ){.   
2c070 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
2c080 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
2c090 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67 65             iPage
2c0a0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
2c0b0 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20  ta[8+i*4]);.    
2c0c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
2c0d0 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age<=nearby ){. 
2c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2c0f0 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
2c100 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2c110 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2c120 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2c130 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2c140 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2c150 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20  t dist;.        
2c160 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74      dist = sqlit
2c170 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
2c180 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d  yte(&aData[8]) -
2c190 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
2c1a0 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
2c1b0 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
2c1c0 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d          int d2 =
2c1d0 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
2c1e0 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
2c1f0 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62  [8+i*4]) - nearb
2c200 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
2c210 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
2c220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c230 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
2c240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
2c250 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
2c260 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c280 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2c290 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
2c2a0 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
2c2b0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
2c2c0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
2c2d0 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
2c2e0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
2c2f0 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
2c300 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
2c310 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29  ( iPage>mxPage )
2c320 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2c330 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2c340 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2c350 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2c360 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2c370 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
2c380 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
2c390 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
2c3a0 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20   !searchList .  
2c3b0 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65         || (iPage
2c3c0 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61  ==nearby || (iPa
2c3d0 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  ge<nearby && eMo
2c3e0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
2c3f0 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
2c400 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
2c410 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
2c420 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
2c430 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
2c440 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
2c450 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
2c460 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
2c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2c480 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
2c490 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
2c4a0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
2c4b0 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
2c4c0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
2c4d0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  1));.          r
2c4e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2c4f0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2c500 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2c510 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2c520 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2c530 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
2c540 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
2c550 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
2c560 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
2c570 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
2c580 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
2c590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c5a0 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
2c5b0 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
2c5c0 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
2c5d0 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
2c5e0 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
2c5f0 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  )? PAGER_GET_NOC
2c600 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20  ONTENT : 0;.    
2c610 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
2c620 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
2c630 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43  gno, ppPage, noC
2c640 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  ontent);.       
2c650 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c660 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2c670 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2c680 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
2c690 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
2c6a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c6b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2c6c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
2c6d0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
2c6e0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
2c6f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2c700 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
2c710 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
2c720 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2c730 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
2c740 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
2c750 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
2c760 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72      }while( sear
2c770 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73  chList );.  }els
2c780 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
2c790 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20  are no pages on 
2c7a0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f  the freelist, so
2c7b0 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61   append a new pa
2c7c0 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ge to the.    **
2c7d0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e   database image.
2c7e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
2c7f0 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67  ormally, new pag
2c800 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  es allocated by 
2c810 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62  this block can b
2c820 65 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  e requested from
2c830 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
2c840 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
2c850 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
2c860 61 67 20 73 65 74 2e 20 54 68 69 73 20 70 72 65  ag set. This pre
2c870 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a  vents the pager.
2c880 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69      ** from tryi
2c890 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65 20 70  ng to read the p
2c8a0 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ages content fro
2c8b0 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c  m disk. However,
2c8c0 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   if the.    ** c
2c8d0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
2c8e0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 72  on has already r
2c8f0 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69  un one or more i
2c900 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
2c910 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20  m.    ** steps, 
2c920 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 77 65  then the page we
2c930 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c   are about to al
2c940 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61  locate may conta
2c950 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  in content.    *
2c960 2a 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  * that is requir
2c970 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
2c980 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  of a rollback. I
2c990 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a  n this case, do.
2c9a0 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74      ** not set t
2c9b0 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c  he no-content fl
2c9c0 61 67 2e 20 54 68 69 73 20 63 61 75 73 65 73 20  ag. This causes 
2c9d0 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61  the pager to loa
2c9e0 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20  d and journal.  
2c9f0 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
2ca00 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65   page content be
2ca10 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67  fore overwriting
2ca20 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20   it..    **.    
2ca30 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
2ca40 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20   pager will not 
2ca50 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74  actually attempt
2ca60 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72   to load or jour
2ca70 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  nal .    ** cont
2ca80 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65  ent for any page
2ca90 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65   that really doe
2caa0 73 20 6c 69 65 20 70 61 73 74 20 74 68 65 20 65  s lie past the e
2cab0 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
2cac0 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f  se.    ** file o
2cad0 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65  n disk. So the e
2cae0 66 66 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c  ffects of disabl
2caf0 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65  ing the no-conte
2cb00 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  nt optimization.
2cb10 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20      ** here are 
2cb20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73  confined to thos
2cb30 65 20 70 61 67 65 73 20 74 68 61 74 20 6c 69 65  e pages that lie
2cb40 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64   between the end
2cb50 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   of the.    ** d
2cb60 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e  atabase image an
2cb70 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  d the end of the
2cb80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2cb90 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62      */.    int b
2cba0 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d  NoContent = (0==
2cbb0 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
2cbc0 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20  >bDoTruncate))? 
2cbd0 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
2cbe0 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d  ENT:0;..    rc =
2cbf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2cc00 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
2cc10 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2cc20 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2cc30 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
2cc40 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  ++;.    if( pBt-
2cc50 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
2cc60 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2cc70 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a   pBt->nPage++;..
2cc80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2cc90 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2cca0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
2ccb0 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50  Vacuum && PTRMAP
2ccc0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74  _ISPAGE(pBt, pBt
2ccd0 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20  ->nPage) ){.    
2cce0 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72    /* If *pPgno r
2ccf0 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74  efers to a point
2cd00 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c  er-map page, all
2cd10 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61  ocate two new pa
2cd20 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ges.      ** at 
2cd30 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
2cd40 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ile instead of o
2cd50 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c  ne. The first al
2cd60 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20  located page.   
2cd70 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20     ** becomes a 
2cd80 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  new pointer-map 
2cd90 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  page, the second
2cda0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
2cdb0 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f  caller..      */
2cdc0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
2cdd0 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  pPg = 0;.      T
2cde0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
2cdf0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
2ce00 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
2ce10 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d  p page)\n", pBt-
2ce20 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20  >nPage));.      
2ce30 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
2ce40 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge!=PENDING_BYTE
2ce50 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
2ce60 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2ce70 74 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e  tPage(pBt, pBt->
2ce80 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f  nPage, &pPg, bNo
2ce90 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
2cea0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ceb0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2cec0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2ced0 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
2cee0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
2cef0 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
2cf00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2cf10 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2cf20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b       pBt->nPage+
2cf30 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  +;.      if( pBt
2cf40 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
2cf50 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2cf60 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b  ){ pBt->nPage++;
2cf70 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
2cf80 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20      put4byte(28 
2cf90 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67  + (u8*)pBt->pPag
2cfa0 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  e1->aData, pBt->
2cfb0 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67  nPage);.    *pPg
2cfc0 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b  no = pBt->nPage;
2cfd0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
2cfe0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
2cff0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
2d000 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2d010 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
2d020 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f  o, ppPage, bNoCo
2d030 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  ntent);.    if( 
2d040 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2d050 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2d060 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
2d070 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
2d080 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2d090 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2d0a0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
2d0b0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
2d0c0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
2d0d0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
2d0e0 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
2d0f0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
2d100 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
2d110 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2d120 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
2d130 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
2d140 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
2d150 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
2d160 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20  evTrunk);.  if( 
2d170 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2d180 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2d190 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
2d1a0 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
2d1b0 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20  Page)>1 ){.     
2d1c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
2d1d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70  Page);.      *pp
2d1e0 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
2d1f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2d200 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2d210 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d  }.    (*ppPage)-
2d220 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
2d230 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
2d240 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
2d250 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
2d260 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  OK || sqlite3Pag
2d270 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a  erIswriteable((*
2d280 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
2d290 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
2d2a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2d2b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2d2c0 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61   to add page iPa
2d2d0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
2d2e0 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73  se file free-lis
2d2f0 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  t. .** It is ass
2d300 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61  umed that the pa
2d310 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
2d320 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20  y a part of the 
2d330 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
2d340 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   The value passe
2d350 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
2d360 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
2d370 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74   function is opt
2d380 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  ional..** If the
2d390 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20   caller happens 
2d3a0 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65  to have a pointe
2d3b0 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  r to the MemPage
2d3c0 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72   object .** corr
2d3d0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67  esponding to pag
2d3e0 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69  e iPage handy, i
2d3f0 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73  t may pass it as
2d400 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75   the second valu
2d410 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  e. .** Otherwise
2d420 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55  , it may pass NU
2d430 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70  LL..**.** If a p
2d440 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50  ointer to a MemP
2d450 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61  age object is pa
2d460 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2d470 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
2d480 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
2d490 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72  unt is not alter
2d4a0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
2d4b0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
2d4c0 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53  nt freePage2(BtS
2d4d0 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50  hared *pBt, MemP
2d4e0 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50  age *pMemPage, P
2d4f0 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65  gno iPage){.  Me
2d500 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
2d510 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2d520 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74    /* Free-list t
2d530 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50  runk page */.  P
2d540 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20  gno iTrunk = 0; 
2d550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d560 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2d570 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74  r of free-list t
2d580 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20  runk page */ .  
2d590 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
2d5a0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20  = pBt->pPage1;  
2d5b0 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66      /* Local ref
2d5c0 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
2d5d0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2d5e0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2d5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2d600 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d  e being freed. M
2d610 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  ay be NULL. */. 
2d620 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d640 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
2d650 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ode */.  int nFr
2d660 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ee;             
2d670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d680 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
2d690 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d  f pages on free-
2d6a0 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  list */..  asser
2d6b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2d6c0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
2d6d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
2d6e0 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65  Page>1 );.  asse
2d6f0 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c  rt( !pMemPage ||
2d700 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d   pMemPage->pgno=
2d710 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28  =iPage );..  if(
2d720 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20   pMemPage ){.   
2d730 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67   pPage = pMemPag
2d740 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  e;.    sqlite3Pa
2d750 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44  gerRef(pPage->pD
2d760 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bPage);.  }else{
2d770 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72  .    pPage = btr
2d780 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
2d790 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  , iPage);.  }.. 
2d7a0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
2d7b0 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e  e free page coun
2d7c0 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20  t on pPage1 */. 
2d7d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2d7e0 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
2d7f0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
2d800 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
2d810 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20  ge_out;.  nFree 
2d820 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2d830 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
2d840 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2d850 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
2d860 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20  Free+1);..  if( 
2d870 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2d880 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
2d890 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  E ){.    /* If t
2d8a0 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65  he secure_delete
2d8b0 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
2d8c0 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  ed, then.    ** 
2d8d0 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65  always fully ove
2d8e0 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
2d8f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
2d900 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  zeros..    */.  
2d910 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26    if( (!pPage &&
2d920 20 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74   ((rc = btreeGet
2d930 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
2d940 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29   &pPage, 0))!=0)
2d950 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20   ).     ||      
2d960 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c        ((rc = sql
2d970 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2d980 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21  Page->pDbPage))!
2d990 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
2d9a0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2d9b0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  ut;.    }.    me
2d9c0 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
2d9d0 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74  a, 0, pPage->pBt
2d9e0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
2d9f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
2da00 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
2da10 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
2da20 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
2da30 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
2da40 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
2da50 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
2da60 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
2da70 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2da80 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  {.    ptrmapPut(
2da90 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d  pBt, iPage, PTRM
2daa0 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20  AP_FREEPAGE, 0, 
2dab0 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
2dac0 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
2dad0 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
2dae0 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74  Now manipulate t
2daf0 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61  he actual databa
2db00 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72  se free-list str
2db10 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72  ucture. There ar
2db20 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69  e two.  ** possi
2db30 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65  bilities. If the
2db40 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75   free-list is cu
2db50 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f  rrently empty, o
2db60 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  r if the first. 
2db70 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69   ** trunk page i
2db80 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
2db90 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68  is full, then th
2dba0 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
2dbb0 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66  ome a.  ** new f
2dbc0 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2dbd0 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
2dbe0 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  it will become a
2dbf0 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a   leaf of the.  *
2dc00 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  * first trunk pa
2dc10 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ge in the curren
2dc20 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  t free-list. Thi
2dc30 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66  s block tests if
2dc40 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
2dc50 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20  ible to add the 
2dc60 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72  page as a new fr
2dc70 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20  ee-list leaf..  
2dc80 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d  */.  if( nFree!=
2dc90 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65  0 ){.    u32 nLe
2dca0 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
2dcb0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
2dcc0 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c  mber of leaf cel
2dcd0 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  ls on trunk page
2dce0 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20   */..    iTrunk 
2dcf0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2dd00 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
2dd10 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2dd20 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
2dd30 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
2dd40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2dd50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
2dd60 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2dd70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65  ;.    }..    nLe
2dd80 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  af = get4byte(&p
2dd90 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
2dda0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
2ddb0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32  t->usableSize>32
2ddc0 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61   );.    if( nLea
2ddd0 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73  f > (u32)pBt->us
2dde0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29  ableSize/4 - 2 )
2ddf0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2de00 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2de10 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
2de20 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
2de30 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c  .    if( nLeaf <
2de40 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
2de50 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
2de60 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
2de70 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f  case there is ro
2de80 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  om on the trunk 
2de90 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74  page to insert t
2dea0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
2deb0 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
2dec0 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20  a new leaf..    
2ded0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
2dee0 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e  te that the trun
2def0 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65  k page is not re
2df00 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20  ally full until 
2df10 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  it contains.    
2df20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
2df30 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e  4 - 2 entries, n
2df40 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ot usableSize/4 
2df50 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77  - 8 entries as w
2df60 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  e have.      ** 
2df70 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20  coded.  But due 
2df80 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
2df90 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66  r in versions of
2dfa0 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
2dfb0 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c  .      ** 3.6.0,
2dfc0 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
2dfd0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
2dfe0 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72  ages holding mor
2dff0 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  e than.      ** 
2e000 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
2e010 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65   entries will be
2e020 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72   reported as cor
2e030 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a  rupt.  In order.
2e040 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e        ** to main
2e050 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63  tain backwards c
2e060 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
2e070 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  h older versions
2e080 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20   of SQLite,.    
2e090 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e    ** we will con
2e0a0 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63  tinue to restric
2e0b0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
2e0c0 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c  entries to usabl
2e0d0 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20  eSize/4 - 8.    
2e0e0 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41    ** for now.  A
2e0f0 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
2e100 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65  the future (once
2e110 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70   everyone has up
2e120 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20  graded.      ** 
2e130 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65  to 3.6.0 or late
2e140 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e  r) we should con
2e150 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65  sider fixing the
2e160 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
2e170 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  ve.      ** to r
2e180 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f  ead "usableSize/
2e190 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20  4-2" instead of 
2e1a0 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22  "usableSize/4-8"
2e1b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2e1c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2e1d0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
2e1e0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2e1f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e200 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
2e210 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
2e220 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31  Data[4], nLeaf+1
2e230 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
2e240 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2e250 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69  ta[8+nLeaf*4], i
2e260 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
2e270 66 28 20 70 50 61 67 65 20 26 26 20 28 70 42 74  f( pPage && (pBt
2e280 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
2e290 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d  _SECURE_DELETE)=
2e2a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2e2b0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
2e2c0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2e2d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
2e2e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
2e2f0 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeSetHasContent
2e300 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
2e310 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
2e320 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
2e330 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20  d leaf on trunk 
2e340 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65  page %d\n",pPage
2e350 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70  ->pgno,pTrunk->p
2e360 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  gno));.      got
2e370 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2e380 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2e390 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73  If control flows
2e3a0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
2e3b0 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20  then it was not 
2e3c0 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
2e3d0 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  the.  ** the pag
2e3e0 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  e being freed as
2e3f0 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20   a leaf page of 
2e400 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20  the first trunk 
2e410 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
2e420 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20  ..  ** Possibly 
2e430 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65  because the free
2e440 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20  -list is empty, 
2e450 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61  or possibly beca
2e460 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69  use the .  ** fi
2e470 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
2e480 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
2e490 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ll. Either way, 
2e4a0 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
2e4b0 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  reed.  ** will b
2e4c0 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69  ecome the new fi
2e4d0 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
2e4e0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
2e4f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
2e500 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  e==0 && SQLITE_O
2e510 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65  K!=(rc = btreeGe
2e520 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
2e530 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b  , &pPage, 0)) ){
2e540 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
2e550 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63  ge_out;.  }.  rc
2e560 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2e570 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2e580 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
2e590 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e5a0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2e5b0 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79  ut;.  }.  put4by
2e5c0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
2e5d0 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34   iTrunk);.  put4
2e5e0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2e5f0 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74  ta[4], 0);.  put
2e600 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2e610 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29  Data[32], iPage)
2e620 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45  ;.  TRACE(("FREE
2e630 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72  -PAGE: %d new tr
2e640 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69  unk page replaci
2e650 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  ng %d\n", pPage-
2e660 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b  >pgno, iTrunk));
2e670 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a  ..freepage_out:.
2e680 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
2e690 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
2e6a0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65   = 0;.  }.  rele
2e6b0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2e6c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2e6d0 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  runk);.  return 
2e6e0 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  rc;.}.static voi
2e6f0 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61  d freePage(MemPa
2e700 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a  ge *pPage, int *
2e710 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52  pRC){.  if( (*pR
2e720 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  C)==SQLITE_OK ){
2e730 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65  .    *pRC = free
2e740 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74  Page2(pPage->pBt
2e750 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  , pPage, pPage->
2e760 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pgno);.  }.}../*
2e770 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65  .** Free any ove
2e780 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
2e790 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
2e7a0 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57 72 69  given Cell.  Wri
2e7b0 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20  te the.** local 
2e7c0 43 65 6c 6c 20 73 69 7a 65 20 28 74 68 65 20 6e  Cell size (the n
2e7d0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2e7e0 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  n the original p
2e7f0 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a  age, omitting.**
2e800 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74 6f 20   overflow) into 
2e810 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  *pnSize..*/.stat
2e820 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c  ic int clearCell
2e830 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
2e840 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
2e850 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
2e860 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c 6c 20  ntains the Cell 
2e870 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
2e880 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a  ar *pCell,    /*
2e890 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
2e8a0 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 31 36  he Cell */.  u16
2e8b0 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
2e8c0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
2e8d0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 43  he size of the C
2e8e0 65 6c 6c 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ell here */.){. 
2e8f0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2e900 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43   pPage->pBt;.  C
2e910 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
2e920 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
2e930 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
2e940 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c  Ovfl;.  u32 ovfl
2e950 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  PageSize;..  ass
2e960 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2e970 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2e980 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2e990 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
2e9a0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
2e9b0 26 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53 69 7a  &info);.  *pnSiz
2e9c0 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  e = info.nSize;.
2e9d0 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
2e9e0 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72  flow==0 ){.    r
2e9f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ea00 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
2ea10 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
2ea20 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
2ea30 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  thing */.  }.  i
2ea40 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f  f( pCell+info.iO
2ea50 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67  verflow+3 > pPag
2ea60 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
2ea70 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20  maskPage ){.    
2ea80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2ea90 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20  RRUPT_BKPT;  /* 
2eaa0 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73  Cell extends pas
2eab0 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f  t end of page */
2eac0 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20  .  }.  ovflPgno 
2ead0 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
2eae0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
2eaf0 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  ]);.  assert( pB
2eb00 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20  t->usableSize > 
2eb10 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53  4 );.  ovflPageS
2eb20 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
2eb30 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76  eSize - 4;.  nOv
2eb40 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c  fl = (info.nPayl
2eb50 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  oad - info.nLoca
2eb60 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  l + ovflPageSize
2eb70 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69   - 1)/ovflPageSi
2eb80 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76  ze;.  assert( ov
2eb90 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76  flPgno==0 || nOv
2eba0 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  fl>0 );.  while(
2ebb0 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20   nOvfl-- ){.    
2ebc0 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a  Pgno iNext = 0;.
2ebd0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
2ebe0 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  fl = 0;.    if( 
2ebf0 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76  ovflPgno<2 || ov
2ec00 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  flPgno>btreePage
2ec10 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
2ec20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20      /* 0 is not 
2ec30 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  a legal page num
2ec40 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63  ber and page 1 c
2ec50 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20  annot be an .   
2ec60 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
2ec70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69  age. Therefore i
2ec80 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20  f ovflPgno<2 or 
2ec90 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
2eca0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  the .      ** fi
2ecb0 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  le the database 
2ecc0 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
2ecd0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
2ece0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2ecf0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2ed00 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20  if( nOvfl ){.   
2ed10 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
2ed20 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66  lowPage(pBt, ovf
2ed30 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26  lPgno, &pOvfl, &
2ed40 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66  iNext);.      if
2ed50 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2ed60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2ed70 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f   ( pOvfl || ((pO
2ed80 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c  vfl = btreePageL
2ed90 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50  ookup(pBt, ovflP
2eda0 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20  gno))!=0) ).    
2edb0 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
2edc0 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76  PageRefcount(pOv
2edd0 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a  fl->pDbPage)!=1.
2ede0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
2edf0 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73  There is no reas
2ee00 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68  on any cursor sh
2ee10 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74  ould have an out
2ee20 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
2ee30 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ce .      ** to 
2ee40 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2ee50 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20   belonging to a 
2ee60 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69  cell that is bei
2ee70 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74  ng deleted/updat
2ee80 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20  ed..      ** So 
2ee90 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
2eea0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65  more than one re
2eeb0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20  ference to this 
2eec0 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20  page, then it . 
2eed0 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74       ** must not
2eee0 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76   really be an ov
2eef0 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20  erflow page and 
2ef00 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
2ef10 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20  t be corrupt. . 
2ef20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65       ** It is he
2ef30 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20  lpful to detect 
2ef40 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c  this before call
2ef50 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c  ing freePage2(),
2ef60 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72   as .      ** fr
2ef70 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65  eePage2() may ze
2ef80 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  ro the page cont
2ef90 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64  ents if secure-d
2efa0 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20  elete mode is.  
2efb0 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20      ** enabled. 
2efc0 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f  If this 'overflo
2efd0 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  w' page happens 
2efe0 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61  to be a page tha
2eff0 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  t the.      ** c
2f000 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69  aller is iterati
2f010 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73  ng through or us
2f020 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  ing in some othe
2f030 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20  r way, this.    
2f040 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62    ** can be prob
2f050 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a  lematic..      *
2f060 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
2f070 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2f080 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f090 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
2f0a0 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76  2(pBt, pOvfl, ov
2f0b0 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a  flPgno);.    }..
2f0c0 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b      if( pOvfl ){
2f0d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
2f0e0 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e  gerUnref(pOvfl->
2f0f0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
2f100 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2f110 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c  urn rc;.    ovfl
2f120 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20  Pgno = iNext;.  
2f130 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2f140 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
2f150 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73  reate the byte s
2f160 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20  equence used to 
2f170 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c  represent a cell
2f180 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a   on page pPage.*
2f190 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  * and write that
2f1a0 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69   byte sequence i
2f1b0 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76  nto pCell[].  Ov
2f1c0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
2f1d0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  .** allocated an
2f1e0 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e  d filled in as n
2f1f0 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63  ecessary.  The c
2f200 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
2f210 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
2f220 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
2f230 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  re sufficient sp
2f240 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  ace has been all
2f250 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43  ocated.** for pC
2f260 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ell[]..**.** Not
2f270 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65  e that pCell doe
2f280 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
2f290 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  need to point to
2f2a0 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
2f2b0 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c  a.** area.  pCel
2f2c0 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  l might point to
2f2d0 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20   some temporary 
2f2e0 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65  storage.  The ce
2f2f0 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f  ll will.** be co
2f300 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69  nstructed in thi
2f310 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61  s temporary area
2f320 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74   then copied int
2f330 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  o pPage->aData.*
2f340 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  * later..*/.stat
2f350 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c  ic int fillInCel
2f360 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
2f370 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
2f380 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
2f390 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
2f3a0 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e cell */.  unsi
2f3b0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
2f3c0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
2f3d0 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
2f3e0 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e  he cell */.  con
2f3f0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  st void *pKey, i
2f400 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54  64 nKey,    /* T
2f410 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73  he key */.  cons
2f420 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e  t void *pData,in
2f430 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68  t nData,   /* Th
2f440 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
2f450 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20  nZero,          
2f460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2f470 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74  tra zero bytes t
2f480 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74  o append to pDat
2f490 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69  a */.  int *pnSi
2f4a0 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
2f4b0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
2f4c0 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f  ell size here */
2f4d0 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f  .){.  int nPaylo
2f4e0 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ad;.  const u8 *
2f4f0 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63  pSrc;.  int nSrc
2f500 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73  , n, rc;.  int s
2f510 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50  paceLeft;.  MemP
2f520 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
2f530 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65    MemPage *pToRe
2f540 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73  lease = 0;.  uns
2f550 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69  igned char *pPri
2f560 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  or;.  unsigned c
2f570 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20  har *pPayload;. 
2f580 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2f590 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
2f5a0 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30  gno pgnoOvfl = 0
2f5b0 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b  ;.  int nHeader;
2f5c0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2f5d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2f5e0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2f5f0 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  ) );..  /* pPage
2f600 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
2f610 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69  ily writeable si
2f620 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  nce pCell might 
2f630 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  be auxiliary.  *
2f640 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74  * buffer space t
2f650 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20  hat is separate 
2f660 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62  from the pPage b
2f670 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  uffer area */.  
2f680 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50  assert( pCell<pP
2f690 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43  age->aData || pC
2f6a0 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ell>=&pPage->aDa
2f6b0 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
2f6c0 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
2f6d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2f6e0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2f6f0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
2f700 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65  * Fill in the he
2f710 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64  ader. */.  nHead
2f720 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c  er = pPage->chil
2f730 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79  dPtrSize;.  nPay
2f740 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e  load = nData + n
2f750 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67  Zero;.  if( pPag
2f760 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b  e->intKeyLeaf ){
2f770 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
2f780 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  putVarint32(&pCe
2f790 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61  ll[nHeader], nPa
2f7a0 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  yload);.  }else{
2f7b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 61  .    assert( nDa
2f7c0 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ta==0 );.    ass
2f7d0 65 72 74 28 20 6e 5a 65 72 6f 3d 3d 30 20 29 3b  ert( nZero==0 );
2f7e0 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b  .  }.  nHeader +
2f7f0 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
2f800 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75  ll[nHeader], *(u
2f810 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 0a 20  64*)&nKey);.  . 
2f820 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
2f830 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 2a 2f 0a  payload size */.
2f840 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
2f850 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20  Key ){.    pSrc 
2f860 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72  = pData;.    nSr
2f870 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e  c = nData;.    n
2f880 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Data = 0;.  }els
2f890 65 7b 20 0a 20 20 20 20 69 66 28 20 4e 45 56 45  e{ .    if( NEVE
2f8a0 52 28 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66  R(nKey>0x7ffffff
2f8b0 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20 29 7b  f || pKey==0) ){
2f8c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2f8d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2f8e0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  T;.    }.    nPa
2f8f0 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 6e 4b 65  yload = (int)nKe
2f900 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b  y;.    pSrc = pK
2f910 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28  ey;.    nSrc = (
2f920 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  int)nKey;.  }.  
2f930 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  if( nPayload<=pP
2f940 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
2f950 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72  .    n = nHeader
2f960 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   + nPayload;.   
2f970 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20   testcase( n==3 
2f980 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
2f990 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28   n==4 );.    if(
2f9a0 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20   n<4 ) n = 4;.  
2f9b0 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20    *pnSize = n;. 
2f9c0 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e     spaceLeft = n
2f9d0 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50 72  Payload;.    pPr
2f9e0 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d  ior = pCell;.  }
2f9f0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6e  else{.    int mn
2fa00 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
2fa10 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20 2b  al;.    n = mn +
2fa20 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29   (nPayload - mn)
2fa30 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
2fa40 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
2fa50 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
2fa60 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
2fa70 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
2fa80 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  e( n==pPage->max
2fa90 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
2faa0 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61  f( n > pPage->ma
2fab0 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b  xLocal ) n = mn;
2fac0 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d  .    spaceLeft =
2fad0 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20   n;.    *pnSize 
2fae0 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20  = n + nHeader + 
2faf0 34 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  4;.    pPrior = 
2fb00 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e  &pCell[nHeader+n
2fb10 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f 61  ];.  }.  pPayloa
2fb20 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
2fb30 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  er];..  /* At th
2fb40 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c  is point variabl
2fb50 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74  es should be set
2fb60 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
2fb70 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61  *.  **   nPayloa
2fb80 64 20 20 20 20 20 20 20 20 20 20 20 54 6f 74 61  d           Tota
2fb90 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69  l payload size i
2fba0 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70  n bytes.  **   p
2fbb0 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20  Payload         
2fbc0 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20    Begin writing 
2fbd0 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a  payload here.  *
2fbe0 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20 20 20  *   spaceLeft   
2fbf0 20 20 20 20 20 20 20 53 70 61 63 65 20 61 76 61         Space ava
2fc00 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f  ilable at pPaylo
2fc10 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64  ad.  If nPayload
2fc20 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a  >spaceLeft,.  **
2fc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc40 20 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73        that means
2fc50 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70   content must sp
2fc60 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f  ill into overflo
2fc70 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20  w pages..  **   
2fc80 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
2fc90 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c     Size of the l
2fca0 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63  ocal cell (not c
2fcb0 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77  ounting overflow
2fcc0 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70   pages).  **   p
2fcd0 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20  Prior           
2fce0 20 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65    Where to write
2fcf0 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65   the pgno of the
2fd00 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
2fd10 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55  page.  **.  ** U
2fd20 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72  se a call to btr
2fd30 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
2fd40 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
2fd50 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65  the values above
2fd60 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75  .  ** were compu
2fd70 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ted correctly.. 
2fd80 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44   */.#if SQLITE_D
2fd90 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c  EBUG.  {.    Cel
2fda0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
2fdb0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
2fdc0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
2fdd0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
2fde0 72 74 28 20 6e 48 65 61 64 65 72 3d 28 69 6e 74  rt( nHeader=(int
2fdf0 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20  )(info.pPayload 
2fe00 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20  - pCell) );.    
2fe10 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
2fe20 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61  y==nKey );.    a
2fe30 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d  ssert( *pnSize =
2fe40 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a  = info.nSize );.
2fe50 20 20 20 20 61 73 73 65 72 74 28 20 73 70 61 63      assert( spac
2fe60 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c  eLeft == info.nL
2fe70 6f 63 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65  ocal );.    asse
2fe80 72 74 28 20 70 50 72 69 6f 72 20 3d 3d 20 26 70  rt( pPrior == &p
2fe90 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
2fea0 6c 6f 77 5d 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  low] );.  }.#end
2feb0 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  if..  /* Write t
2fec0 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20  he payload into 
2fed0 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61  the local Cell a
2fee0 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e 74  nd any extra int
2fef0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
2ff00 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50 61   */.  while( nPa
2ff10 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69  yload>0 ){.    i
2ff20 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20  f( spaceLeft==0 
2ff30 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
2ff40 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2ff50 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  M.      Pgno pgn
2ff60 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76  oPtrmap = pgnoOv
2ff70 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  fl; /* Overflow 
2ff80 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70  page pointer-map
2ff90 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20   entry page */. 
2ffa0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
2ffb0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
2ffc0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
2ffd0 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20    pgnoOvfl++;.  
2ffe0 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a        } while( .
2fff0 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50            PTRMAP
30000 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e  _ISPAGE(pBt, pgn
30010 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76  oOvfl) || pgnoOv
30020 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  fl==PENDING_BYTE
30030 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20  _PAGE(pBt) .    
30040 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23      );.      }.#
30050 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
30060 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
30070 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20  ge(pBt, &pOvfl, 
30080 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f  &pgnoOvfl, pgnoO
30090 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  vfl, 0);.#ifndef
300a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
300b0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
300c0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
300d0 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
300e0 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73  acuum, and the s
300f0 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75  econd or subsequ
30100 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ent.      ** ove
30110 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65  rflow page is be
30120 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  ing allocated, a
30130 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
30140 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
30150 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74       ** for that
30160 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20   page now. .    
30170 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
30180 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
30190 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
301a0 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70  , then write a p
301b0 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20  artial entry .  
301c0 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f      ** to the po
301d0 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65  inter-map. If we
301e0 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74   write nothing t
301f0 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d  o this pointer-m
30200 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a  ap slot,.      *
30210 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d  * then the optim
30220 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63  istic overflow c
30230 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  hain processing 
30240 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20  in clearCell(). 
30250 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69       ** may misi
30260 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69  nterpret the uni
30270 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  nitialized value
30280 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  s and delete the
30290 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20  .      ** wrong 
302a0 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64  pages from the d
302b0 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
302c0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
302d0 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72  >autoVacuum && r
302e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
302f0 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
30300 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50   = (pgnoPtrmap?P
30310 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
30320 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
30330 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
30340 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
30350 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
30360 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20  trmap, &rc);.   
30370 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
30380 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
30390 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
303a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
303b0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
303c0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
303d0 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
303e0 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  ease);.        r
303f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
30400 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
30410 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
30420 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f   zero than pPrio
30430 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  r points into th
30440 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
30450 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
30460 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
30470 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
30480 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
30490 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
304a0 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
304b0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
304c0 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
304d0 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
304e0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72  .      /* If pPr
304f0 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 74  ior is part of t
30500 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
30510 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
30520 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
30530 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
30540 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  iteable */.     
30550 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c   assert( pPrior<
30560 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
30570 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e  pPrior>=&pPage->
30580 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
30590 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
305a0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
305b0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
305c0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
305d0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
305e0 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29  Prior, pgnoOvfl)
305f0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
30600 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
30610 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73  .      pToReleas
30620 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20  e = pOvfl;.     
30630 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d   pPrior = pOvfl-
30640 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75  >aData;.      pu
30650 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30  t4byte(pPrior, 0
30660 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61  );.      pPayloa
30670 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74  d = &pOvfl->aDat
30680 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63  a[4];.      spac
30690 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61  eLeft = pBt->usa
306a0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
306b0 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c   }.    n = nPayl
306c0 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73  oad;.    if( n>s
306d0 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73  paceLeft ) n = s
306e0 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f  paceLeft;..    /
306f0 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
30700 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
30710 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73   pPayload points
30720 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
30730 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54  rea.    ** of pT
30740 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
30750 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
30760 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
30770 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
30780 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
30790 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
307a0 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
307b0 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
307c0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   );..    /* If p
307d0 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20  Payload is part 
307e0 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
307f0 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
30800 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
30810 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
30820 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
30830 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61   assert( pPayloa
30840 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  d<pPage->aData |
30850 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61  | pPayload>=&pPa
30860 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
30870 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
30880 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
30890 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
308a0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
308b0 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63  );..    if( nSrc
308c0 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
308d0 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72  n>nSrc ) n = nSr
308e0 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  c;.      assert(
308f0 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d   pSrc );.      m
30900 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
30910 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  pSrc, n);.    }e
30920 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
30930 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e  t(pPayload, 0, n
30940 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  );.    }.    nPa
30950 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20  yload -= n;.    
30960 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20  pPayload += n;. 
30970 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20     pSrc += n;.  
30980 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20    nSrc -= n;.   
30990 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b   spaceLeft -= n;
309a0 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30  .    if( nSrc==0
309b0 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d   ){.      nSrc =
309c0 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53   nData;.      pS
309d0 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
309e0 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  }.  }.  releaseP
309f0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
30a00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
30a10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
30a20 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65  move the i-th ce
30a30 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20  ll from pPage.  
30a40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66  This routine eff
30a50 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e  ects pPage only.
30a60 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e  .** The cell con
30a70 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65  tent is not free
30a80 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64  d or deallocated
30a90 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  .  It is assumed
30aa0 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c   that.** the cel
30ab0 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
30ac0 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c  en copied somepl
30ad0 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20  ace else.  This 
30ae0 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20  routine just.** 
30af0 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65  removes the refe
30b00 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c  rence to the cel
30b10 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a  l from pPage..**
30b20 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65  .** "sz" must be
30b30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
30b40 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  ytes in the cell
30b50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
30b60 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67   dropCell(MemPag
30b70 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64  e *pPage, int id
30b80 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a  x, int sz, int *
30b90 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20  pRC){.  u32 pc; 
30ba0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
30bb0 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
30bc0 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20  t of cell being 
30bd0 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20  deleted */.  u8 
30be0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
30bf0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
30c00 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
30c10 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76    /* Used to mov
30c20 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77  e bytes around w
30c30 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ithin data[] */.
30c40 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
30c50 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
30c60 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64  code */.  int hd
30c70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67  r;        /* Beg
30c80 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65  inning of the he
30c90 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61  ader.  0 most pa
30ca0 67 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31  ges.  100 page 1
30cb0 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
30cc0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
30cd0 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
30ce0 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
30cf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  );.  assert( sz=
30d00 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  =cellSize(pPage,
30d10 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72   idx) );.  asser
30d20 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
30d30 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
30d40 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
30d50 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
30d60 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
30d70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
30d80 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
30d90 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20  >aData;.  ptr = 
30da0 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78  &pPage->aCellIdx
30db0 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20  [2*idx];.  pc = 
30dc0 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20  get2byte(ptr);. 
30dd0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
30de0 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63  rOffset;.  testc
30df0 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74  ase( pc==get2byt
30e00 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
30e10 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
30e20 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz==pPage->pBt
30e30 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
30e40 20 20 69 66 28 20 70 63 20 3c 20 28 75 33 32 29    if( pc < (u32)
30e50 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
30e60 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20  dr+5]) || pc+sz 
30e70 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  > pPage->pBt->us
30e80 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
30e90 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
30ea0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
30eb0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63  return;.  }.  rc
30ec0 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61   = freeSpace(pPa
30ed0 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69  ge, pc, sz);.  i
30ee0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52  f( rc ){.    *pR
30ef0 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
30f00 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  rn;.  }.  pPage-
30f10 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 6d 65 6d 6d  >nCell--;.  memm
30f20 6f 76 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20  ove(ptr, ptr+2, 
30f30 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  2*(pPage->nCell 
30f40 2d 20 69 64 78 29 29 3b 0a 20 20 70 75 74 32 62  - idx));.  put2b
30f50 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
30f60 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
30f70 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
30f80 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  += 2;.}../*.** I
30f90 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
30fa0 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c   on pPage at cel
30fb0 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43  l index "i".  pC
30fc0 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ell points to th
30fd0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
30fe0 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  the cell..**.** 
30ff0 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
31000 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ent will fit on 
31010 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70  the page, then p
31020 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66  ut it there.  If
31030 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20   it.** will not 
31040 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61  fit, then make a
31050 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c   copy of the cel
31060 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70  l content into p
31070 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70  Temp if.** pTemp
31080 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52   is not null.  R
31090 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65  egardless of pTe
310a0 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  mp, allocate a n
310b0 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70  ew entry.** in p
310c0 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61  Page->apOvfl[] a
310d0 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74  nd make it point
310e0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
310f0 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20  tent (either.** 
31100 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20  in pTemp or the 
31110 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20  original pCell) 
31120 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20  and also record 
31130 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41  its index. .** A
31140 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
31150 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e  entry in pPage->
31160 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20  aCell[] implies 
31170 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e  that .** pPage->
31180 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63  nOverflow is inc
31190 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61  remented..*/.sta
311a0 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43  tic void insertC
311b0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
311c0 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
311d0 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
311e0 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
311f0 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
31200 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
31210 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
31220 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
31230 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
31240 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
31250 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
31260 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
31270 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
31280 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
31290 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
312a0 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
312b0 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
312c0 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
312d0 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e   needed */.  Pgn
312e0 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f  o iChild,      /
312f0 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72  * If non-zero, r
31300 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62  eplace first 4 b
31310 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76  ytes with this v
31320 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
31330 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  RC          /* R
31340 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65  ead and write re
31350 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68  turn code from h
31360 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
31370 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  idx = 0;      /*
31380 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
31390 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
313a0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
313b0 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
313c0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
313d0 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20  r */.  int end; 
313e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
313f0 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
31400 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  last cell pointe
31410 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
31420 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20   int ins;       
31430 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64     /* Index in d
31440 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20  ata[] where new 
31450 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20  cell pointer is 
31460 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
31470 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
31480 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69  /* Address of fi
31490 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
314a0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
314b0 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
314c0 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74    /* The content
314d0 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61   of the whole pa
314e0 67 65 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52  ge */..  if( *pR
314f0 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
31500 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
31510 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
31520 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
31530 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f  );.  assert( MX_
31540 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
31550 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73  <=10921 );.  ass
31560 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
31570 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
31580 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50  ->pBt) || CORRUP
31590 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
315a0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
315b0 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50  ow<=ArraySize(pP
315c0 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a  age->apOvfl) );.
315d0 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53    assert( ArrayS
315e0 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
315f0 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50  l)==ArraySize(pP
31600 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a  age->aiOvfl) );.
31610 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
31620 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
31630 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
31640 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c  );.  /* The cell
31650 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
31660 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63   be sized correc
31670 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77  tly.  However, w
31680 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a  hen moving a.  *
31690 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c  * malformed cell
316a0 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67   from a leaf pag
316b0 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72  e to an interior
316c0 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65   page, if the ce
316d0 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e  ll size.  ** wan
316e0 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  ted to be less t
316f0 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f  han 4 but got ro
31700 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e  unded up to 4 on
31710 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20   the leaf, then 
31720 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20  size.  ** might 
31730 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28  be less than 8 (
31740 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e  leaf-size + poin
31750 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65  ter) on the inte
31760 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63  rior node.  Henc
31770 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20  e.  ** the term 
31780 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20  after the || in 
31790 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
317a0 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73  sert(). */.  ass
317b0 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
317c0 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
317d0 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20  l) || (sz==8 && 
317e0 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69  iChild>0) );.  i
317f0 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
31800 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67  low || sz+2>pPag
31810 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
31820 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20  if( pTemp ){.   
31830 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c     memcpy(pTemp,
31840 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20   pCell, sz);.   
31850 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
31860 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31870 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20  iChild ){.      
31880 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
31890 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
318a0 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f     j = pPage->nO
318b0 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61  verflow++;.    a
318c0 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73  ssert( j<(int)(s
318d0 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f  izeof(pPage->apO
318e0 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67  vfl)/sizeof(pPag
318f0 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29  e->apOvfl[0])) )
31900 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f  ;.    pPage->apO
31910 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a  vfl[j] = pCell;.
31920 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66      pPage->aiOvf
31930 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 20  l[j] = (u16)i;. 
31940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
31950 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31960 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
31970 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
31980 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31990 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63  .      *pRC = rc
319a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
319b0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
319c0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
319d0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
319e0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
319f0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
31a00 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66  Data;.    cellOf
31a10 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
31a20 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e  llOffset;.    en
31a30 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  d = cellOffset +
31a40 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
31a50 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f  .    ins = cellO
31a60 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20  ffset + 2*i;.   
31a70 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70   rc = allocateSp
31a80 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26  ace(pPage, sz, &
31a90 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  idx);.    if( rc
31aa0 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72   ){ *pRC = rc; r
31ab0 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20  eturn; }.    /* 
31ac0 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  The allocateSpac
31ad0 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72  e() routine guar
31ae0 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f  antees the follo
31af0 77 69 6e 67 20 74 77 6f 20 70 72 6f 70 65 72 74  wing two propert
31b00 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74  ies.    ** if it
31b10 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
31b20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
31b30 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a  idx >= end+2 );.
31b40 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b      assert( idx+
31b50 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  sz <= (int)pPage
31b60 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
31b70 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e );.    pPage->
31b80 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61  nCell++;.    pPa
31b90 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31  ge->nFree -= (u1
31ba0 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20  6)(2 + sz);.    
31bb0 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78  memcpy(&data[idx
31bc0 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20  ], pCell, sz);. 
31bd0 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
31be0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
31bf0 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69  &data[idx], iChi
31c00 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  ld);.    }.    m
31c10 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69 6e 73  emmove(&data[ins
31c20 2b 32 5d 2c 20 26 64 61 74 61 5b 69 6e 73 5d 2c  +2], &data[ins],
31c30 20 65 6e 64 2d 69 6e 73 29 3b 0a 20 20 20 20 70   end-ins);.    p
31c40 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e  ut2byte(&data[in
31c50 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75  s], idx);.    pu
31c60 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
31c70 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
31c80 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
31c90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31ca0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
31cb0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
31cc0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
31cd0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
31ce0 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
31cf0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
31d00 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
31d10 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
31d20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
31d30 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
31d40 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
31d50 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
31d60 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70   */.      ptrmap
31d70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
31d80 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20  , pCell, pRC);. 
31d90 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
31da0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61  }../*.** Array a
31db0 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73  pCell[] contains
31dc0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43 65   pointers to nCe
31dd0 6c 6c 20 62 2d 74 72 65 65 20 70 61 67 65 20 63  ll b-tree page c
31de0 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a  ells. The .** sz
31df0 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e  Cell[] array con
31e00 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69  tains the size i
31e10 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20  n bytes of each 
31e20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  cell. This funct
31e30 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20  ion.** replaces 
31e40 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
31e50 65 6e 74 73 20 6f 66 20 70 61 67 65 20 70 50 67  ents of page pPg
31e60 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e   with the conten
31e70 74 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a  ts of the cell.*
31e80 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53  * array..**.** S
31e90 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  ome of the cells
31ea0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79   in apCell[] may
31eb0 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74   currently be st
31ec0 6f 72 65 64 20 69 6e 20 70 50 67 2e 20 54 68 69  ored in pPg. Thi
31ed0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f  s.** function wo
31ee0 72 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c  rks around probl
31ef0 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 74 68  ems caused by th
31f00 69 73 20 62 79 20 6d 61 6b 69 6e 67 20 61 20 63  is by making a c
31f10 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73  opy of any .** s
31f20 75 63 68 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  uch cells before
31f30 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
31f40 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a   page data..**.*
31f50 2a 20 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46  * The MemPage.nF
31f60 72 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76  ree field is inv
31f70 61 6c 69 64 61 74 65 64 20 62 79 20 74 68 69 73  alidated by this
31f80 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73   function. It is
31f90 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
31fa0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
31fb0 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20  aller to set it 
31fc0 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74  correctly..*/.st
31fd0 61 74 69 63 20 76 6f 69 64 20 72 65 62 75 69 6c  atic void rebuil
31fe0 64 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  dPage(.  MemPage
31ff0 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20   *pPg,          
32000 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74           /* Edit
32010 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
32020 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
32030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32040 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20  /* Final number 
32050 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65  of cells on page
32060 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
32070 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
32080 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
32090 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36  f cells */.  u16
320a0 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20   *szCell        
320b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
320c0 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69  Array of cell si
320d0 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  zes */.){.  cons
320e0 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
320f0 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20  >hdrOffset;     
32100 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
32110 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 67 20  f header on pPg 
32120 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
32130 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61  aData = pPg->aDa
32140 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ta;           /*
32150 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   Pointer to data
32160 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f   for pPg */.  co
32170 6e 73 74 20 69 6e 74 20 75 73 61 62 6c 65 53 69  nst int usableSi
32180 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75  ze = pPg->pBt->u
32190 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20  sableSize;.  u8 
321a0 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26  * const pEnd = &
321b0 61 44 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65  aData[usableSize
321c0 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38  ];.  int i;.  u8
321d0 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67   *pCellptr = pPg
321e0 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38  ->aCellIdx;.  u8
321f0 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33   *pTmp = sqlite3
32200 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
32210 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  Pg->pBt->pPager)
32220 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a  ;.  u8 *pData;..
32230 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26    i = get2byte(&
32240 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  aData[hdr+5]);. 
32250 20 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d   memcpy(&pTmp[i]
32260 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20 75 73 61  , &aData[i], usa
32270 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20  bleSize - i);.. 
32280 20 70 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20   pData = pEnd;. 
32290 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
322a0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
322b0 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b  *pCell = apCell[
322c0 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 65 6c  i];.    if( pCel
322d0 6c 3e 61 44 61 74 61 20 26 26 20 70 43 65 6c 6c  l>aData && pCell
322e0 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 70  <pEnd ){.      p
322f0 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65  Cell = &pTmp[pCe
32300 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20  ll - aData];.   
32310 20 7d 0a 20 20 20 20 70 44 61 74 61 20 2d 3d 20   }.    pData -= 
32320 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 6d  szCell[i];.    m
32330 65 6d 63 70 79 28 70 44 61 74 61 2c 20 70 43 65  emcpy(pData, pCe
32340 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29 3b 0a  ll, szCell[i]);.
32350 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65      put2byte(pCe
32360 6c 6c 70 74 72 2c 20 28 70 44 61 74 61 20 2d 20  llptr, (pData - 
32370 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65  aData));.    pCe
32380 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20  llptr += 2;.    
32390 61 73 73 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69  assert( szCell[i
323a0 5d 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  ]==cellSizePtr(p
323b0 50 67 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20  Pg, pCell) );.  
323c0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70 50 67 2d  }..  /* The pPg-
323d0 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20  >nFree field is 
323e0 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72 72 65 63  now set incorrec
323f0 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  tly. The caller 
32400 77 69 6c 6c 20 66 69 78 20 69 74 2e 20 2a 2f 0a  will fix it. */.
32410 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e    pPg->nCell = n
32420 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76  Cell;.  pPg->nOv
32430 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 70  erflow = 0;..  p
32440 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  ut2byte(&aData[h
32450 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20 70 75 74  dr+1], 0);.  put
32460 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72  2byte(&aData[hdr
32470 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29  +3], pPg->nCell)
32480 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44  ;.  put2byte(&aD
32490 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74  ata[hdr+5], pDat
324a0 61 20 2d 20 61 44 61 74 61 29 3b 0a 20 20 61 44  a - aData);.  aD
324b0 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 78 30  ata[hdr+7] = 0x0
324c0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61  0;.}../*.** Arra
324d0 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61  y apCell[] conta
324e0 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65  ins nCell pointe
324f0 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c  rs to b-tree cel
32500 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c  ls. Array szCell
32510 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  .** contains the
32520 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
32530 66 20 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c  f each such cell
32540 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
32550 61 74 74 65 6d 70 74 73 20 74 6f 20 0a 2a 2a 20  attempts to .** 
32560 61 64 64 20 74 68 65 20 63 65 6c 6c 73 20 73 74  add the cells st
32570 6f 72 65 64 20 69 6e 20 74 68 65 20 61 72 72 61  ored in the arra
32580 79 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 49  y to page pPg. I
32590 66 20 69 74 20 63 61 6e 6e 6f 74 20 28 62 65 63  f it cannot (bec
325a0 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
325b0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 64 65  e needs to be de
325c0 66 72 61 67 6d 65 6e 74 65 64 20 62 65 66 6f 72  fragmented befor
325d0 65 20 74 68 65 20 63 65 6c 6c 73 20 77 69 6c 6c  e the cells will
325e0 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a   fit), non-zero.
325f0 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ** is returned. 
32600 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
32610 65 20 63 65 6c 6c 73 20 61 72 65 20 61 64 64 65  e cells are adde
32620 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
32630 7a 65 72 6f 20 69 73 0a 2a 2a 20 72 65 74 75 72  zero is.** retur
32640 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ned..**.** Argum
32650 65 6e 74 20 70 43 65 6c 6c 70 74 72 20 70 6f 69  ent pCellptr poi
32660 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
32670 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 65   entry in the ce
32680 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
32690 0a 2a 2a 20 28 70 61 72 74 20 6f 66 20 70 61 67  .** (part of pag
326a0 65 20 70 50 67 29 20 74 6f 20 70 6f 70 75 6c 61  e pPg) to popula
326b0 74 65 2e 20 41 66 74 65 72 20 63 65 6c 6c 20 61  te. After cell a
326c0 70 43 65 6c 6c 5b 30 5d 20 69 73 20 77 72 69 74  pCell[0] is writ
326d0 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 70 61  ten to the.** pa
326e0 67 65 20 62 6f 64 79 2c 20 61 20 31 36 2d 62 69  ge body, a 16-bi
326f0 74 20 6f 66 66 73 65 74 20 69 73 20 77 72 69 74  t offset is writ
32700 74 65 6e 20 74 6f 20 70 43 65 6c 6c 70 74 72 2e  ten to pCellptr.
32710 20 41 6e 64 20 73 6f 20 6f 6e 2c 20 66 6f 72 20   And so on, for 
32720 65 61 63 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20  each.** cell in 
32730 74 68 65 20 61 72 72 61 79 2e 20 49 74 20 69 73  the array. It is
32740 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
32750 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
32760 72 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74  r to ensure.** t
32770 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20 74  hat it is safe t
32780 6f 20 6f 76 65 72 77 72 69 74 65 20 74 68 69 73  o overwrite this
32790 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c   part of the cel
327a0 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 2e  l-pointer array.
327b0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
327c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
327d0 6c 65 64 2c 20 2a 70 70 44 61 74 61 20 70 6f 69  led, *ppData poi
327e0 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61 72 74  nts to the start
327f0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74   of the .** cont
32800 65 6e 74 20 61 72 65 61 20 6f 6e 20 70 61 67 65  ent area on page
32810 20 70 50 67 2e 20 49 66 20 74 68 65 20 73 69 7a   pPg. If the siz
32820 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  e of the content
32830 20 61 72 65 61 20 69 73 20 65 78 74 65 6e 64 65   area is extende
32840 64 2c 0a 2a 2a 20 2a 70 70 44 61 74 61 20 69 73  d,.** *ppData is
32850 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f 69 6e   updated to poin
32860 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 61  t to the new sta
32870 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  rt of the conten
32880 74 20 61 72 65 61 0a 2a 2a 20 62 65 66 6f 72 65  t area.** before
32890 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
328a0 2a 20 46 69 6e 61 6c 6c 79 2c 20 61 72 67 75 6d  * Finally, argum
328b0 65 6e 74 20 70 42 65 67 69 6e 20 70 6f 69 6e 74  ent pBegin point
328c0 73 20 74 6f 20 74 68 65 20 62 79 74 65 20 69 6d  s to the byte im
328d0 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
328e0 69 6e 67 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f  ing the.** end o
328f0 66 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75  f the space requ
32900 69 72 65 64 20 62 79 20 74 68 69 73 20 70 61 67  ired by this pag
32910 65 20 66 6f 72 20 74 68 65 20 63 65 6c 6c 2d 70  e for the cell-p
32920 6f 69 6e 74 65 72 20 61 72 65 61 20 28 66 6f 72  ointer area (for
32930 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c 73 20 2d 20  .** all cells - 
32940 6e 6f 74 20 6a 75 73 74 20 74 68 6f 73 65 20 69  not just those i
32950 6e 73 65 72 74 65 64 20 62 79 20 74 68 65 20 63  nserted by the c
32960 75 72 72 65 6e 74 20 63 61 6c 6c 29 2e 20 49 66  urrent call). If
32970 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   the content.** 
32980 61 72 65 61 20 6d 75 73 74 20 62 65 20 65 78 74  area must be ext
32990 65 6e 64 65 64 20 74 6f 20 62 65 66 6f 72 65 20  ended to before 
329a0 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72  this point in or
329b0 64 65 72 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74  der to accomodat
329c0 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 69  e all.** cells i
329d0 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20 74 68 65 6e  n apCell[], then
329e0 20 74 68 65 20 63 65 6c 6c 73 20 64 6f 20 6e 6f   the cells do no
329f0 74 20 66 69 74 20 61 6e 64 20 6e 6f 6e 2d 7a 65  t fit and non-ze
32a00 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ro is returned..
32a10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
32a20 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20  geInsertArray(. 
32a30 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20   MemPage *pPg,  
32a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a50 20 2f 2a 20 50 61 67 65 20 74 6f 20 61 64 64 20   /* Page to add 
32a60 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a 20 20 75 38  cells to */.  u8
32a70 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 20 20   *pBegin,       
32a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32a90 20 45 6e 64 20 6f 66 20 63 65 6c 6c 2d 70 6f 69   End of cell-poi
32aa0 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
32ab0 75 38 20 2a 2a 70 70 44 61 74 61 2c 20 20 20 20  u8 **ppData,    
32ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ad0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 61 67 65 20  /* IN/OUT: Page 
32ae0 63 6f 6e 74 65 6e 74 20 2d 61 72 65 61 20 70 6f  content -area po
32af0 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70  inter */.  u8 *p
32b00 43 65 6c 6c 70 74 72 2c 20 20 20 20 20 20 20 20  Cellptr,        
32b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
32b20 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 2d 70 6f  inter to cell-po
32b30 69 6e 74 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  inter area */.  
32b40 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
32b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
32b70 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 70 50 67  ls to add to pPg
32b80 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
32b90 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
32ba0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
32bb0 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36  f cells */.  u16
32bc0 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20   *szCell        
32bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32be0 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69  Array of cell si
32bf0 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  zes */.){.  int 
32c00 69 3b 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d  i;.  u8 *aData =
32c10 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75   pPg->aData;.  u
32c20 38 20 2a 70 44 61 74 61 20 3d 20 2a 70 70 44 61  8 *pData = *ppDa
32c30 74 61 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  ta;.  const int 
32c40 62 46 72 65 65 6c 69 73 74 20 3d 20 61 44 61 74  bFreelist = aDat
32c50 61 5b 31 5d 20 7c 7c 20 61 44 61 74 61 5b 32 5d  a[1] || aData[2]
32c60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
32c70 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b  >hdrOffset==0 );
32c80 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c      /* Never cal
32c90 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 20 2a 2f  led on page 1 */
32ca0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
32cb0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ell; i++){.    i
32cc0 6e 74 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 69  nt sz = szCell[i
32cd0 5d 3b 0a 20 20 20 20 75 38 20 2a 70 53 6c 6f 74  ];.    u8 *pSlot
32ce0 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 6c  ;.    if( bFreel
32cf0 69 73 74 3d 3d 30 20 7c 7c 20 28 70 53 6c 6f 74  ist==0 || (pSlot
32d00 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28   = pageFindSlot(
32d10 70 50 67 2c 20 73 7a 2c 20 30 29 29 3d 3d 30 20  pPg, sz, 0))==0 
32d20 29 7b 0a 20 20 20 20 20 20 70 44 61 74 61 20 2d  ){.      pData -
32d30 3d 20 73 7a 3b 0a 20 20 20 20 20 20 69 66 28 20  = sz;.      if( 
32d40 70 44 61 74 61 3c 70 42 65 67 69 6e 20 29 20 72  pData<pBegin ) r
32d50 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 70  eturn 1;.      p
32d60 53 6c 6f 74 20 3d 20 70 44 61 74 61 3b 0a 20 20  Slot = pData;.  
32d70 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
32d80 53 6c 6f 74 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c  Slot, apCell[i],
32d90 20 73 7a 29 3b 0a 20 20 20 20 70 75 74 32 62 79   sz);.    put2by
32da0 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 53  te(pCellptr, (pS
32db0 6c 6f 74 20 2d 20 61 44 61 74 61 29 29 3b 0a 20  lot - aData));. 
32dc0 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32     pCellptr += 2
32dd0 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 61 74 61 20  ;.  }.  *ppData 
32de0 3d 20 70 44 61 74 61 3b 0a 20 20 72 65 74 75 72  = pData;.  retur
32df0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  n 0;.}../*.** Ar
32e00 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e  ray apCell[] con
32e10 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e  tains nCell poin
32e20 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63  ters to b-tree c
32e30 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65  ells. Array szCe
32e40 6c 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  ll .** contains 
32e50 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  the size in byte
32e60 73 20 6f 66 20 65 61 63 68 20 73 75 63 68 20 63  s of each such c
32e70 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
32e80 6f 6e 20 61 64 64 73 20 74 68 65 0a 2a 2a 20 73  on adds the.** s
32e90 70 61 63 65 20 61 73 73 6f 63 69 61 74 65 64 20  pace associated 
32ea0 77 69 74 68 20 65 61 63 68 20 63 65 6c 6c 20 69  with each cell i
32eb0 6e 20 74 68 65 20 61 72 72 61 79 20 74 68 61 74  n the array that
32ec0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74   is currently st
32ed0 6f 72 65 64 20 0a 2a 2a 20 77 69 74 68 69 6e 20  ored .** within 
32ee0 74 68 65 20 62 6f 64 79 20 6f 66 20 70 50 67 20  the body of pPg 
32ef0 74 6f 20 74 68 65 20 70 50 67 20 66 72 65 65 2d  to the pPg free-
32f00 6c 69 73 74 2e 20 54 68 65 20 63 65 6c 6c 2d 70  list. The cell-p
32f10 6f 69 6e 74 65 72 73 20 61 6e 64 20 6f 74 68 65  ointers and othe
32f20 72 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20 74  r.** fields of t
32f30 68 65 20 70 61 67 65 20 61 72 65 20 6e 6f 74 20  he page are not 
32f40 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  updated..**.** T
32f50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
32f60 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  urns the total n
32f70 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 61  umber of cells a
32f80 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
32f90 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  -list..*/.static
32fa0 20 69 6e 74 20 70 61 67 65 46 72 65 65 41 72 72   int pageFreeArr
32fb0 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ay(.  MemPage *p
32fc0 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
32fd0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f        /* Page to
32fe0 20 65 64 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e   edit */.  int n
32ff0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
33000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 65             /* Ce
33010 6c 6c 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  lls to delete */
33020 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20  .  u8 **apCell, 
33030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33040 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
33050 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73  ells */.  u16 *s
33060 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20  zCell           
33070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
33080 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73  ay of cell sizes
33090 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63 6f   */.){.  u8 * co
330a0 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d  nst aData = pPg-
330b0 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20 63  >aData;.  u8 * c
330c0 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61  onst pEnd = &aDa
330d0 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61  ta[pPg->pBt->usa
330e0 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20  bleSize];.  int 
330f0 6e 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nRet = 0;.  int 
33100 69 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d  i;.  u8 *pFree =
33110 20 30 3b 0a 20 20 69 6e 74 20 73 7a 46 72 65 65   0;.  int szFree
33120 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30   = 0;..  for(i=0
33130 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
33140 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
33150 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   apCell[i];.    
33160 69 66 28 20 70 43 65 6c 6c 3e 61 44 61 74 61 20  if( pCell>aData 
33170 26 26 20 70 43 65 6c 6c 3c 70 45 6e 64 20 29 7b  && pCell<pEnd ){
33180 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  .      int sz = 
33190 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  szCell[i];.     
331a0 20 69 66 28 20 70 46 72 65 65 21 3d 28 70 43 65   if( pFree!=(pCe
331b0 6c 6c 20 2b 20 73 7a 29 20 29 7b 0a 20 20 20 20  ll + sz) ){.    
331c0 20 20 20 20 69 66 28 20 70 46 72 65 65 20 29 20      if( pFree ) 
331d0 66 72 65 65 53 70 61 63 65 28 70 50 67 2c 20 70  freeSpace(pPg, p
331e0 46 72 65 65 20 2d 20 61 44 61 74 61 2c 20 73 7a  Free - aData, sz
331f0 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Free);.        p
33200 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Free = pCell;.  
33210 20 20 20 20 20 20 73 7a 46 72 65 65 20 3d 20 73        szFree = s
33220 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  z;.      }else{.
33230 20 20 20 20 20 20 20 20 70 46 72 65 65 20 3d 20          pFree = 
33240 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 73  pCell;.        s
33250 7a 46 72 65 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  zFree += sz;.   
33260 20 20 20 7d 0a 20 20 20 20 20 20 6e 52 65 74 2b     }.      nRet+
33270 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
33280 66 28 20 70 46 72 65 65 20 29 20 66 72 65 65 53  f( pFree ) freeS
33290 70 61 63 65 28 70 50 67 2c 20 70 46 72 65 65 20  pace(pPg, pFree 
332a0 2d 20 61 44 61 74 61 2c 20 73 7a 46 72 65 65 29  - aData, szFree)
332b0 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b  ;.  return nRet;
332c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 50  .}../*.** The pP
332d0 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69  g->nFree field i
332e0 73 20 69 6e 76 61 6c 69 64 20 77 68 65 6e 20 74  s invalid when t
332f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
33300 75 72 6e 73 2e 20 49 74 20 69 73 20 74 68 65 0a  urns. It is the.
33310 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
33320 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
33330 74 6f 20 73 65 74 20 69 74 20 63 6f 72 72 65 63  to set it correc
33340 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tly..*/.static v
33350 6f 69 64 20 65 64 69 74 50 61 67 65 28 0a 20 20  oid editPage(.  
33360 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20  MemPage *pPg,   
33370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33380 2f 2a 20 45 64 69 74 20 74 68 69 73 20 70 61 67  /* Edit this pag
33390 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 6c 64 2c  e */.  int iOld,
333a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
333b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
333c0 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 63 75  of first cell cu
333d0 72 72 65 6e 74 6c 79 20 6f 6e 20 70 61 67 65 20  rrently on page 
333e0 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 2c 20 20  */.  int iNew,  
333f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33400 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
33410 20 6e 65 77 20 66 69 72 73 74 20 63 65 6c 6c 20   new first cell 
33420 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  on page */.  int
33430 20 6e 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20   nNew,          
33440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33450 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Final number of 
33460 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f  cells on page */
33470 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20  .  u8 **apCell, 
33480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33490 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
334a0 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73  ells */.  u16 *s
334b0 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20  zCell           
334c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
334d0 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73  ay of cell sizes
334e0 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63 6f   */.){.  u8 * co
334f0 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d  nst aData = pPg-
33500 3e 61 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20  >aData;.  const 
33510 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68  int hdr = pPg->h
33520 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a  drOffset;.  u8 *
33530 70 42 65 67 69 6e 20 3d 20 26 70 50 67 2d 3e 61  pBegin = &pPg->a
33540 43 65 6c 6c 49 64 78 5b 6e 4e 65 77 20 2a 20 32  CellIdx[nNew * 2
33550 5d 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d  ];.  int nCell =
33560 20 70 50 67 2d 3e 6e 43 65 6c 6c 3b 20 20 20 20   pPg->nCell;    
33570 20 20 20 2f 2a 20 43 65 6c 6c 73 20 73 74 6f 72     /* Cells stor
33580 65 64 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20 75  ed on pPg */.  u
33590 38 20 2a 70 44 61 74 61 3b 0a 20 20 75 38 20 2a  8 *pData;.  u8 *
335a0 70 43 65 6c 6c 70 74 72 3b 0a 20 20 69 6e 74 20  pCellptr;.  int 
335b0 69 3b 0a 20 20 69 6e 74 20 69 4f 6c 64 45 6e 64  i;.  int iOldEnd
335c0 20 3d 20 69 4f 6c 64 20 2b 20 70 50 67 2d 3e 6e   = iOld + pPg->n
335d0 43 65 6c 6c 20 2b 20 70 50 67 2d 3e 6e 4f 76 65  Cell + pPg->nOve
335e0 72 66 6c 6f 77 3b 0a 20 20 69 6e 74 20 69 4e 65  rflow;.  int iNe
335f0 77 45 6e 64 20 3d 20 69 4e 65 77 20 2b 20 6e 4e  wEnd = iNew + nN
33600 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ew;..#ifdef SQLI
33610 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 2a 70  TE_DEBUG.  u8 *p
33620 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Tmp = sqlite3Pag
33630 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 67 2d  erTempSpace(pPg-
33640 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
33650 20 6d 65 6d 63 70 79 28 70 54 6d 70 2c 20 61 44   memcpy(pTmp, aD
33660 61 74 61 2c 20 70 50 67 2d 3e 70 42 74 2d 3e 75  ata, pPg->pBt->u
33670 73 61 62 6c 65 53 69 7a 65 29 3b 0a 23 65 6e 64  sableSize);.#end
33680 69 66 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  if..  /* Remove 
33690 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20 73  cells from the s
336a0 74 61 72 74 20 61 6e 64 20 65 6e 64 20 6f 66 20  tart and end of 
336b0 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 66  the page */.  if
336c0 28 20 69 4f 6c 64 3c 69 4e 65 77 20 29 7b 0a 20  ( iOld<iNew ){. 
336d0 20 20 20 69 6e 74 20 6e 53 68 69 66 74 20 3d 20     int nShift = 
336e0 70 61 67 65 46 72 65 65 41 72 72 61 79 28 0a 20  pageFreeArray(. 
336f0 20 20 20 20 20 20 20 70 50 67 2c 20 69 4e 65 77         pPg, iNew
33700 2d 69 4f 6c 64 2c 20 26 61 70 43 65 6c 6c 5b 69  -iOld, &apCell[i
33710 4f 6c 64 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4f  Old], &szCell[iO
33720 6c 64 5d 0a 20 20 20 20 29 3b 0a 20 20 20 20 6d  ld].    );.    m
33730 65 6d 6d 6f 76 65 28 70 50 67 2d 3e 61 43 65 6c  emmove(pPg->aCel
33740 6c 49 64 78 2c 20 26 70 50 67 2d 3e 61 43 65 6c  lIdx, &pPg->aCel
33750 6c 49 64 78 5b 6e 53 68 69 66 74 2a 32 5d 2c 20  lIdx[nShift*2], 
33760 6e 43 65 6c 6c 2a 32 29 3b 0a 20 20 20 20 6e 43  nCell*2);.    nC
33770 65 6c 6c 20 2d 3d 20 6e 53 68 69 66 74 3b 0a 20  ell -= nShift;. 
33780 20 7d 0a 20 20 69 66 28 20 69 4e 65 77 45 6e 64   }.  if( iNewEnd
33790 20 3c 20 69 4f 6c 64 45 6e 64 20 29 7b 0a 20 20   < iOldEnd ){.  
337a0 20 20 6e 43 65 6c 6c 20 2d 3d 20 70 61 67 65 46    nCell -= pageF
337b0 72 65 65 41 72 72 61 79 28 0a 20 20 20 20 20 20  reeArray(.      
337c0 20 20 70 50 67 2c 20 69 4f 6c 64 45 6e 64 2d 69    pPg, iOldEnd-i
337d0 4e 65 77 45 6e 64 2c 20 26 61 70 43 65 6c 6c 5b  NewEnd, &apCell[
337e0 69 4e 65 77 45 6e 64 5d 2c 20 26 73 7a 43 65 6c  iNewEnd], &szCel
337f0 6c 5b 69 4e 65 77 45 6e 64 5d 0a 20 20 20 20 29  l[iNewEnd].    )
33800 3b 0a 20 20 7d 0a 0a 20 20 70 44 61 74 61 20 3d  ;.  }..  pData =
33810 20 26 61 44 61 74 61 5b 67 65 74 32 62 79 74 65   &aData[get2byte
33820 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 5d  (&aData[hdr+5])]
33830 3b 0a 20 20 69 66 28 20 70 44 61 74 61 3c 70 42  ;.  if( pData<pB
33840 65 67 69 6e 20 29 20 67 6f 74 6f 20 65 64 69 74  egin ) goto edit
33850 70 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a  page_fail;..  /*
33860 20 41 64 64 20 63 65 6c 6c 73 20 74 6f 20 74 68   Add cells to th
33870 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70  e start of the p
33880 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 69 4e 65  age */.  if( iNe
33890 77 3c 69 4f 6c 64 20 29 7b 0a 20 20 20 20 69 6e  w<iOld ){.    in
338a0 74 20 6e 41 64 64 20 3d 20 69 4f 6c 64 2d 69 4e  t nAdd = iOld-iN
338b0 65 77 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72  ew;.    pCellptr
338c0 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78   = pPg->aCellIdx
338d0 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70  ;.    memmove(&p
338e0 43 65 6c 6c 70 74 72 5b 6e 41 64 64 2a 32 5d 2c  Cellptr[nAdd*2],
338f0 20 70 43 65 6c 6c 70 74 72 2c 20 6e 43 65 6c 6c   pCellptr, nCell
33900 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 70 61 67  *2);.    if( pag
33910 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20  eInsertArray(.  
33920 20 20 20 20 20 20 20 20 70 50 67 2c 20 70 42 65          pPg, pBe
33930 67 69 6e 2c 20 26 70 44 61 74 61 2c 20 70 43 65  gin, &pData, pCe
33940 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20 20 20 20  llptr,.         
33950 20 6e 41 64 64 2c 20 26 61 70 43 65 6c 6c 5b 69   nAdd, &apCell[i
33960 4e 65 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e  New], &szCell[iN
33970 65 77 5d 0a 20 20 20 20 29 20 29 20 67 6f 74 6f  ew].    ) ) goto
33980 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a   editpage_fail;.
33990 20 20 20 20 6e 43 65 6c 6c 20 2b 3d 20 6e 41 64      nCell += nAd
339a0 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  d;.  }..  /* Add
339b0 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65   any overflow ce
339c0 6c 6c 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  lls */.  for(i=0
339d0 3b 20 69 3c 70 50 67 2d 3e 6e 4f 76 65 72 66 6c  ; i<pPg->nOverfl
339e0 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ow; i++){.    in
339f0 74 20 69 43 65 6c 6c 20 3d 20 28 69 4f 6c 64 20  t iCell = (iOld 
33a00 2b 20 70 50 67 2d 3e 61 69 4f 76 66 6c 5b 69 5d  + pPg->aiOvfl[i]
33a10 29 20 2d 20 69 4e 65 77 3b 0a 20 20 20 20 69 66  ) - iNew;.    if
33a20 28 20 69 43 65 6c 6c 3e 3d 30 20 26 26 20 69 43  ( iCell>=0 && iC
33a30 65 6c 6c 3c 6e 4e 65 77 20 29 7b 0a 20 20 20 20  ell<nNew ){.    
33a40 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 20 3d    u8 *pCellptr =
33a50 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b   &pPg->aCellIdx[
33a60 69 43 65 6c 6c 20 2a 20 32 5d 3b 0a 20 20 20 20  iCell * 2];.    
33a70 20 20 6d 65 6d 6d 6f 76 65 28 26 70 43 65 6c 6c    memmove(&pCell
33a80 70 74 72 5b 32 5d 2c 20 70 43 65 6c 6c 70 74 72  ptr[2], pCellptr
33a90 2c 20 28 6e 43 65 6c 6c 20 2d 20 69 43 65 6c 6c  , (nCell - iCell
33aa0 29 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 6e 43  ) * 2);.      nC
33ab0 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ell++;.      if(
33ac0 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61 79   pageInsertArray
33ad0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
33ae0 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74  g, pBegin, &pDat
33af0 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20  a, pCellptr,.   
33b00 20 20 20 20 20 20 20 20 20 31 2c 20 26 61 70 43           1, &apC
33b10 65 6c 6c 5b 69 43 65 6c 6c 20 2b 20 69 4e 65 77  ell[iCell + iNew
33b20 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 43 65 6c 6c  ], &szCell[iCell
33b30 20 2b 20 69 4e 65 77 5d 0a 20 20 20 20 20 20 29   + iNew].      )
33b40 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65   ) goto editpage
33b50 5f 66 61 69 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _fail;.    }.  }
33b60 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 63 65  ..  /* Append ce
33b70 6c 6c 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  lls to the end o
33b80 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
33b90 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 67 2d  pCellptr = &pPg-
33ba0 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a  >aCellIdx[nCell*
33bb0 32 5d 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e  2];.  if( pageIn
33bc0 73 65 72 74 41 72 72 61 79 28 0a 20 20 20 20 20  sertArray(.     
33bd0 20 20 20 70 50 67 2c 20 70 42 65 67 69 6e 2c 20     pPg, pBegin, 
33be0 26 70 44 61 74 61 2c 20 70 43 65 6c 6c 70 74 72  &pData, pCellptr
33bf0 2c 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 2d 6e  ,.        nNew-n
33c00 43 65 6c 6c 2c 20 26 61 70 43 65 6c 6c 5b 69 4e  Cell, &apCell[iN
33c10 65 77 2b 6e 43 65 6c 6c 5d 2c 20 26 73 7a 43 65  ew+nCell], &szCe
33c20 6c 6c 5b 69 4e 65 77 2b 6e 43 65 6c 6c 5d 0a 20  ll[iNew+nCell]. 
33c30 20 29 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61   ) ) goto editpa
33c40 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 70 50 67 2d  ge_fail;..  pPg-
33c50 3e 6e 43 65 6c 6c 20 3d 20 6e 4e 65 77 3b 0a 20  >nCell = nNew;. 
33c60 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20   pPg->nOverflow 
33c70 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62 79 74 65  = 0;..  put2byte
33c80 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20  (&aData[hdr+3], 
33c90 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  pPg->nCell);.  p
33ca0 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  ut2byte(&aData[h
33cb0 64 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20 61  dr+5], pData - a
33cc0 44 61 74 61 29 3b 0a 0a 23 69 66 64 65 66 20 53  Data);..#ifdef S
33cd0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f  QLITE_DEBUG.  fo
33ce0 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
33cf0 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
33d00 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 2b 69 4e  ll = apCell[i+iN
33d10 65 77 5d 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  ew];.    int iOf
33d20 66 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 50  f = get2byte(&pP
33d30 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 69 2a 32 5d  g->aCellIdx[i*2]
33d40 29 3b 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c  );.    if( pCell
33d50 3e 3d 61 44 61 74 61 20 26 26 20 70 43 65 6c 6c  >=aData && pCell
33d60 3c 26 61 44 61 74 61 5b 70 50 67 2d 3e 70 42 74  <&aData[pPg->pBt
33d70 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b  ->usableSize] ){
33d80 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26  .      pCell = &
33d90 70 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61  pTmp[pCell - aDa
33da0 74 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ta];.    }.    a
33db0 73 73 65 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70  ssert( 0==memcmp
33dc0 28 70 43 65 6c 6c 2c 20 26 61 44 61 74 61 5b 69  (pCell, &aData[i
33dd0 4f 66 66 5d 2c 20 73 7a 43 65 6c 6c 5b 69 2b 69  Off], szCell[i+i
33de0 4e 65 77 5d 29 20 29 3b 0a 20 20 7d 0a 23 65 6e  New]) );.  }.#en
33df0 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 20  dif..  return;. 
33e00 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3a 0a 20  editpage_fail:. 
33e10 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 65 64   /* Unable to ed
33e20 69 74 20 74 68 69 73 20 70 61 67 65 2e 20 52 65  it this page. Re
33e30 62 75 69 6c 64 20 69 74 20 66 72 6f 6d 20 73 63  build it from sc
33e40 72 61 74 63 68 20 69 6e 73 74 65 61 64 2e 20 2a  ratch instead. *
33e50 2f 0a 20 20 72 65 62 75 69 6c 64 50 61 67 65 28  /.  rebuildPage(
33e60 70 50 67 2c 20 6e 4e 65 77 2c 20 26 61 70 43 65  pPg, nNew, &apCe
33e70 6c 6c 5b 69 4e 65 77 5d 2c 20 26 73 7a 43 65 6c  ll[iNew], &szCel
33e80 6c 5b 69 4e 65 77 5d 29 3b 0a 7d 0a 0a 2f 2a 0a  l[iNew]);.}../*.
33e90 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
33ea0 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65   parameters dete
33eb0 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61  rmine how many a
33ec0 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65  djacent pages ge
33ed0 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e  t involved.** in
33ee0 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65   a balancing ope
33ef0 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74  ration.  NN is t
33f00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69  he number of nei
33f10 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
33f20 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20   side.** of the 
33f30 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63  page that partic
33f40 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
33f50 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
33f60 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20  .  NB is the.** 
33f70 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
33f80 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69  pages that parti
33f90 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e  cipate, includin
33fa0 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67  g the target pag
33fb0 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67  e and.** NN neig
33fc0 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
33fd0 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  side..**.** The 
33fe0 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66  minimum value of
33ff0 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75   NN is 1 (of cou
34000 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e  rse).  Increasin
34010 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20  g NN above 1.** 
34020 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65  (to 2 or 3) give
34030 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f  s a modest impro
34040 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54  vement in SELECT
34050 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66   and DELETE perf
34060 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78  ormance.** in ex
34070 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72  change for a lar
34080 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20  ger degradation 
34090 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50  in INSERT and UP
340a0 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  DATE performance
340b0 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  ..** The value o
340c0 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20  f NN appears to 
340d0 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65  give the best re
340e0 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a  sults overall..*
340f0 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20  /.#define NN 1  
34100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
34110 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
34120 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
34130 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65   of pPage */.#de
34140 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29  fine NB (NN*2+1)
34150 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70        /* Total p
34160 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  ages involved in
34170 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a   the balance */.
34180 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
34190 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
341a0 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  CE./*.** This ve
341b0 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65  rsion of balance
341c0 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63  () handles the c
341d0 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61  ommon special ca
341e0 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65  se where.** a ne
341f0 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67  w entry is being
34200 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65   inserted on the
34210 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65   extreme right-e
34220 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65  nd of the.** tre
34230 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  e, in other word
34240 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20  s, when the new 
34250 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d  entry will becom
34260 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a  e the largest.**
34270 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
34280 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61  ee..**.** Instea
34290 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62  d of trying to b
342a0 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67  alance the 3 rig
342b0 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67  ht-most leaf pag
342c0 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20  es, just add.** 
342d0 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
342e0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
342f0 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e  e and put the on
34300 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a  e new entry in.*
34310 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68  * that page.  Th
34320 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69  is leaves the ri
34330 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20  ght side of the 
34340 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a  tree somewhat.**
34350 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75   unbalanced.  Bu
34360 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20  t odds are that 
34370 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  we will be inser
34380 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73  ting new entries
34390 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73  .** at the end s
343a0 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73  oon afterwards s
343b0 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70  o the nearly emp
343c0 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69  ty page will qui
343d0 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e  ckly.** fill up.
343e0 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a    On average..**
343f0 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65  .** pPage is the
34400 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
34410 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
34420 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74  st page in the t
34430 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20  ree..** pParent 
34440 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20  is its parent.  
34450 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20  pPage must have 
34460 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f  a single overflo
34470 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68  w entry.** which
34480 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67   is also the rig
34490 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e  ht-most entry on
344a0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
344b0 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66   The pSpace buff
344c0 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  er is used to st
344d0 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ore a temporary 
344e0 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76 69  copy of the divi
344f0 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74  der.** cell that
34500 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
34510 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20  d into pParent. 
34520 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73  Such a cell cons
34530 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62  ists of a 4.** b
34540 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  yte page number 
34550 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61  followed by a va
34560 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
34570 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a  teger. In other.
34580 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73  ** words, at mos
34590 74 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63  t 13 bytes. Henc
345a0 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  e the pSpace buf
345b0 66 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a  fer must be at.*
345c0 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73  * least 13 bytes
345d0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61   in size..*/.sta
345e0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
345f0 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70  quick(MemPage *p
34600 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20  Parent, MemPage 
34610 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61  *pPage, u8 *pSpa
34620 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ce){.  BtShared 
34630 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61  *const pBt = pPa
34640 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42  ge->pBt;    /* B
34650 2d 54 72 65 65 20 44 61 74 61 62 61 73 65 20 2a  -Tree Database *
34660 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  /.  MemPage *pNe
34670 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
34680 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c           /* Newl
34690 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  y allocated page
346a0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
346b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
346d0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
346e0 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20  gno pgnoNew;    
346f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34700 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
34710 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20  er of pNew */.. 
34720 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
34730 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
34740 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
34750 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
34760 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
34770 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
34780 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
34790 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
347a0 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  low==1 );..  /* 
347b0 54 68 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69  This error condi
347c0 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67  tion is now caug
347d0 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63  ht prior to reac
347e0 68 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  hing this functi
347f0 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  on */.  if( pPag
34800 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 20 72 65  e->nCell==0 ) re
34810 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
34820 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20  UPT_BKPT;..  /* 
34830 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
34840 61 67 65 2e 20 54 68 69 73 20 70 61 67 65 20 77  age. This page w
34850 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
34860 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20  ight-sibling of 
34870 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b  .  ** pPage. Mak
34880 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
34890 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74  e writable, so t
348a0 68 61 74 20 74 68 65 20 6e 65 77 20 64 69 76 69  hat the new divi
348b0 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61  der cell.  ** ma
348c0 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49  y be inserted. I
348d0 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65  f both these ope
348e0 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63  rations are succ
348f0 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e  essful, proceed.
34900 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c  .  */.  rc = all
34910 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
34920 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
34930 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69  New, 0, 0);..  i
34940 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
34950 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75   ){..    u8 *pOu
34960 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a  t = &pSpace[4];.
34970 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
34980 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d  pPage->apOvfl[0]
34990 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c  ;.    u16 szCell
349a0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
349b0 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
349c0 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20    u8 *pStop;..  
349d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
349e0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
349f0 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29  e(pNew->pDbPage)
34a00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
34a10 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d  pPage->aData[0]=
34a20 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  =(PTF_INTKEY|PTF
34a30 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45  _LEAFDATA|PTF_LE
34a40 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  AF) );.    zeroP
34a50 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e  age(pNew, PTF_IN
34a60 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
34a70 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20  A|PTF_LEAF);.   
34a80 20 72 65 62 75 69 6c 64 50 61 67 65 28 70 4e 65   rebuildPage(pNe
34a90 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73  w, 1, &pCell, &s
34aa0 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 70 4e 65 77  zCell);.    pNew
34ab0 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75  ->nFree = pBt->u
34ac0 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 4e 65 77  sableSize - pNew
34ad0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2d 20 32  ->cellOffset - 2
34ae0 20 2d 20 73 7a 43 65 6c 6c 3b 0a 0a 20 20 20 20   - szCell;..    
34af0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
34b00 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
34b10 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
34b20 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20  e pointer map.  
34b30 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65    ** with entrie
34b40 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61  s for the new pa
34b50 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e  ge, and any poin
34b60 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  ter from the .  
34b70 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65    ** cell on the
34b80 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72   page to an over
34b90 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69  flow page. If ei
34ba0 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20  ther of these.  
34bb0 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20    ** operations 
34bc0 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72  fails, the retur
34bd0 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62  n code is set, b
34be0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
34bf0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
34c00 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73 74  rent page are st
34c10 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20  ill manipulated 
34c20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f  by thh code belo
34c30 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69  w..    ** That i
34c40 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f  s Ok, at this po
34c50 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  int the parent p
34c60 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  age is guarantee
34c70 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d  d to.    ** be m
34c80 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
34c90 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
34ca0 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75  or code will cau
34cb0 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c  se a.    ** roll
34cc0 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e  back, undoing an
34cd0 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74  y changes made t
34ce0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
34cf0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
34d00 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
34d10 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
34d20 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20  t(pBt, pgnoNew, 
34d30 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
34d40 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63  arent->pgno, &rc
34d50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43  );.      if( szC
34d60 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63  ell>pNew->minLoc
34d70 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74  al ){.        pt
34d80 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
34d90 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  New, pCell, &rc)
34da0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
34db0 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65    .    /* Create
34dc0 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
34dd0 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70  to insert into p
34de0 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69  Parent. The divi
34df0 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20  der cell.    ** 
34e00 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d  consists of a 4-
34e10 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
34e20 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (the page numbe
34e30 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a  r of pPage) and.
34e40 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c      ** a variabl
34e50 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c  e length key val
34e60 75 65 20 28 77 68 69 63 68 20 6d 75 73 74 20 62  ue (which must b
34e70 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  e the same value
34e80 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c   as the.    ** l
34e90 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50  argest key on pP
34ea0 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  age)..    **.   
34eb0 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20   ** To find the 
34ec0 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75  largest key valu
34ed0 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73  e on pPage, firs
34ee0 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 68 74  t find the right
34ef0 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65  -most .    ** ce
34f00 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65  ll on pPage. The
34f10 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64   first two field
34f20 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61  s of this cell a
34f30 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72  re the .    ** r
34f40 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20  ecord-length (a 
34f50 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
34f60 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20  integer at most 
34f70 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29  32-bits in size)
34f80 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  .    ** and the 
34f90 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76 61 72  key value (a var
34fa0 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
34fb0 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61  eger, may have a
34fc0 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a  ny value)..    *
34fd0 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20 74  * The first of t
34fe0 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f  he while(...) lo
34ff0 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20  ops below skips 
35000 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d  over the record-
35010 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69  length.    ** fi
35020 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  eld. The second 
35030 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20  while(...) loop 
35040 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20 76  copies the key v
35050 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20  alue from the.  
35060 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61    ** cell on pPa
35070 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61  ge into the pSpa
35080 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a  ce buffer..    *
35090 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  /.    pCell = fi
350a0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50  ndCell(pPage, pP
350b0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20  age->nCell-1);. 
350c0 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c     pStop = &pCel
350d0 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[9];.    while(
350e0 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38   (*(pCell++)&0x8
350f0 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f  0) && pCell<pSto
35100 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d  p );.    pStop =
35110 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20   &pCell[9];.    
35120 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b  while( ((*(pOut+
35130 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29  +) = *(pCell++))
35140 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c  &0x80) && pCell<
35150 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a  pStop );..    /*
35160 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
35170 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
35180 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  o pParent. */.  
35190 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61    insertCell(pPa
351a0 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e  rent, pParent->n
351b0 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28 69  Cell, pSpace, (i
351c0 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65 29  nt)(pOut-pSpace)
351d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
351e0 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c   0, pPage->pgno,
351f0 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53   &rc);..    /* S
35200 65 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  et the right-chi
35210 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70 50  ld pointer of pP
35220 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74  arent to point t
35230 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20  o the new page. 
35240 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  */.    put4byte(
35250 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
35260 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
35270 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b  et+8], pgnoNew);
35280 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61  .  .    /* Relea
35290 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  se the reference
352a0 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
352b0 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65  . */.    release
352c0 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a  Page(pNew);.  }.
352d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
352e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
352f0 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
35300 43 45 20 2a 2f 0a 0a 23 69 66 20 31 0a 2f 2a 0a  CE */..#if 1./*.
35310 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
35320 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69   does not contri
35330 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74 6f  bute anything to
35340 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f   the operation o
35350 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20  f SQLite..** it 
35360 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63 74  is sometimes act
35370 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72 69  ivated temporari
35380 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67 67 69  ly while debuggi
35390 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73 69  ng code responsi
353a0 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74  ble .** for sett
353b0 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  ing pointer-map 
353c0 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
353d0 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68 65  ic int ptrmapChe
353e0 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20  ckPages(MemPage 
353f0 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e 50  **apPage, int nP
35400 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  age){.  int i, j
35410 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
35420 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
35430 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65  Pgno n;.    u8 e
35440 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
35450 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69 5d  Page = apPage[i]
35460 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
35470 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
35480 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
35490 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a  age->isInit );..
354a0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
354b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b  Page->nCell; j++
354c0 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  ){.      CellInf
354d0 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38  o info;.      u8
354e0 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20 20   *z;.     .     
354f0 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50   z = findCell(pP
35500 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62  age, j);.      b
35510 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
35520 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f  (pPage, z, &info
35530 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66  );.      if( inf
35540 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  o.iOverflow ){. 
35550 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c         Pgno ovfl
35560 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b 69   = get4byte(&z[i
35570 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
35580 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47  .        ptrmapG
35590 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65  et(pBt, ovfl, &e
355a0 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  , &n);.        a
355b0 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d  ssert( n==pPage-
355c0 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d  >pgno && e==PTRM
355d0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a  AP_OVERFLOW1 );.
355e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
355f0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
35600 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 63  {.        Pgno c
35610 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28  hild = get4byte(
35620 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  z);.        ptrm
35630 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64  apGet(pBt, child
35640 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
35650 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
35660 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
35670 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a  PTRMAP_BTREE );.
35680 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
35690 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
356a0 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
356b0 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74   child = get4byt
356c0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
356d0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
356e0 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72 6d  +8]);.      ptrm
356f0 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64  apGet(pBt, child
35700 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
35710 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67   assert( n==pPag
35720 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54  e->pgno && e==PT
35730 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20  RMAP_BTREE );.  
35740 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
35750 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   1;.}.#endif../*
35760 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
35770 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 70  n is used to cop
35780 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  y the contents o
35790 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64  f the b-tree nod
357a0 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20  e stored .** on 
357b0 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61  page pFrom to pa
357c0 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65 20  ge pTo. If page 
357d0 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20  pFrom was not a 
357e0 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e 0a  leaf page, then.
357f0 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
35800 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65  ap entries for e
35810 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20 61  ach child page a
35820 72 65 20 75 70 64 61 74 65 64 20 73 6f 20 74 68  re updated so th
35830 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74  at the.** parent
35840 20 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e 20   page stored in 
35850 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
35860 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20  is page pTo. If 
35870 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a  pFrom contained.
35880 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69 74  ** any cells wit
35890 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  h overflow page 
358a0 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20 74  pointers, then t
358b0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
358c0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
358d0 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73 6f  entries are also
358e0 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74   updated so that
358f0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
35900 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a   is page pTo..**
35910 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73 20  .** If pFrom is 
35920 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79 69  currently carryi
35930 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ng any overflow 
35940 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20 69  cells (entries i
35950 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65  n the.** MemPage
35960 2e 61 70 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29  .apOvfl[] array)
35970 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 63  , they are not c
35980 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a  opied to pTo. .*
35990 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
359a0 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f 20  rning, page pTo 
359b0 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64  is reinitialized
359c0 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69 74   using btreeInit
359d0 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Page()..**.** Th
359e0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66  e performance of
359f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
35a00 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20  s not critical. 
35a10 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  It is only used 
35a20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e  by .** the balan
35a30 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61  ce_shallower() a
35a40 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nd balance_deepe
35a50 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20  r() procedures, 
35a60 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68  neither of.** wh
35a70 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f  ich are called o
35a80 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61  ften under norma
35a90 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e  l circumstances.
35aa0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
35ab0 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
35ac0 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20  MemPage *pFrom, 
35ad0 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e  MemPage *pTo, in
35ae0 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28  t *pRC){.  if( (
35af0 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  *pRC)==SQLITE_OK
35b00 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
35b10 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20 70   * const pBt = p
35b20 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75  From->pBt;.    u
35b30 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20  8 * const aFrom 
35b40 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a  = pFrom->aData;.
35b50 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61      u8 * const a
35b60 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b  To = pTo->aData;
35b70 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69  .    int const i
35b80 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d  FromHdr = pFrom-
35b90 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
35ba0 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72  int const iToHdr
35bb0 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d   = ((pTo->pgno==
35bc0 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20  1) ? 100 : 0);. 
35bd0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69     int rc;.    i
35be0 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a  nt iData;.  .  .
35bf0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
35c00 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  m->isInit );.   
35c10 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
35c20 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b  nFree>=iToHdr );
35c30 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
35c40 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72  2byte(&aFrom[iFr
35c50 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28 69 6e  omHdr+5]) <= (in
35c60 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
35c70 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43  e );.  .    /* C
35c80 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65 20 6e  opy the b-tree n
35c90 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ode content from
35ca0 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70   page pFrom to p
35cb0 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20 20  age pTo. */.    
35cc0 69 44 61 74 61 20 3d 20 67 65 74 32 62 79 74 65  iData = get2byte
35cd0 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72  (&aFrom[iFromHdr
35ce0 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +5]);.    memcpy
35cf0 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61  (&aTo[iData], &a
35d00 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74  From[iData], pBt
35d10 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44 61  ->usableSize-iDa
35d20 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ta);.    memcpy(
35d30 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61  &aTo[iToHdr], &a
35d40 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20  From[iFromHdr], 
35d50 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65  pFrom->cellOffse
35d60 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65  t + 2*pFrom->nCe
35d70 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52  ll);.  .    /* R
35d80 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
35d90 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68 65   pTo so that the
35da0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
35db0 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
35dc0 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68 20  re.    ** match 
35dd0 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54 68  the new data. Th
35de0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
35df0 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63 74 75   of pTo can actu
35e00 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65 72 0a  ally fail under.
35e10 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f 62      ** fairly ob
35e20 73 63 75 72 65 20 63 69 72 63 75 6d 73 74 61 6e  scure circumstan
35e30 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  ces, even though
35e40 20 69 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66   it is a copy of
35e50 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20   initialized .  
35e60 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d 2e    ** page pFrom.
35e70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f 2d  .    */.    pTo-
35e80 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
35e90 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
35ea0 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 69 66  age(pTo);.    if
35eb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35ec0 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
35ed0 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
35ee0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
35ef0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
35f00 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
35f10 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
35f20 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
35f30 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ries.    ** for 
35f40 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f 76  any b-tree or ov
35f50 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61  erflow pages tha
35f60 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69  t pTo now contai
35f70 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20  ns the pointers 
35f80 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  to..    */.    i
35f90 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
35fa0 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
35fb0 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
35fc0 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pTo);.    }.  }.
35fd0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
35fe0 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75  utine redistribu
35ff0 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  tes cells on the
36000 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20 63   iParentIdx'th c
36010 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 0a  hild of pParent.
36020 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22 74  ** (hereafter "t
36030 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75 70  he page") and up
36040 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20 73   to 2 siblings s
36050 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  o that all pages
36060 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 0a   have about the.
36070 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f  ** same amount o
36080 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55 73  f free space. Us
36090 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20 73  ually a single s
360a0 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65 72  ibling on either
360b0 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20   side of the.** 
360c0 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69 6e  page are used in
360d0 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20   the balancing, 
360e0 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62 6c  though both sibl
360f0 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20  ings might come 
36100 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65  from one.** side
36110 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
36120 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61 73  the first or las
36130 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70  t child of its p
36140 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70 61  arent. If the pa
36150 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65 72  ge .** has fewer
36160 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67 73   than 2 siblings
36170 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63   (something whic
36180 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  h can only happe
36190 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a 2a  n if the page.**
361a0 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65 20   is a root page 
361b0 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61 20  or a child of a 
361c0 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e 20  root page) then 
361d0 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69  all available si
361e0 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63  blings.** partic
361f0 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
36200 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ancing..**.** Th
36210 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c  e number of sibl
36220 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65  ings of the page
36230 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61   might be increa
36240 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64  sed or decreased
36250 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74   by .** one or t
36260 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20  wo in an effort 
36270 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65  to keep pages ne
36280 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f  arly full but no
36290 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a  t over full. .**
362a0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68  .** Note that wh
362b0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
362c0 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20  is called, some 
362d0 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20  of the cells on 
362e0 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68  the page.** migh
362f0 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  t not actually b
36300 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50  e stored in MemP
36310 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69  age.aData[]. Thi
36320 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20  s can happen.** 
36330 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
36340 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f  verfull. This ro
36350 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
36360 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c  at all cells all
36370 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  ocated.** to the
36380 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69   page and its si
36390 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f 20  blings fit into 
363a0 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 20  MemPage.aData[] 
363b0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
363c0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63  ..**.** In the c
363d0 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69  ourse of balanci
363e0 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  ng the page and 
363f0 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63 65  its siblings, ce
36400 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e  lls may be.** in
36410 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20 72  serted into or r
36420 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
36430 70 61 72 65 6e 74 20 70 61 67 65 20 28 70 50 61  parent page (pPa
36440 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a  rent). Doing so.
36450 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ** may cause the
36460 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20   parent page to 
36470 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20  become overfull 
36480 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66  or underfull. If
36490 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73   this.** happens
364a0 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70  , it is the resp
364b0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
364c0 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f  e caller to invo
364d0 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a  ke the correct.*
364e0 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74  * balancing rout
364f0 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73 20  ine to fix this 
36500 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68 65  problem (see the
36510 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74 69   balance() routi
36520 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ne). .**.** If t
36530 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
36540 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
36550 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65  , it might leave
36560 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
36570 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20   in a corrupted 
36580 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68 69  state. So if thi
36590 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c  s routine fails,
365a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
365b0 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65  ould.** be rolle
365c0 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  d back..**.** Th
365d0 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
365e0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
365f0 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20 69  n, aOvflSpace, i
36600 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
36610 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20 65  .** buffer big e
36620 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e  nough to hold on
36630 65 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c 65  e page. If while
36640 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73   inserting cells
36650 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
36660 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e  .** page (pParen
36670 74 29 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  t) the parent pa
36680 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66  ge becomes overf
36690 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72  ull, this buffer
366a0 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73   is.** used to s
366b0 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74 27  tore the parent'
366c0 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  s overflow cells
366d0 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20 66  . Because this f
366e0 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a  unction inserts.
366f0 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  ** a maximum of 
36700 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65 6c  four divider cel
36710 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ls into the pare
36720 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65  nt page, and the
36730 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65   maximum.** size
36740 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65   of a cell store
36750 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65  d within an inte
36760 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77  rnal node is alw
36770 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f  ays less than 1/
36780 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  4.** of the page
36790 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c  -size, the aOvfl
367a0 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69  Space[] buffer i
367b0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
367c0 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75  be large.** enou
367d0 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66  gh for all overf
367e0 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  low cells..**.**
367f0 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69   If aOvflSpace i
36800 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20  s set to a null 
36810 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
36820 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
36830 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
36840 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
36850 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d 53  _MSC_VER) && _MS
36860 43 5f 56 45 52 20 3e 3d 20 31 37 30 30 20 26 26  C_VER >= 1700 &&
36870 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52 4d 29   defined(_M_ARM)
36880 0a 23 70 72 61 67 6d 61 20 6f 70 74 69 6d 69 7a  .#pragma optimiz
36890 65 28 22 22 2c 20 6f 66 66 29 0a 23 65 6e 64 69  e("", off).#endi
368a0 66 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  f.static int bal
368b0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20  ance_nonroot(.  
368c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
368d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
368e0 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20 6f  /* Parent page o
368f0 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e 67  f siblings being
36900 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69   balanced */.  i
36910 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20 20  nt iParentIdx,  
36920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36930 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65 20  * Index of "the 
36940 70 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e 74  page" in pParent
36950 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53   */.  u8 *aOvflS
36960 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
36970 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69        /* page-si
36980 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
36990 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76 66  e for parent ovf
369a0 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f  l */.  int isRoo
369b0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
369c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
369d0 66 20 70 50 61 72 65 6e 74 20 69 73 20 61 20 72  f pParent is a r
369e0 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 69 6e  oot-page */.  in
369f0 74 20 62 42 75 6c 6b 20 20 20 20 20 20 20 20 20  t bBulk         
36a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36a10 20 54 72 75 65 20 69 66 20 74 68 69 73 20 63 61   True if this ca
36a20 6c 6c 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  ll is part of a 
36a30 62 75 6c 6b 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a  bulk load */.){.
36a40 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
36a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36a60 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61  * The whole data
36a70 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  base */.  int nC
36a80 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
36a90 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
36aa0 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43   of cells in apC
36ab0 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ell[] */.  int n
36ac0 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20  MaxCells = 0;   
36ad0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
36ae0 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43  ated size of apC
36af0 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72  ell, szCell, aFr
36b00 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65  om. */.  int nNe
36b10 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
36b20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
36b30 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65  of pages in apNe
36b40 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c  w[] */.  int nOl
36b50 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
36b60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
36b70 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c  of pages in apOl
36b80 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  d[] */.  int i, 
36b90 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
36ba0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
36bb0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
36bc0 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20  nxDiv;          
36bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
36be0 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e   divider slot in
36bf0 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b   pParent->aCell[
36c00 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  ] */.  int rc = 
36c10 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
36c20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
36c30 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  n code */.  u16 
36c40 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20  leafCorrection; 
36c50 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66           /* 4 if
36c60 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
36c70 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20  .  0 if not */. 
36c80 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20   int leafData;  
36c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36ca0 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69   True if pPage i
36cb0 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45  s a leaf of a LE
36cc0 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20  AFDATA tree */. 
36cd0 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65   int usableSpace
36ce0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
36cf0 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20   Bytes in pPage 
36d00 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65  beyond the heade
36d10 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46  r */.  int pageF
36d20 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
36d30 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
36d40 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20  pPage->aData[0] 
36d50 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61  */.  int subtota
36d60 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
36d70 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66    /* Subtotal of
36d80 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20   bytes in cells 
36d90 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20  on one page */. 
36da0 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30   int iSpace1 = 0
36db0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
36dc0 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
36dd0 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20  te of aSpace1[] 
36de0 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53 70  */.  int iOvflSp
36df0 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ace = 0;        
36e00 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65    /* First unuse
36e10 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c 53  d byte of aOvflS
36e20 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pace[] */.  int 
36e30 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20  szScratch;      
36e40 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
36e50 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f   of scratch memo
36e60 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  ry requested */.
36e70 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64    MemPage *apOld
36e80 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [NB];          /
36e90 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
36ea0 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a  o two siblings *
36eb0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e  /.  MemPage *apN
36ec0 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
36ed0 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
36ee0 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20   to NB siblings 
36ef0 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20  after balancing 
36f00 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74 3b  */.  u8 *pRight;
36f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e    /* Location in
36f30 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68 74   parent of right
36f40 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72  -sibling pointer
36f50 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b   */.  u8 *apDiv[
36f60 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20 20  NB-1];          
36f70 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65     /* Divider ce
36f80 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a  lls in pParent *
36f90 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e  /.  int cntNew[N
36fa0 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B+2];           
36fb0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65   /* Index in aCe
36fc0 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74  ll[] of cell aft
36fd0 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  er i-th page */.
36fe0 20 20 69 6e 74 20 63 6e 74 4f 6c 64 5b 4e 42 2b    int cntOld[NB+
36ff0 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  2];            /
37000 2a 20 4f 6c 64 20 69 6e 64 65 78 20 69 6e 20 61  * Old index in a
37010 43 65 6c 6c 5b 5d 20 61 66 74 65 72 20 69 2d 74  Cell[] after i-t
37020 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  h page */.  int 
37030 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  szNew[NB+2];    
37040 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62           /* Comb
37050 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c  ined size of cel
37060 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68  ls place on i-th
37070 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
37080 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20  apCell = 0;     
37090 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
370a0 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e  ells begin balan
370b0 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  ced */.  u16 *sz
370c0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
370d0 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73        /* Local s
370e0 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
370f0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
37100 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20    u8 *aSpace1;  
37110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37120 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69  * Space for copi
37130 65 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63  es of dividers c
37140 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ells */.  Pgno p
37150 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
37160 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 76         /* Temp v
37170 61 72 20 74 6f 20 73 74 6f 72 65 20 61 20 70 61  ar to store a pa
37180 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a  ge number in */.
37190 0a 20 20 75 38 20 61 62 44 6f 6e 65 5b 4e 42 2b  .  u8 abDone[NB+
371a0 32 5d 3b 0a 20 20 50 67 6e 6f 20 61 50 67 6e 6f  2];.  Pgno aPgno
371b0 5b 4e 42 2b 32 5d 3b 0a 20 20 75 31 36 20 61 50  [NB+2];.  u16 aP
371c0 67 46 6c 61 67 73 5b 4e 42 2b 32 5d 3b 0a 0a 20  gFlags[NB+2];.. 
371d0 20 6d 65 6d 73 65 74 28 61 62 44 6f 6e 65 2c 20   memset(abDone, 
371e0 30 2c 20 73 69 7a 65 6f 66 28 61 62 44 6f 6e 65  0, sizeof(abDone
371f0 29 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 72  ));.  pBt = pPar
37200 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  ent->pBt;.  asse
37210 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
37220 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
37230 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
37240 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
37250 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
37260 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 23 69  >pDbPage) );..#i
37270 66 20 30 0a 20 20 54 52 41 43 45 28 28 22 42 41  f 0.  TRACE(("BA
37280 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67  LANCE: begin pag
37290 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64  e %d child of %d
372a0 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
372b0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  , pParent->pgno)
372c0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
372d0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 50  At this point pP
372e0 61 72 65 6e 74 20 6d 61 79 20 68 61 76 65 20 61  arent may have a
372f0 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66  t most one overf
37300 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66  low cell. And if
37310 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76 65 72 66  .  ** this overf
37320 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70 72 65 73  low cell is pres
37330 65 6e 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ent, it must be 
37340 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 0a 20  the cell with . 
37350 20 2a 2a 20 69 6e 64 65 78 20 69 50 61 72 65 6e   ** index iParen
37360 74 49 64 78 2e 20 54 68 69 73 20 73 63 65 6e 61  tIdx. This scena
37370 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74 20  rio comes about 
37380 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
37390 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65  on.  ** is calle
373a0 64 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20 66  d (indirectly) f
373b0 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65  rom sqlite3Btree
373c0 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f 0a 20  Delete()..  */. 
373d0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
373e0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c  ->nOverflow==0 |
373f0 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  | pParent->nOver
37400 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73 73  flow==1 );.  ass
37410 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f  ert( pParent->nO
37420 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50  verflow==0 || pP
37430 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d  arent->aiOvfl[0]
37440 3d 3d 69 50 61 72 65 6e 74 49 64 78 20 29 3b 0a  ==iParentIdx );.
37450 0a 20 20 69 66 28 20 21 61 4f 76 66 6c 53 70 61  .  if( !aOvflSpa
37460 63 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ce ){.    return
37470 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
37480 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68   }..  /* Find th
37490 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
374a0 74 6f 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f  to balance. Also
374b0 20 6c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c   locate the cell
374c0 73 20 69 6e 20 70 50 61 72 65 6e 74 20 0a 20 20  s in pParent .  
374d0 2a 2a 20 74 68 61 74 20 64 69 76 69 64 65 20 74  ** that divide t
374e0 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20  he siblings. An 
374f0 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
37500 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69  to find NN sibli
37510 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74  ngs on .  ** eit
37520 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
37530 65 2e 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73  e. More siblings
37540 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20   are taken from 
37550 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65  one side, howeve
37560 72 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 72  r, .  ** if ther
37570 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e  e are fewer than
37580 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
37590 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20  the other side. 
375a0 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20  If pParent.  ** 
375b0 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20  has NB or fewer 
375c0 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c  children then al
375d0 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50  l children of pP
375e0 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e  arent are taken.
375f0 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69    .  **.  ** Thi
37600 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70  s loop also drop
37610 73 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  s the divider ce
37620 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20 70 61 72  lls from the par
37630 65 6e 74 20 70 61 67 65 2e 20 54 68 69 73 0a 20  ent page. This. 
37640 20 2a 2a 20 77 61 79 2c 20 74 68 65 20 72 65 6d   ** way, the rem
37650 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 66 75  ainder of the fu
37660 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
37670 68 61 76 65 20 74 6f 20 64 65 61 6c 20 77 69 74  have to deal wit
37680 68 20 61 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66  h any.  ** overf
37690 6c 6f 77 20 63 65 6c 6c 73 20 69 6e 20 74 68 65  low cells in the
376a0 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20 73 69   parent page, si
376b0 6e 63 65 20 69 66 20 61 6e 79 20 65 78 69 73 74  nce if any exist
376c0 65 64 20 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a  ed they will.  *
376d0 2a 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  * have already b
376e0 65 65 6e 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a  een removed..  *
376f0 2f 0a 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d  /.  i = pParent-
37700 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61  >nOverflow + pPa
37710 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69  rent->nCell;.  i
37720 66 28 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78  f( i<2 ){.    nx
37730 44 69 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Div = 0;.  }else
37740 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 42  {.    assert( bB
37750 75 6c 6b 3d 3d 30 20 7c 7c 20 62 42 75 6c 6b 3d  ulk==0 || bBulk=
37760 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 69 50  =1 );.    if( iP
37770 61 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20  arentIdx==0 ){  
37780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
37790 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b        nxDiv = 0;
377a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
377b0 50 61 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a  ParentIdx==i ){.
377c0 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d        nxDiv = i-
377d0 32 2b 62 42 75 6c 6b 3b 0a 20 20 20 20 7d 65 6c  2+bBulk;.    }el
377e0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
377f0 28 20 62 42 75 6c 6b 3d 3d 30 20 29 3b 0a 20 20  ( bBulk==0 );.  
37800 20 20 20 20 6e 78 44 69 76 20 3d 20 69 50 61 72      nxDiv = iPar
37810 65 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a  entIdx-1;.    }.
37820 20 20 20 20 69 20 3d 20 32 2d 62 42 75 6c 6b 3b      i = 2-bBulk;
37830 0a 20 20 7d 0a 20 20 6e 4f 6c 64 20 3d 20 69 2b  .  }.  nOld = i+
37840 31 3b 0a 20 20 69 66 28 20 28 69 2b 6e 78 44 69  1;.  if( (i+nxDi
37850 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
37860 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e  flow)==pParent->
37870 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69  nCell ){.    pRi
37880 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e  ght = &pParent->
37890 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
378a0 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d  drOffset+8];.  }
378b0 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74  else{.    pRight
378c0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72   = findCell(pPar
378d0 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61  ent, i+nxDiv-pPa
378e0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29  rent->nOverflow)
378f0 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67  ;.  }.  pgno = g
37900 65 74 34 62 79 74 65 28 70 52 69 67 68 74 29 3b  et4byte(pRight);
37910 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
37920 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
37930 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
37940 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 30 29 3b  , &apOld[i], 0);
37950 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
37960 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c       memset(apOl
37970 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65  d, 0, (i+1)*size
37980 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20  of(MemPage*));. 
37990 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
379a0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
379b0 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b  .    nMaxCells +
379c0 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43  = 1+apOld[i]->nC
379d0 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f  ell+apOld[i]->nO
379e0 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28  verflow;.    if(
379f0 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61   (i--)==0 ) brea
37a00 6b 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e 78  k;..    if( i+nx
37a10 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 69  Div==pParent->ai
37a20 4f 76 66 6c 5b 30 5d 20 26 26 20 70 50 61 72 65  Ovfl[0] && pPare
37a30 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  nt->nOverflow ){
37a40 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
37a50 3d 20 70 50 61 72 65 6e 74 2d 3e 61 70 4f 76 66  = pParent->apOvf
37a60 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f  l[0];.      pgno
37a70 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
37a80 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e  v[i]);.      szN
37a90 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  ew[i] = cellSize
37aa0 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44  Ptr(pParent, apD
37ab0 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50  iv[i]);.      pP
37ac0 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
37ad0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
37ae0 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
37af0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  = findCell(pPare
37b00 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
37b10 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b  ent->nOverflow);
37b20 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  .      pgno = ge
37b30 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
37b40 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d  ;.      szNew[i]
37b50 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
37b60 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
37b70 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f  );..      /* Dro
37b80 70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  p the cell from 
37b90 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
37ba0 20 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20   apDiv[i] still 
37bb0 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20  points to.      
37bc0 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  ** the cell with
37bd0 69 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65  in the parent, e
37be0 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61  ven though it ha
37bf0 73 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a  s been dropped..
37c00 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
37c10 20 73 61 66 65 20 62 65 63 61 75 73 65 20 64 72   safe because dr
37c20 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e  opping a cell on
37c30 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ly overwrites th
37c40 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a  e first.      **
37c50 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69   four bytes of i
37c60 74 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  t, and this func
37c70 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  tion does not ne
37c80 65 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  ed the first.   
37c90 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73     ** four bytes
37ca0 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
37cb0 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69  cell. So the poi
37cc0 6e 74 65 72 20 69 73 20 73 61 66 65 20 74 6f 20  nter is safe to 
37cd0 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74  use.      ** lat
37ce0 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a  er on.  .      *
37cf0 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e  *.      ** But n
37d00 6f 74 20 69 66 20 77 65 20 61 72 65 20 69 6e 20  ot if we are in 
37d10 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
37d20 64 65 2e 20 49 6e 20 73 65 63 75 72 65 2d 64 65  de. In secure-de
37d30 6c 65 74 65 20 6d 6f 64 65 2c 0a 20 20 20 20 20  lete mode,.     
37d40 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c   ** the dropCell
37d50 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
37d60 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 65 6e  overwrite the en
37d70 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a  tire cell with z
37d80 65 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  eroes..      ** 
37d90 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 65  In this case, te
37da0 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74  mporarily copy t
37db0 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65  he cell into the
37dc0 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20   aOvflSpace[].  
37dd0 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49      ** buffer. I
37de0 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64  t will be copied
37df0 20 6f 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f   out again as so
37e00 6f 6e 20 61 73 20 74 68 65 20 61 53 70 61 63 65  on as the aSpace
37e10 5b 5d 20 62 75 66 66 65 72 0a 20 20 20 20 20 20  [] buffer.      
37e20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e  ** is allocated.
37e30 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
37e40 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
37e50 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
37e60 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
37e70 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 69  iOff;..        i
37e80 4f 66 66 20 3d 20 53 51 4c 49 54 45 5f 50 54 52  Off = SQLITE_PTR
37e90 5f 54 4f 5f 49 4e 54 28 61 70 44 69 76 5b 69 5d  _TO_INT(apDiv[i]
37ea0 29 20 2d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  ) - SQLITE_PTR_T
37eb0 4f 5f 49 4e 54 28 70 50 61 72 65 6e 74 2d 3e 61  O_INT(pParent->a
37ec0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69  Data);.        i
37ed0 66 28 20 28 69 4f 66 66 2b 73 7a 4e 65 77 5b 69  f( (iOff+szNew[i
37ee0 5d 29 3e 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  ])>(int)pBt->usa
37ef0 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
37f00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
37f10 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
37f20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
37f30 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a  apOld, 0, (i+1)*
37f40 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29  sizeof(MemPage*)
37f50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
37f60 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
37f70 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
37f80 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
37f90 70 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 69  py(&aOvflSpace[i
37fa0 4f 66 66 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20  Off], apDiv[i], 
37fb0 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20  szNew[i]);.     
37fc0 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
37fd0 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69  &aOvflSpace[apDi
37fe0 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44  v[i]-pParent->aD
37ff0 61 74 61 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ata];.        }.
38000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 72        }.      dr
38010 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  opCell(pParent, 
38020 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
38030 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65  >nOverflow, szNe
38040 77 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20  w[i], &rc);.    
38050 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
38060 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c   nMaxCells a mul
38070 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72  tiple of 4 in or
38080 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20  der to preserve 
38090 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67  8-byte.  ** alig
380a0 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43  nment */.  nMaxC
380b0 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c  ells = (nMaxCell
380c0 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a  s + 3)&~3;..  /*
380d0 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  ** Allocate s
380e0 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
380f0 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a  structures.  */.
38100 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20    szScratch =.  
38110 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73       nMaxCells*s
38120 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20  izeof(u8*)      
38130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38140 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20   /* apCell */.  
38150 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73     + nMaxCells*s
38160 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20  izeof(u16)      
38170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38180 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20   /* szCell */.  
38190 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69     + pBt->pageSi
381a0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
381b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
381c0 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20   /* aSpace1 */. 
381d0 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65   apCell = sqlite
381e0 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20  3ScratchMalloc( 
381f0 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20  szScratch ); .  
38200 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b  if( apCell==0 ){
38210 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
38220 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
38230 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
38240 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d  ;.  }.  szCell =
38250 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e   (u16*)&apCell[n
38260 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 53 70  MaxCells];.  aSp
38270 61 63 65 31 20 3d 20 28 75 38 2a 29 26 73 7a 43  ace1 = (u8*)&szC
38280 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
38290 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
382a0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61  BYTE_ALIGNMENT(a
382b0 53 70 61 63 65 31 29 20 29 3b 0a 0a 20 20 2f 2a  Space1) );..  /*
382c0 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74  .  ** Load point
382d0 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73  ers to all cells
382e0 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65   on sibling page
382f0 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65  s and the divide
38300 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
38310 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65  o the local apCe
38320 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b  ll[] array.  Mak
38330 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
38340 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
38350 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  ** into space ob
38360 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 53 70 61  tained from aSpa
38370 63 65 31 5b 5d 2e 20 54 68 65 20 64 69 76 69 64  ce1[]. The divid
38380 65 72 20 63 65 6c 6c 73 20 68 61 76 65 20 61 6c  er cells have al
38390 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20  ready.  ** been 
383a0 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 70 50 61  removed from pPa
383b0 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rent..  **.  ** 
383c0 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
383d0 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65  are on leaf page
383e0 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c  s, then the chil
383f0 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68  d pointers of th
38400 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63  e.  ** divider c
38410 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65  ells are strippe
38420 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73  d from the cells
38430 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65   before they are
38440 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74   copied.  ** int
38450 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e  o aSpace1[].  In
38460 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63   this way, all c
38470 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
38480 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a   are without.  *
38490 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  * child pointers
384a0 2e 20 20 49 66 20