/ Hex Artifact Content
Login

Artifact 44c34502f17681eb957149cc1b8b4e1964ed231a:


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 61 6e 64 20 70 52 63 20 69  tected and pRc i
a170: 73 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 20 69 73 20  s NULL, NULL is 
a180: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
a190: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 67  .** corruption g
a1a0: 6f 65 73 20 75 6e 72 65 70 6f 72 74 65 64 2e 0a  oes unreported..
a1b0: 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 6c 6f 74 20  **.** If a slot 
a1c0: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 42 79 74  of at least nByt
a1d0: 65 20 62 79 74 65 73 20 69 73 20 66 6f 75 6e 64  e bytes is found
a1e0: 20 62 75 74 20 63 61 6e 6e 6f 74 20 62 65 20 75   but cannot be u
a1f0: 73 65 64 20 62 65 63 61 75 73 65 20 0a 2a 2a 20  sed because .** 
a200: 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64  there are alread
a210: 79 20 61 74 20 6c 65 61 73 74 20 36 30 20 66 72  y at least 60 fr
a220: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f  agmented bytes o
a230: 6e 20 74 68 65 20 70 61 67 65 2c 20 72 65 74 75  n the page, retu
a240: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 6e 20 74  rn NULL..** In t
a250: 68 69 73 20 63 61 73 65 2c 20 69 66 20 70 62 44  his case, if pbD
a260: 65 66 72 61 67 20 70 61 72 61 6d 65 74 65 72 20  efrag parameter 
a270: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65 74  is not NULL, set
a280: 20 2a 70 62 44 65 66 72 61 67 20 74 6f 20 74 72   *pbDefrag to tr
a290: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ue..*/.static u8
a2a0: 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d   *pageFindSlot(M
a2b0: 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74  emPage *pPg, int
a2c0: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63   nByte, int *pRc
a2d0: 2c 20 69 6e 74 20 2a 70 62 44 65 66 72 61 67 29  , int *pbDefrag)
a2e0: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
a2f0: 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73  r = pPg->hdrOffs
a300: 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  et;.  u8 * const
a310: 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
a320: 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64 64 72  ata;.  int iAddr
a330: 3b 0a 20 20 69 6e 74 20 70 63 3b 0a 20 20 69 6e  ;.  int pc;.  in
a340: 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  t usableSize = p
a350: 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  Pg->pBt->usableS
a360: 69 7a 65 3b 0a 0a 20 20 66 6f 72 28 69 41 64 64  ize;..  for(iAdd
a370: 72 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67  r=hdr+1; (pc = g
a380: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 69  et2byte(&aData[i
a390: 41 64 64 72 5d 29 29 3e 30 3b 20 69 41 64 64 72  Addr]))>0; iAddr
a3a0: 3d 70 63 29 7b 0a 20 20 20 20 69 6e 74 20 73 69  =pc){.    int si
a3b0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
a3c0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72  * Size of the fr
a3d0: 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 69  ee slot */.    i
a3e0: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
a3f0: 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64 72 2b 34  -4 || pc<iAddr+4
a400: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
a410: 63 20 29 20 2a 70 52 63 20 3d 20 53 51 4c 49 54  c ) *pRc = SQLIT
a420: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
a430: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
a440: 20 20 20 20 7d 0a 20 20 20 20 73 69 7a 65 20 3d      }.    size =
a450: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
a460: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  [pc+2]);.    if(
a470: 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a   size>=nByte ){.
a480: 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69        int x = si
a490: 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20  ze - nByte;.    
a4a0: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
a4b0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
a4c0: 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20  se( x==3 );.    
a4d0: 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20    if( x<4 ){.   
a4e0: 20 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68       if( aData[h
a4f0: 64 72 2b 37 5d 3e 3d 36 30 20 29 7b 0a 20 20 20  dr+7]>=60 ){.   
a500: 20 20 20 20 20 20 20 69 66 28 20 70 62 44 65 66         if( pbDef
a510: 72 61 67 20 29 20 2a 70 62 44 65 66 72 61 67 20  rag ) *pbDefrag 
a520: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 1;.          r
a530: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
a540: 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65   }.        /* Re
a550: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
a560: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
a570: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
a580: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ber of.        *
a590: 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  * fragmented byt
a5a0: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
a5b0: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ge. */.        m
a5c0: 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41 64  emcpy(&aData[iAd
a5d0: 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c  dr], &aData[pc],
a5e0: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61   2);.        aDa
a5f0: 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38  ta[hdr+7] += (u8
a600: 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  )x;.      }else 
a610: 69 66 28 20 73 69 7a 65 2b 70 63 20 3e 20 75 73  if( size+pc > us
a620: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
a630: 20 20 20 20 69 66 28 20 70 52 63 20 29 20 2a 70      if( pRc ) *p
a640: 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  Rc = SQLITE_CORR
a650: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
a660: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
a670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a680: 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d   /* The slot rem
a690: 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ains on the free
a6a0: 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69 74  -list. Reduce it
a6b0: 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e  s size to accoun
a6c0: 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  t.         ** fo
a6d0: 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73  r the portion us
a6e0: 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c  ed by the new al
a6f0: 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  location. */.   
a700: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 61       put2byte(&a
a710: 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a  Data[pc+2], x);.
a720: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
a730: 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63 20 2b  turn &aData[pc +
a740: 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   x];.    }.  }..
a750: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
a760: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
a770: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
a780: 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ce from within t
a790: 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70  he B-Tree page p
a7a0: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
a7b0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
a7c0: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78  Write into *pIdx
a7d0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
a7e0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a  pPage->aData[].*
a7f0: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  * of the first b
a800: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
a810: 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65   space. Return e
a820: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20  ither SQLITE_OK 
a830: 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  or.** an error c
a840: 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c  ode (usually SQL
a850: 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
a860: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
a870: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
a880: 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65  here is sufficie
a890: 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65  nt space to make
a8a0: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   the.** allocati
a8b0: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
a8c0: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
a8d0: 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72  defragment in or
a8e0: 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20  der to bring.** 
a8f0: 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f  all the space to
a900: 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e  gether, however.
a910: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
a920: 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a  ill avoid using.
a930: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ** the first two
a940: 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20   bytes past the 
a950: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65  cell pointer are
a960: 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62  a since presumab
a970: 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63  ly this.** alloc
a980: 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d  ation is being m
a990: 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ade in order to 
a9a0: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  insert a new cel
a9b0: 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a  l, so we will.**
a9c0: 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65   also end up nee
a9d0: 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20  ding a new cell 
a9e0: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
a9f0: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
aa00: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
aa10: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  age, int nByte, 
aa20: 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f  int *pIdx){.  co
aa30: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
aa40: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
aa50: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
aa60: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
aa70: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
aa80: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
aa90: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
aaa0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
aab0: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
aac0: 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
aaf0: 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63  t byte of cell c
ab00: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
ab10: 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20   int gap;       
ab20: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
ab30: 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65  f gap between ce
ab40: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  ll pointers and 
ab50: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
ab60: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
ab70: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74    /* Integer ret
ab80: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
ab90: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a  t usableSize; /*
aba0: 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20   Usable size of 
abb0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a 20  the page */.  . 
abc0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
abd0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
abe0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
abf0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
ac00: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
ac10: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
ac20: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
ac30: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
ac40: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d   assert( nByte>=
ac50: 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  0 );  /* Minimum
ac60: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
ac70: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
ac80: 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65  ge->nFree>=nByte
ac90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
aca0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
acb0: 30 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  0 );.  usableSiz
acc0: 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
acd0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73  usableSize;.  as
ace0: 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 75 73  sert( nByte < us
acf0: 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20  ableSize-8 );.. 
ad00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ad10: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64  cellOffset == hd
ad20: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
ad30: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20  ->leaf );.  gap 
ad40: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
ad50: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
ad60: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
ad70: 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  gap<=65536 );.  
ad80: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
ad90: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
ada0: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20  if( gap>top ){. 
adb0: 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20 29 7b     if( top==0 ){
adc0: 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35  .      top = 655
add0: 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  36;.    }else{. 
ade0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
adf0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ae00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
ae10: 20 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f   If there is eno
ae20: 75 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65  ugh space betwee
ae30: 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f  n gap and top fo
ae40: 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20  r one more cell 
ae50: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72  pointer.  ** arr
ae60: 61 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c  ay entry offset,
ae70: 20 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65   and if the free
ae80: 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74  list is not empt
ae90: 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74  y, then search t
aea0: 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  he.  ** freelist
aeb0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66   looking for a f
aec0: 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f  ree slot big eno
aed0: 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74  ugh to satisfy t
aee0: 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f  he request..  */
aef0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
af00: 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +2==top );.  tes
af10: 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f  tcase( gap+1==to
af20: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
af30: 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69   gap==top );.  i
af40: 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 26 26  f( gap+2<=top &&
af50: 20 28 64 61 74 61 5b 68 64 72 2b 31 5d 20 7c 7c   (data[hdr+1] ||
af60: 20 64 61 74 61 5b 68 64 72 2b 32 5d 29 20 29 7b   data[hdr+2]) ){
af70: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
af80: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74  LITE_OK;.    int
af90: 20 62 44 65 66 72 61 67 20 3d 20 30 3b 0a 20 20   bDefrag = 0;.  
afa0: 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70    u8 *pSpace = p
afb0: 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67  ageFindSlot(pPag
afc0: 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 2c 20 26  e, nByte, &rc, &
afd0: 62 44 65 66 72 61 67 29 3b 0a 20 20 20 20 69 66  bDefrag);.    if
afe0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
aff0: 3b 0a 20 20 20 20 69 66 28 20 62 44 65 66 72 61  ;.    if( bDefra
b000: 67 20 29 20 67 6f 74 6f 20 64 65 66 72 61 67 6d  g ) goto defragm
b010: 65 6e 74 5f 70 61 67 65 3b 0a 20 20 20 20 69 66  ent_page;.    if
b020: 28 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  ( pSpace ){.    
b030: 20 20 2a 70 49 64 78 20 3d 20 70 53 70 61 63 65    *pIdx = pSpace
b040: 20 2d 20 64 61 74 61 3b 0a 20 20 20 20 20 20 72   - data;.      r
b050: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b060: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
b070: 20 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75   The request cou
b080: 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c  ld not be fulfil
b090: 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65  led using a free
b0a0: 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63  list slot.  Chec
b0b0: 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66  k.  ** to see if
b0c0: 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e   defragmentation
b0d0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
b0e0: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
b0f0: 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70  gap+2+nByte==top
b100: 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b   );.  if( gap+2+
b110: 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 64 65  nByte>top ){. de
b120: 66 72 61 67 6d 65 6e 74 5f 70 61 67 65 3a 0a 20  fragment_page:. 
b130: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
b140: 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
b150: 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
b160: 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  entPage(pPage);.
b170: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
b180: 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20  urn rc;.    top 
b190: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
b1a0: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
b1b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70  .    assert( gap
b1c0: 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20  +nByte<=top );. 
b1d0: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   }...  /* Alloca
b1e0: 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74  te memory from t
b1f0: 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65  he gap in betwee
b200: 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  n the cell point
b210: 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e  er array.  ** an
b220: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
b230: 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74  nt area.  The bt
b240: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61  reeInitPage() ca
b250: 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20  ll has already. 
b260: 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68   ** validated th
b270: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76  e freelist.  Giv
b280: 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65  en that the free
b290: 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74  list is valid, t
b2a0: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  here.  ** is no 
b2b0: 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c  way that the all
b2c0: 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65  ocation can exte
b2d0: 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  nd off the end o
b2e0: 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a  f the page..  **
b2f0: 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65   The assert() be
b300: 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65  low verifies the
b310: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
b320: 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d  ce..  */.  top -
b330: 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62  = nByte;.  put2b
b340: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
b350: 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74  , top);.  assert
b360: 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28  ( top+nByte <= (
b370: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
b380: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
b390: 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72  *pIdx = top;.  r
b3a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b3b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
b3c0: 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68   a section of th
b3d0: 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74  e pPage->aData t
b3e0: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
b3f0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74  ** The first byt
b400: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65  e of the new fre
b410: 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65  e block is pPage
b420: 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a  ->aData[iStart].
b430: 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ** and the size 
b440: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20  of the block is 
b450: 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a  iSize bytes..**.
b460: 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65  ** Adjacent free
b470: 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65  blocks are coale
b480: 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  sced..**.** Note
b490: 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67   that even thoug
b4a0: 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20  h the freeblock 
b4b0: 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64  list was checked
b4c0: 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67   by btreeInitPag
b4d0: 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75  e(),.** that rou
b4e0: 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65  tine will not de
b4f0: 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74  tect overlap bet
b500: 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72  ween cells or fr
b510: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a  eeblocks.  Nor.*
b520: 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74  * does it detect
b530: 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c   cells or freebl
b540: 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75  ocks that encrou
b550: 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65  ch into the rese
b560: 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74  rved bytes.** at
b570: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
b580: 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64  page.  So do add
b590: 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69  itional corrupti
b5a0: 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65  on checks inside
b5b0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
b5c0: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
b5d0: 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e  TE_CORRUPT if an
b5e0: 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66  y problems are f
b5f0: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
b600: 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65  int freeSpace(Me
b610: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31  mPage *pPage, u1
b620: 36 20 69 53 74 61 72 74 2c 20 75 31 36 20 69 53  6 iStart, u16 iS
b630: 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72  ize){.  u16 iPtr
b640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b660: 20 41 64 64 72 65 73 73 20 6f 66 20 70 74 72 20   Address of ptr 
b670: 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63  to next freebloc
b680: 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65  k */.  u16 iFree
b690: 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  Blk;            
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b6b0: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  Address of the n
b6c0: 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f  ext freeblock */
b6d0: 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20  .  u8 hdr;      
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
b700: 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30   header size.  0
b710: 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20   or 100 */.  u8 
b720: 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20  nFrag = 0;      
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b740: 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20     /* Reduction 
b750: 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  in fragmentation
b760: 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53   */.  u16 iOrigS
b770: 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20  ize = iSize;    
b780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b790: 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
b7a0: 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20   iSize */.  u32 
b7b0: 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70  iLast = pPage->p
b7c0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
b7d0: 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73  ; /* Largest pos
b7e0: 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20  sible freeblock 
b7f0: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32 20  offset */.  u32 
b800: 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20  iEnd = iStart + 
b810: 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  iSize;          
b820: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
b830: 70 61 73 74 20 74 68 65 20 69 53 74 61 72 74 20  past the iStart 
b840: 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69  buffer */.  unsi
b850: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
b860: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
b870: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e    /* Page conten
b880: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
b890: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
b8a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b8b0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
b8c0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
b8d0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
b8e0: 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68  iStart>=pPage->h
b8f0: 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65  drOffset+6+pPage
b900: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29  ->childPtrSize )
b910: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
b920: 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c  UPT_DB || iEnd <
b930: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
b940: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73  ableSize );.  as
b950: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b960: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
b970: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
b980: 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d   assert( iSize>=
b990: 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75  4 );   /* Minimu
b9a0: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
b9b0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53   */.  assert( iS
b9c0: 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a  tart<=iLast );..
b9d0: 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
b9e0: 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
b9f0: 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
ba00: 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  en the secure_de
ba10: 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e  lete.  ** option
ba20: 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20   is enabled */. 
ba30: 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
ba40: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
ba50: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
ba60: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
ba70: 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53  a[iStart], 0, iS
ba80: 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
ba90: 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65  The list of free
baa0: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
bab0: 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
bac0: 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20  r.  Find the .  
bad0: 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c  ** spot on the l
bae0: 69 73 74 20 77 68 65 72 65 20 69 53 74 61 72 74  ist where iStart
baf0: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72   should be inser
bb00: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20  ted..  */.  hdr 
bb10: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
bb20: 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72  et;.  iPtr = hdr
bb30: 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61   + 1;.  if( data
bb40: 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64  [iPtr+1]==0 && d
bb50: 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a  ata[iPtr]==0 ){.
bb60: 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30      iFreeBlk = 0
bb70: 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66  ;  /* Shortcut f
bb80: 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e  or the case when
bb90: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
bba0: 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73   empty */.  }els
bbb0: 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69  e{.    while( (i
bbc0: 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79  FreeBlk = get2by
bbd0: 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29  te(&data[iPtr]))
bbe0: 3e 30 20 26 26 20 69 46 72 65 65 42 6c 6b 3c 69  >0 && iFreeBlk<i
bbf0: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69  Start ){.      i
bc00: 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72  f( iFreeBlk<iPtr
bc10: 2b 34 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  +4 ) return SQLI
bc20: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
bc30: 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46  .      iPtr = iF
bc40: 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20  reeBlk;.    }.  
bc50: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69    if( iFreeBlk>i
bc60: 4c 61 73 74 20 29 20 72 65 74 75 72 6e 20 53 51  Last ) 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 61 73 73 65 72 74 28 20 69  T;.    assert( i
bc90: 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20  FreeBlk>iPtr || 
bca0: 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20  iFreeBlk==0 );. 
bcb0: 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73   .    /* At this
bcc0: 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20   point:.    **  
bcd0: 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69    iFreeBlk:   Fi
bce0: 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66  rst freeblock af
bcf0: 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a  ter iStart, or z
bd00: 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20  ero if none.    
bd10: 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20 20  **    iPtr:     
bd20: 20 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66    The address of
bd30: 20 61 20 70 6f 69 6e 74 65 72 20 69 46 72 65 65   a pointer iFree
bd40: 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  Blk.    **.    *
bd50: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
bd60: 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c  f iFreeBlk shoul
bd70: 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f  d be coalesced o
bd80: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69  nto the end of i
bd90: 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  Start..    */.  
bda0: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26    if( iFreeBlk &
bdb0: 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42  & iEnd+3>=iFreeB
bdc0: 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61  lk ){.      nFra
bdd0: 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69  g = iFreeBlk - i
bde0: 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69  End;.      if( i
bdf0: 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72  End>iFreeBlk ) r
be00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
be10: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
be20: 20 69 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b   iEnd = iFreeBlk
be30: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
be40: 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a  a[iFreeBlk+2]);.
be50: 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45        iSize = iE
be60: 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20  nd - iStart;.   
be70: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65     iFreeBlk = ge
be80: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
be90: 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20  eeBlk]);.    }. 
bea0: 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72   .    /* If iPtr
beb0: 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65   is another free
bec0: 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20  block (that is, 
bed0: 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74  if iPtr is not t
bee0: 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20  he freelist.    
bef0: 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ** pointer in th
bf00: 65 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74  e page header) t
bf10: 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65  hen check to see
bf20: 20 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c   if iStart shoul
bf30: 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c  d be.    ** coal
bf40: 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  esced onto the e
bf50: 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20  nd of iPtr..    
bf60: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e  */.    if( iPtr>
bf70: 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69  hdr+1 ){.      i
bf80: 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74  nt iPtrEnd = iPt
bf90: 72 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  r + get2byte(&da
bfa0: 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20  ta[iPtr+2]);.   
bfb0: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33     if( iPtrEnd+3
bfc0: 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  >=iStart ){.    
bfd0: 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e      if( iPtrEnd>
bfe0: 69 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20  iStart ) return 
bff0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
c000: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72  KPT;.        nFr
c010: 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69  ag += iStart - i
c020: 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20  PtrEnd;.        
c030: 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69  iSize = iEnd - i
c040: 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74  Ptr;.        iSt
c050: 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20  art = iPtr;.    
c060: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
c070: 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72  ( nFrag>data[hdr
c080: 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c  +7] ) return SQL
c090: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
c0a0: 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37  ;.    data[hdr+7
c0b0: 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a  ] -= nFrag;.  }.
c0c0: 20 20 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65    if( iStart==ge
c0d0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
c0e0: 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  +5]) ){.    /* T
c0f0: 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
c100: 20 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e   is at the begin
c110: 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c  ning of the cell
c120: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20   content area,. 
c130: 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78     ** so just ex
c140: 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f  tend the cell co
c150: 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65  ntent area rathe
c160: 72 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e  r than create an
c170: 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65  other.    ** fre
c180: 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20  elist entry */. 
c190: 20 20 20 69 66 28 20 69 50 74 72 21 3d 68 64 72     if( iPtr!=hdr
c1a0: 2b 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  +1 ) return SQLI
c1b0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c1c0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
c1d0: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65  ata[hdr+1], iFre
c1e0: 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62  eBlk);.    put2b
c1f0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
c200: 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65  , iEnd);.  }else
c210: 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20  {.    /* Insert 
c220: 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63  the new freebloc
c230: 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c  k into the freel
c240: 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62  ist */.    put2b
c250: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c  yte(&data[iPtr],
c260: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75   iStart);.    pu
c270: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74  t2byte(&data[iSt
c280: 61 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b  art], iFreeBlk);
c290: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
c2a0: 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69  ata[iStart+2], i
c2b0: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  Size);.  }.  pPa
c2c0: 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72  ge->nFree += iOr
c2d0: 69 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  igSize;.  return
c2e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
c2f0: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
c300: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
c310: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
c320: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
c330: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
c340: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
c350: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
c360: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
c370: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ly..**.** Only t
c380: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
c390: 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75  binations are su
c3a0: 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69  pported.  Anythi
c3b0: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
c3c0: 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72  indicates a corr
c3d0: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
c3e0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
c3f0: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a    PTF_ZERODATA.*
c400: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
c410: 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41  RODATA | PTF_LEA
c420: 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  F.**         PTF
c430: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
c440: 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20  INTKEY.**       
c450: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
c460: 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54   PTF_INTKEY | PT
c470: 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63  F_LEAF.*/.static
c480: 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73   int decodeFlags
c490: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
c4a0: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
c4b0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
c4c0: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
c4d0: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
c4e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
c4f0: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
c500: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
c510: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
c520: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
c530: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
c540: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
c550: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75  pPage->leaf = (u
c560: 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b  8)(flagByte>>3);
c570: 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45    assert( PTF_LE
c580: 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20  AF == 1<<3 );.  
c590: 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46  flagByte &= ~PTF
c5a0: 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e  _LEAF;.  pPage->
c5b0: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
c5c0: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  -4*pPage->leaf;.
c5d0: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
c5e0: 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79  Bt;.  if( flagBy
c5f0: 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54  te==(PTF_LEAFDAT
c600: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20  A | PTF_INTKEY) 
c610: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
c620: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  tKey = 1;.    pP
c630: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
c640: 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  = pPage->leaf;. 
c650: 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c     pPage->noPayl
c660: 6f 61 64 20 3d 20 21 70 50 61 67 65 2d 3e 6c 65  oad = !pPage->le
c670: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  af;.    pPage->m
c680: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
c690: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
c6a0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
c6b0: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
c6c0: 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65  lse if( flagByte
c6d0: 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29  ==PTF_ZERODATA )
c6e0: 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  {.    pPage->int
c6f0: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Key = 0;.    pPa
c700: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d  ge->intKeyLeaf =
c710: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   0;.    pPage->n
c720: 6f 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  oPayload = 0;.  
c730: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
c740: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  l = pBt->maxLoca
c750: 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  l;.    pPage->mi
c760: 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
c770: 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b  nLocal;.  }else{
c780: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c790: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c7a0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61  .  }.  pPage->ma
c7b0: 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
c7c0: 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
c7d0: 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  load;.  return S
c7e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c7f0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
c800: 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  e auxiliary info
c810: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69  rmation for a di
c820: 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  sk block..**.** 
c830: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
c840: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
c850: 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65   we see that the
c860: 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   page does.** no
c870: 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c  t contain a well
c880: 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
c890: 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75   page, then retu
c8a0: 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  rn .** SQLITE_CO
c8b0: 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61  RRUPT.  Note tha
c8c0: 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  t a return of SQ
c8d0: 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74  LITE_OK does not
c8e0: 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68  .** guarantee th
c8f0: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77  at the page is w
c900: 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20  ell-formed.  It 
c910: 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a  only shows that.
c920: 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  ** we failed to 
c930: 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75  detect any corru
c940: 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
c950: 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61   int btreeInitPa
c960: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
c970: 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  e){..  assert( p
c980: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
c990: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c9a0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
c9b0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
c9c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
c9d0: 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  ge->pgno==sqlite
c9e0: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
c9f0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
ca00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
ca10: 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  age == sqlite3Pa
ca20: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
ca30: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
ca40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ca50: 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33  aData == sqlite3
ca60: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
ca70: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
ca80: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
ca90: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36  sInit ){.    u16
caa0: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
cab0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
cac0: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
cad0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
cae0: 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20  */.    u8 hdr;  
caf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
cb00: 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67  set to beginning
cb10: 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
cb20: 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b  */.    u8 *data;
cb30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75            /* Equ
cb40: 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61  al to pPage->aDa
cb50: 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72  ta */.    BtShar
cb60: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
cb70: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
cb80: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
cb90: 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a     int usableSiz
cba0: 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20  e;    /* Amount 
cbb0: 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20  of usable space 
cbc0: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
cbd0: 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73      u16 cellOffs
cbe0: 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  et;    /* Offset
cbf0: 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70   from start of p
cc00: 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c  age to first cel
cc10: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
cc20: 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
cc30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
cc40: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e   unused bytes on
cc50: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
cc60: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
cc70: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
cc80: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
cc90: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
cca0: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
ccb0: 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c  ;    /* First al
ccc0: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20  lowable cell or 
ccd0: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
cce0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
ccf0: 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61  lLast;     /* La
cd00: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
cd10: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
cd20: 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74  fset */..    pBt
cd30: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a   = pPage->pBt;..
cd40: 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
cd50: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
cd60: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
cd70: 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63  ata;.    if( dec
cd80: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
cd90: 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74  data[hdr]) ) ret
cda0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
cdb0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
cdc0: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
cdd0: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
cde0: 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
cdf0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  );.    pPage->ma
ce00: 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
ce10: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
ce20: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  );.    pPage->nO
ce30: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
ce40: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
ce50: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
ce60: 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66     pPage->cellOf
ce70: 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  fset = cellOffse
ce80: 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34  t = hdr + 12 - 4
ce90: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
cea0: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e    pPage->aDataEn
ceb0: 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65  d = &data[usable
cec0: 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65  Size];.    pPage
ced0: 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61  ->aCellIdx = &da
cee0: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a  ta[cellOffset];.
cef0: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
cf00: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
cf10: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61  hdr+5]);.    pPa
cf20: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
cf30: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
cf40: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ]);.    if( pPag
cf50: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
cf60: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
cf70: 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20  * To many cells 
cf80: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67  for a single pag
cf90: 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73  e.  The page mus
cfa0: 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a  t be corrupt */.
cfb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
cfc0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
cfd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
cfe0: 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65  case( pPage->nCe
cff0: 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ll==MX_CELL(pBt)
d000: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61   );..    /* A ma
d010: 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  lformed database
d020: 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73   page might caus
d030: 65 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73  e us to read pas
d040: 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a  t the end.    **
d050: 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61   of page when pa
d060: 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a  rsing a cell.  .
d070: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
d080: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
d090: 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73  k of code checks
d0a0: 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66   early to see if
d0b0: 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a   a cell extends.
d0c0: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
d0d0: 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f  end of a page bo
d0e0: 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65  undary and cause
d0f0: 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
d100: 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72   to be .    ** r
d110: 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f  eturned if it do
d120: 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  es..    */.    i
d130: 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c  CellFirst = cell
d140: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
d150: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65  ->nCell;.    iCe
d160: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
d170: 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64 65 66  ize - 4;.#if def
d180: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
d190: 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
d1a0: 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20  _CHECK).    {.  
d1b0: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
d1c0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
d1d0: 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  nto the cell poi
d1e0: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
d1f0: 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20      int sz;     
d200: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
d210: 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20   a cell */..    
d220: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
d230: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d  af ) iCellLast--
d240: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
d250: 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
d260: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
d270: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
d280: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a  ta[cellOffset+i*
d290: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  2]);.        tes
d2a0: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
d2b0: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20  First );.       
d2c0: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
d2d0: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
d2e0: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
d2f0: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
d300: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
d310: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d320: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
d330: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d340: 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
d350: 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70  r(pPage, &data[p
d360: 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  c]);.        tes
d370: 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73  tcase( pc+sz==us
d380: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
d390: 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73      if( pc+sz>us
d3a0: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
d3b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
d3c0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
d3d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d3e0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
d3f0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
d400: 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20  llLast++;.    } 
d410: 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a   .#endif..    /*
d420: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
d430: 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
d440: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
d450: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
d460: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
d470: 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68    nFree = data[h
d480: 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20  dr+7] + top;.   
d490: 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a   while( pc>0 ){.
d4a0: 20 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20        u16 next, 
d4b0: 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  size;.      if( 
d4c0: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
d4d0: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
d4e0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72  .        /* Star
d4f0: 74 20 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b 20  t of free block 
d500: 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20  is off the page 
d510: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
d520: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d530: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
d540: 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
d550: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
d560: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
d570: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
d580: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
d590: 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c  (next>0 && next<
d5a0: 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70  =pc+size+3) || p
d5b0: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
d5c0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
d5d0: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
d5e0: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
d5f0: 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20   order. And the 
d600: 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20  last byte of.   
d610: 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65       ** the free
d620: 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20  -block must lie 
d630: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
d640: 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
d650: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d660: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
d670: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
d680: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
d690: 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65  e;.      pc = ne
d6a0: 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  xt;.    }..    /
d6b0: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
d6c0: 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
d6d0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
d6e0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
d6f0: 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  rt.    ** of the
d700: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
d710: 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62  ea plus the numb
d720: 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
d730: 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74   within.    ** t
d740: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
d750: 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73  area. If this is
d760: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
d770: 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20  e usable-size.  
d780: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
d790: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
d7a0: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
d7b0: 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
d7c0: 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73  so.    ** serves
d7d0: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
d7e0: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
d7f0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
d800: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ell-content.    
d810: 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
d820: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
d830: 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
d840: 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  in the page..   
d850: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65   */.    if( nFre
d860: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
d870: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
d880: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
d890: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  ; .    }.    pPa
d8a0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
d8b0: 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46  )(nFree - iCellF
d8c0: 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65  irst);.    pPage
d8d0: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
d8e0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
d8f0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
d900: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
d910: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
d920: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
d930: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
d940: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
d950: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
d960: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
d970: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
d980: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
d990: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
d9a0: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
d9b0: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
d9c0: 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d  >pBt;.  u8 hdr =
d9d0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
d9e0: 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a  t;.  u16 first;.
d9f0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
da00: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
da10: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
da20: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
da30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
da40: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
da50: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
da60: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
da70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
da80: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
da90: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
daa0: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
dab0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
dac0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
dad0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
dae0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
daf0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
db00: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
db10: 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
db20: 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
db30: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ELETE ){.    mem
db40: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
db50: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
db60: 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20  ze - hdr);.  }. 
db70: 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
db80: 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
db90: 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67  t = hdr + ((flag
dba0: 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
dbb0: 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73   12 : 8);.  mems
dbc0: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
dbd0: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
dbe0: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
dbf0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
dc00: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
dc10: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
dc20: 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74  Free = (u16)(pBt
dc30: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
dc40: 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46  irst);.  decodeF
dc50: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
dc60: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  s);.  pPage->cel
dc70: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
dc80: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
dc90: 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e  nd = &data[pBt->
dca0: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  usableSize];.  p
dcb0: 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
dcc0: 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20   &data[first];. 
dcd0: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
dce0: 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  w = 0;.  assert(
dcf0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
dd00: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
dd10: 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
dd20: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
dd30: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
dd40: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70  geSize - 1);.  p
dd50: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
dd60: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
dd70: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
dd80: 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65  Convert a DbPage
dd90: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74   obtained from t
dda0: 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20  he pager into a 
ddb0: 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a  MemPage used by.
ddc0: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
ddd0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  er..*/.static Me
dde0: 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
ddf0: 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67  FromDbPage(DbPag
de00: 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f  e *pDbPage, Pgno
de10: 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20   pgno, BtShared 
de20: 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
de30: 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
de40: 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
de50: 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
de60: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  );.  pPage->aDat
de70: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
de80: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
de90: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61  ;.  pPage->pDbPa
dea0: 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
deb0: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
dec0: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ;.  pPage->pgno 
ded0: 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d  = pgno;.  pPage-
dee0: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  >hdrOffset = pPa
def0: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
df00: 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  0 : 0;.  return 
df10: 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
df20: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
df30: 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
df40: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
df50: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
df60: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
df70: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
df80: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f  .**.** If the no
df90: 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20  Content flag is 
dfa0: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
dfb0: 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
dfc0: 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
dfd0: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
dfe0: 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
dff0: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
e000: 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
e010: 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
e020: 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
e030: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
e040: 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
e050: 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
e060: 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
e070: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
e080: 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
e090: 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
e0a0: 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
e0b0: 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
e0c0: 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
e0d0: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
e0e0: 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
e0f0: 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
e100: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
e110: 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
e120: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
e130: 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
e140: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
e150: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
e160: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
e170: 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
e180: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
e190: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
e1a0: 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
e1b0: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  eter */.  int fl
e1c0: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
e1d0: 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  * PAGER_GET_NOCO
e1e0: 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47  NTENT or PAGER_G
e1f0: 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29  ET_READONLY */.)
e200: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
e210: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
e220: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
e230: 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  =0 || flags==PAG
e240: 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
e250: 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
e260: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b  _GET_READONLY );
e270: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e280: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
e290: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
e2a0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
e2b0: 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
e2c0: 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
e2d0: 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66  ge**)&pDbPage, f
e2e0: 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20  lags);.  if( rc 
e2f0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
e300: 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  ppPage = btreePa
e310: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
e320: 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
e330: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
e340: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
e350: 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66  etrieve a page f
e360: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
e370: 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75  che. If the requ
e380: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
e390: 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20  t.** already in 
e3a0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
e3b0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69  return NULL. Ini
e3c0: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
e3d0: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
e3e0: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
e3f0: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
e400: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
e410: 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f  ge *btreePageLoo
e420: 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  kup(BtShared *pB
e430: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
e440: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
e450: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e460: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e470: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
e480: 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
e490: 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
e4a0: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
e4b0: 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
e4c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
e4d0: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
e4e0: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
e4f0: 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pBt);.  }.  retu
e500: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
e510: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
e520: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
e530: 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66  ile in pages. If
e540: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
e550: 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20  nd of.** error, 
e560: 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65  return ((unsigne
e570: 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74  d int)-1)..*/.st
e580: 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50  atic Pgno btreeP
e590: 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65  agecount(BtShare
e5a0: 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72  d *pBt){.  retur
e5b0: 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a  n pBt->nPage;.}.
e5c0: 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65  u32 sqlite3Btree
e5d0: 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a  LastPage(Btree *
e5e0: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
e5f0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
e600: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
e610: 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e  ert( ((p->pBt->n
e620: 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29  Page)&0x8000000)
e630: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
e640: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
e650: 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pBt);.}../*.**
e660: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
e670: 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
e680: 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54  nitialize it.  T
e690: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
e6a0: 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69  ust a.** conveni
e6b0: 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f  ence wrapper aro
e6c0: 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c  und separate cal
e6d0: 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ls to btreeGetPa
e6e0: 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72  ge() and .** btr
e6f0: 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a  eeInitPage()..**
e700: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
e710: 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
e720: 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69   value *ppPage i
e730: 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65  s set to is unde
e740: 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79  fined. It.** may
e750: 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
e760: 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  d, or it may be 
e770: 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  set to an invali
e780: 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  d value..*/.stat
e790: 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
e7a0: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
e7b0: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
e7c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e7d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
e7e0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
e7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e800: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
e810: 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
e820: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
e830: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
e840: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
e850: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
e860: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ere */.  int bRe
e870: 61 64 6f 6e 6c 79 20 20 20 20 20 20 20 20 20 20  adonly          
e880: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
e890: 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 6f  R_GET_READONLY o
e8a0: 72 20 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  r 0 */.){.  int 
e8b0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
e8c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
e8d0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
e8e0: 20 20 61 73 73 65 72 74 28 20 62 52 65 61 64 6f    assert( bReado
e8f0: 6e 6c 79 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52  nly==PAGER_GET_R
e900: 45 41 44 4f 4e 4c 59 20 7c 7c 20 62 52 65 61 64  EADONLY || bRead
e910: 6f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  only==0 );..  if
e920: 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  ( pgno>btreePage
e930: 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
e940: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
e950: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65  RRUPT_BKPT;.  }e
e960: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  lse{.    rc = bt
e970: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
e980: 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 52  pgno, ppPage, bR
e990: 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 69 66  eadonly);.    if
e9a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e9b0: 26 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73  && (*ppPage)->is
e9c0: 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Init==0 ){.     
e9d0: 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
e9e0: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
e9f0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ea00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
ea10: 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
ea20: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
ea30: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74     }.  }..  test
ea40: 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
ea50: 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
ea60: 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
ea70: 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
ea80: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ea90: 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
eaa0: 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
eab0: 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
eac0: 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
ead0: 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
eae0: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
eaf0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
eb00: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
eb10: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
eb20: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
eb30: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
eb40: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
eb50: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
eb60: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62  sert( pPage->pDb
eb70: 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61  Page!=0 );.    a
eb80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
eb90: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
eba0: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
ebb0: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
ebc0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
ebd0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
ebe0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
ebf0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
ec00: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
ec10: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
ec20: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
ec30: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
ec40: 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
ec50: 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  l(pPage->pDbPage
ec60: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
ec70: 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
ec80: 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
ec90: 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
eca0: 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
ecb0: 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
ecc0: 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
ecd0: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
ece0: 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
ecf0: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
ed00: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
ed10: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
ed20: 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
ed30: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
ed40: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ed50: 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
ed60: 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
ed70: 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
ed80: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
ed90: 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
eda0: 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
edb0: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
edc0: 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
edd0: 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
ede0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
edf0: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
ee00: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
ee10: 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
ee20: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ee30: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
ee40: 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
ee50: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
ee60: 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
ee70: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ee80: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
ee90: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
eea0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
eeb0: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
eec0: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
eed0: 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
eee0: 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
eef0: 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
ef00: 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
ef10: 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
ef20: 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
ef30: 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
ef40: 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
ef50: 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
ef60: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
ef70: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
ef80: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
ef90: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
efa0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
efb0: 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
efc0: 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
efd0: 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
efe0: 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
eff0: 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
f000: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
f010: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
f020: 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
f030: 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
f040: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
f050: 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
f060: 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
f070: 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
f080: 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
f090: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
f0a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
f0b0: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
f0c0: 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
f0d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
f0e0: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
f0f0: 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
f100: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
f110: 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
f120: 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
f130: 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
f140: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
f150: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
f160: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
f170: 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
f180: 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
f190: 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
f1a0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
f1b0: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
f1c0: 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
f1d0: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
f1e0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
f1f0: 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
f200: 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
f210: 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
f220: 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
f230: 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
f240: 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
f250: 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
f260: 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
f270: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
f280: 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
f290: 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
f2a0: 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
f2b0: 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
f2c0: 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
f2d0: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
f2e0: 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
f2f0: 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
f300: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
f310: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
f320: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
f330: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
f340: 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
f350: 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
f360: 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
f370: 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
f380: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
f390: 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
f3a0: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
f3b0: 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
f3c0: 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54   bits like.** BT
f3d0: 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
f3e0: 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45   and/or BTREE_ME
f3f0: 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  MORY..**.** If t
f400: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
f410: 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
f420: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
f430: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
f440: 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
f450: 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
f460: 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
f470: 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
f480: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
f490: 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
f4a0: 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
f4b0: 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
f4c0: 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
f4d0: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
f4e0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
f4f0: 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
f500: 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
f510: 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
f520: 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
f530: 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
f540: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
f550: 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74  s,      /* VFS t
f560: 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
f570: 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  -tree */.  const
f580: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
f590: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
f5a0: 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
f5b0: 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
f5c0: 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
f5d0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
f5e0: 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
f5f0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
f600: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
f610: 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
f620: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
f630: 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
f640: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
f650: 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
f660: 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
f670: 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
f680: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
f690: 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
f6a0: 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
f6b0: 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
f6c0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
f6d0: 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
f6e0: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
f6f0: 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
f700: 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
f710: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
f720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
f730: 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
f740: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f750: 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
f760: 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
f770: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
f780: 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
f790: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f7a0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
f7b0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
f7c0: 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
f7d0: 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
f7e0: 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
f7f0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
f800: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
f810: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
f820: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
f830: 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
f840: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
f850: 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
f860: 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e   /* True if open
f870: 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
f880: 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  , temporary data
f890: 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
f8a0: 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a  int isTempDb = z
f8b0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
f8c0: 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a  Filename[0]==0;.
f8d0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
f8e0: 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
f8f0: 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
f900: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
f910: 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
f920: 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
f930: 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
f940: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
f950: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63  MIT_MEMORYDB.  c
f960: 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
f970: 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
f980: 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
f990: 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  = (zFilename && 
f9a0: 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
f9b0: 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  , ":memory:")==0
f9c0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
f9d0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54           || (isT
f9e0: 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33  empDb && sqlite3
f9f0: 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
fa00: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
fa10: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73           || (vfs
fa20: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
fa30: 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
fa40: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
fa50: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
fa60: 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
fa70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
fa80: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
fa90: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
faa0: 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
fab0: 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
fac0: 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
fad0: 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
fae0: 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
faf0: 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
fb00: 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
fb10: 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
fb20: 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
fb30: 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
fb40: 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
fb50: 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
fb60: 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
fb70: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
fb80: 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
fb90: 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
fba0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
fbb0: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
fbc0: 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
fbd0: 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  pDb );..  if( is
fbe0: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
fbf0: 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
fc00: 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
fc10: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
fc20: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
fc30: 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
fc40: 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
fc50: 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
fc60: 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
fc70: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
fc80: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
fc90: 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
fca0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
fcb0: 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
fcc0: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
fcd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fce0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
fcf0: 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
fd00: 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
fd10: 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
fd20: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
fd30: 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
fd40: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
fd50: 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
fd60: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
fd70: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
fd80: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
fd90: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
fda0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
fdb0: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
fdc0: 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
fdd0: 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
fde0: 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
fdf0: 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
fe00: 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
fe10: 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
fe20: 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
fe30: 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62  /.  if( isTempDb
fe40: 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d  ==0 && (isMemdb=
fe50: 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26  =0 || (vfsFlags&
fe60: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
fe70: 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0) ){.    if( 
fe80: 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
fe90: 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
fea0: 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
feb0: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
fec0: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
fed0: 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
fee0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
fef0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46  sqlite3Malloc(nF
ff00: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
ff10: 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
ff20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
ff30: 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20  mutexShared; ). 
ff40: 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
ff50: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
ff60: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
ff70: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ff80: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
ff90: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ffa0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
ffb0: 20 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64        if( isMemd
ffc0: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  b ){.        mem
ffd0: 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cpy(zFullPathnam
ffe0: 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71  e, zFilename, sq
fff0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
10000 69 6c 65 6e 61 6d 65 29 2b 31 29 3b 0a 20 20 20  ilename)+1);.   
10010 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10020 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10030 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
10040 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  s, zFilename,.  
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10070 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   nFullPathname, 
10080 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
10090 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
100a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
100b0 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
100c0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
100d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
100e0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
100f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
10100 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53   }.      }.#if S
10110 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
10120 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
10130 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
10140 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
10150 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
10160 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
10170 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
10180 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
10190 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
101a0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
101b0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
101c0 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
101d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
101e0 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
101f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f  .#endif.      fo
10200 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53  r(pBt=GLOBAL(BtS
10210 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
10220 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20  aredCacheList); 
10230 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e  pBt; pBt=pBt->pN
10240 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ext){.        as
10250 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
10260 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
10270 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c   0==strcmp(zFull
10280 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Pathname, sqlite
10290 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
102a0 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a  Bt->pPager, 0)).
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
102d0 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Vfs(pBt->pPager)
102e0 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ==pVfs ){.      
102f0 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
10300 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64         for(iDb=d
10310 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30  b->nDb-1; iDb>=0
10320 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  ; iDb--){.      
10330 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78        Btree *pEx
10340 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62  isting = db->aDb
10350 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
10360 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73         if( pExis
10370 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e  ting && pExistin
10380 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20  g->pBt==pBt ){. 
10390 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
103a0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
103b0 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
103d0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
103e0 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
103f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
10400 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
10410 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
10420 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
10430 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
10440 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10450 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
10460 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
10470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10480 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
10490 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e  .          pBt->
104a0 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
104b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
104c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
104d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
104e0 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
104f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10500 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
10510 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ame);.    }.#ifd
10520 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
10530 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
10540 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65  /* In debug mode
10550 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65  , we mark all pe
10560 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73  rsistent databas
10570 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20  es as sharable. 
10580 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65       ** even whe
10590 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20  n they are not. 
105a0 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20   This exercises 
105b0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65  the locking code
105c0 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69   and.      ** gi
105d0 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75  ves more opportu
105e0 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73  nity for asserts
105f0 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68  (sqlite3_mutex_h
10600 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20  eld()).      ** 
10610 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69  statements to fi
10620 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c  nd locking probl
10630 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ems..      */.  
10640 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
10650 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
10660 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
10670 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
10680 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
10690 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
106a0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
106b0 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
106c0 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65  by the btree are
106d0 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
106e0 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73  t size.  This is
106f0 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
10700 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74  t size changes t
10710 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  hat result.    *
10720 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
10730 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
10740 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
10750 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
10760 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20   sizeof(i64)==8 
10770 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  || sizeof(i64)==
10780 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
10790 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
107a0 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  || sizeof(u64)==
107b0 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
107c0 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
107d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
107e0 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b  izeof(u16)==2 );
107f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
10800 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a  eof(Pgno)==4 );.
10810 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c    .    pBt = sql
10820 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
10830 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a  sizeof(*pBt) );.
10840 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29      if( pBt==0 )
10850 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
10860 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
10870 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
10880 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
10890 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
108a0 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
108b0 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
108c0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
108d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
108e0 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73  XTRA_SIZE, flags
108f0 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65  , vfsFlags, page
10900 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  Reinit);.    if(
10910 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10920 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
10930 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
10940 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62  (pBt->pPager, db
10950 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20  ->szMmap);.     
10960 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
10970 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
10980 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
10990 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
109a0 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
109b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
109c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
109d0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
109e0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
109f0 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  Bt->openFlags = 
10a00 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70  (u8)flags;.    p
10a10 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  Bt->db = db;.   
10a20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
10a30 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d  Busyhandler(pBt-
10a40 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e  >pPager, btreeIn
10a50 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c  vokeBusyHandler,
10a60 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42   pBt);.    p->pB
10a70 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
10a80 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  pBt->pCursor = 0
10a90 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
10aa0 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  1 = 0;.    if( s
10ab0 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
10ac0 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
10ad0 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  r) ) pBt->btsFla
10ae0 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
10af0 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  NLY;.#ifdef SQLI
10b00 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
10b10 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
10b20 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
10b30 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a  _DELETE;.#endif.
10b40 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
10b50 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31  e = (zDbHeader[1
10b60 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61  6]<<8) | (zDbHea
10b70 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  der[17]<<16);.  
10b80 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
10b90 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e  ize<512 || pBt->
10ba0 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
10bb0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20  MAX_PAGE_SIZE.  
10bc0 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d         || ((pBt-
10bd0 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74  >pageSize-1)&pBt
10be0 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29  ->pageSize)!=0 )
10bf0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  {.      pBt->pag
10c00 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eSize = 0;.#ifnd
10c10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
10c20 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
10c30 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20  /* If the magic 
10c40 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
10c50 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69  will create an i
10c60 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
10c70 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  e, then.      **
10c80 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
10c90 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
10ca0 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
10cb0 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
10cc0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45      ** SQLITE_DE
10cd0 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
10ce0 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
10cf0 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a   other hand, if.
10d00 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
10d10 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61  OMIT_MEMORYDB ha
10d20 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20  s been defined, 
10d30 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  then ":memory:" 
10d40 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20  is just a.      
10d50 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
10d60 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
10d70 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
10d80 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
10d90 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20  r normal..      
10da0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  */.      if( zFi
10db0 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
10dc0 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  db ){.        pB
10dd0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
10de0 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
10df0 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a  AUTOVACUUM ? 1 :
10e00 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
10e10 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
10e20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
10e30 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31  UTOVACUUM==2 ? 1
10e40 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23   : 0);.      }.#
10e50 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73  endif.      nRes
10e60 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erve = 0;.    }e
10e70 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65  lse{.      nRese
10e80 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
10e90 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  20];.      pBt->
10ea0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
10eb0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
10ec0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10ed0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
10ee0 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
10ef0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
10f00 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
10f10 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
10f20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
10f30 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
10f40 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37  zDbHeader[36 + 7
10f50 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
10f60 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  f.    }.    rc =
10f70 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
10f80 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
10f90 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
10fa0 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
10fb0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
10fc0 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
10fd0 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  t;.    pBt->usab
10fe0 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
10ff0 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
11000 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
11010 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20  pBt->pageSize & 
11020 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62  7)==0 );  /* 8-b
11030 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  yte alignment of
11040 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20   pageSize */.   
11050 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
11060 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
11070 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
11080 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
11090 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
110a0 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
110b0 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
110c0 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
110d0 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
110e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
110f0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
11100 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
11110 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
11120 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29   *mutexShared; )
11130 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  .      pBt->nRef
11140 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45   = 1;.      MUTE
11150 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68  X_LOGIC( mutexSh
11160 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
11170 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
11180 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
11190 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28  TER);).      if(
111a0 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
111b0 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f  FE && sqlite3Glo
111c0 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
111d0 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
111e0 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
111f0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
11200 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
11210 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
11220 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  Bt->mutex==0 ){.
11230 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
11240 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
11250 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f         db->mallo
11260 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20  cFailed = 0;.   
11270 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
11280 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
11290 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
112a0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
112b0 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
112c0 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
112d0 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
112e0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
112f0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
11300 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
11310 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
11320 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
11330 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
11340 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
11350 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
11360 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
11370 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
11380 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
11390 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
113a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
113b0 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
113c0 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
113d0 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
113e0 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
113f0 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
11400 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
11410 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
11420 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
11430 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
11440 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
11450 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
11460 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
11470 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
11480 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
11490 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
114a0 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
114b0 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
114c0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
114d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
114e0 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
114f0 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
11500 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
11510 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
11520 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
11530 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
11540 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
11550 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b  pBt<pSib->pBt ){
11560 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
11570 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  ext = pSib;.    
11580 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
11590 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   0;.          pS
115a0 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  ib->pPrev = p;. 
115b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
115c0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
115d0 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53  Sib->pNext && pS
115e0 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70  ib->pNext->pBt<p
115f0 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
11600 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
11610 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
11620 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
11630 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
11640 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
11650 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
11660 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
11670 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
11680 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
11690 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
116a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
116b0 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
116c0 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
116d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
116e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
116f0 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
11700 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
11710 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
11720 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11730 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
11740 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
11750 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
11760 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
11770 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
11780 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
11790 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
117a0 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
117b0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
117c0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54     /* If the B-T
117d0 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ree was successf
117e0 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74  ully opened, set
117f0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
11800 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20   size to the.   
11810 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
11820 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20  e. Except, when 
11830 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78  opening on an ex
11840 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61  isting shared pa
11850 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a  ger-cache,.    *
11860 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  * do not change 
11870 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
11880 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
11890 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
118a0 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29  eSchema(p, 0, 0)
118b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
118c0 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
118d0 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50  esize(p->pBt->pP
118e0 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46  ager, SQLITE_DEF
118f0 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
11900 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
11910 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
11920 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
11930 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
11940 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
11950 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
11960 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
11970 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
11990 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
119a0 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
119b0 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
119c0 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
119d0 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
119e0 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
119f0 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
11a00 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
11a10 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
11a20 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
11a30 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
11a40 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
11a50 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
11a60 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
11a70 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
11a80 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
11a90 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
11aa0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
11ab0 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45  RED_CACHE.  MUTE
11ac0 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
11ad0 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
11ae0 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70   ).  BtShared *p
11af0 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f  List;.  int remo
11b00 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ved = 0;..  asse
11b10 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11b20 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d  x_notheld(pBt->m
11b30 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58  utex) );.  MUTEX
11b40 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20  _LOGIC( pMaster 
11b50 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
11b60 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
11b70 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
11b80 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
11b90 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
11ba0 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
11bb0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
11bc0 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
11bd0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
11be0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
11bf0 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
11c00 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
11c10 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
11c20 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
11c30 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
11c40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
11c50 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
11c60 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
11c70 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
11c80 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
11c90 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
11ca0 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
11cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
11cc0 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
11cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
11ce0 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
11cf0 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
11d00 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
11d10 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
11d20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
11d30 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
11d40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
11d50 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
11d60 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
11d70 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
11d80 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
11d90 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
11da0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
11db0 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
11dc0 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
11dd0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
11de0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
11df0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
11e00 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
11e10 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
11e20 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62  bytes with a 4-b
11e30 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61  yte prefix for a
11e40 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70   left-child.** p
11e50 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
11e60 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54  c void allocateT
11e70 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
11e80 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21  d *pBt){.  if( !
11e90 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
11ea0 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
11eb0 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
11ec0 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
11ed0 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  ageSize );..    
11ee0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73  /* One of the us
11ef0 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53  es of pBt->pTmpS
11f00 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61  pace is to forma
11f10 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20  t cells before. 
11f20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20     ** inserting 
11f30 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66  them into a leaf
11f40 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20   page (function 
11f50 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49  fillInCell()). I
11f60 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20  f.    ** a cell 
11f70 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  is less than 4 b
11f80 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74  ytes in size, it
11f90 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74   is rounded up t
11fa0 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a  o 4 bytes.    **
11fb0 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20   by the various 
11fc0 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61  routines that ma
11fd0 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20  nipulate binary 
11fe0 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20  cells. Which.   
11ff0 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61   ** can mean tha
12000 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  t fillInCell() o
12010 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  nly initializes 
12020 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33  the first 2 or 3
12030 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
12040 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20   pTmpSpace, but 
12050 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34  that the first 4
12060 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65   bytes are copie
12070 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74  d from.    ** it
12080 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65   into a database
12090 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e   page. This is n
120a0 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72  ot actually a pr
120b0 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20  oblem, but it.  
120c0 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20    ** does cause 
120d0 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  a valgrind error
120e0 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32   when the 1 or 2
120f0 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61   bytes of unitia
12100 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61  lized .    ** da
12110 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ta is passed to 
12120 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74  system call writ
12130 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64  e(). So to avoid
12140 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20   this error,.   
12150 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72   ** zero the fir
12160 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65  st 4 bytes of te
12170 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20  mp space here.. 
12180 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
12190 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72  o:  Provide four
121a0 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61   bytes of initia
121b0 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f  lized space befo
121c0 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65  re the.    ** be
121d0 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53  ginning of pTmpS
121e0 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20  pace as an area 
121f0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65  available to pre
12200 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20  pend the.    ** 
12210 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  left-child point
12220 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  er to the beginn
12230 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20  ing of a cell.. 
12240 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42     */.    if( pB
12250 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
12260 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74        memset(pBt
12270 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20  ->pTmpSpace, 0, 
12280 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  8);.      pBt->p
12290 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20  TmpSpace += 4;. 
122a0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
122b0 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
122c0 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
122d0 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
122e0 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
122f0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
12300 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d  {.  if( pBt->pTm
12310 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
12320 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20  t->pTmpSpace -= 
12330 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  4;.    sqlite3Pa
12340 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70  geFree(pBt->pTmp
12350 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d  Space);.    pBt-
12360 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
12370 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
12380 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
12390 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
123a0 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
123b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
123c0 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
123d0 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
123e0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
123f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
12400 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
12410 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
12420 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
12430 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
12440 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12450 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
12460 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12470 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
12480 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
12490 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
124a0 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
124b0 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
124c0 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
124d0 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
124e0 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
124f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
12500 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
12510 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
12520 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
12530 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
12540 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
12550 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
12560 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
12570 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
12580 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
12590 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
125a0 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
125b0 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
125c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
125d0 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54  ollback(p, SQLIT
125e0 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33  E_OK);.  sqlite3
125f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a  BtreeLeave(p);..
12600 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
12610 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75  e still other ou
12620 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
12630 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72  nces to the shar
12640 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74  ed-btree.  ** st
12650 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20  ructure, return 
12660 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64  now. The remaind
12670 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  er of this proce
12680 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a  dure cleans .  *
12690 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d  * up the shared-
126a0 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  btree..  */.  as
126b0 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c  sert( p->wantToL
126c0 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63  ock==0 && p->loc
126d0 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
126e0 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20  !p->sharable || 
126f0 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
12700 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20  gList(pBt) ){.  
12710 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20    /* The pBt is 
12720 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65  no longer on the
12730 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73   sharing list, s
12740 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a  o we can access.
12750 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75      ** it withou
12760 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64  t having to hold
12770 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20   the mutex..    
12780 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20  **.    ** Clean 
12790 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74  out and delete t
127a0 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  he BtShared obje
127b0 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ct..    */.    a
127c0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
127d0 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69  rsor );.    sqli
127e0 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
127f0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
12800 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63  if( pBt->xFreeSc
12810 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63  hema && pBt->pSc
12820 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42  hema ){.      pB
12830 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70  t->xFreeSchema(p
12840 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
12850 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
12860 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53  bFree(0, pBt->pS
12870 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65  chema);.    free
12880 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
12890 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
128a0 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  (pBt);.  }..#ifn
128b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
128c0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61  SHARED_CACHE.  a
128d0 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
128e0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Lock==0 );.  ass
128f0 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  ert( p->locked==
12900 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  0 );.  if( p->pP
12910 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e  rev ) p->pPrev->
12920 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
12930 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  ;.  if( p->pNext
12940 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72   ) p->pNext->pPr
12950 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23  ev = p->pPrev;.#
12960 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
12970 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75  _free(p);.  retu
12980 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12990 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
129a0 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  e limit on the n
129b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61  umber of pages a
129c0 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61  llowed in the ca
129d0 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  che..**.** The m
129e0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
129f0 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20   cache pages is 
12a00 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c  set to the absol
12a10 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  ute.** value of 
12a20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61  mxPage.  If mxPa
12a30 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
12a40 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a  the pager will.*
12a50 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68  * operate asynch
12a60 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69  ronously - it wi
12a70 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64  ll not stop to d
12a80 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f  o fsync()s.** to
12a90 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20   insure data is 
12aa0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
12ab0 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f  isk surface befo
12ac0 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67  re.** continuing
12ad0 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20  .  Transactions 
12ae0 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79  still work if sy
12af0 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
12b00 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ,.** and the dat
12b10 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
12b20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69  corrupted if thi
12b30 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61  s program.** cra
12b40 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68  shes.  But if th
12b50 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
12b60 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68  em crashes or th
12b70 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72  ere is.** an abr
12b80 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72  upt power failur
12b90 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f  e when synchrono
12ba0 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64  us is off, the d
12bb0 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64  atabase.** could
12bc0 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
12bd0 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20  nconsistent and 
12be0 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74  unrecoverable st
12bf0 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e  ate..** Synchron
12c00 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66  ous is on by def
12c10 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65  ault so database
12c20 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e   corruption is n
12c30 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61  ot.** normally a
12c40 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73   worry..*/.int s
12c50 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
12c60 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  cheSize(Btree *p
12c70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
12c80 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12c90 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
12ca0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12cb0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
12cc0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
12cd0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
12ce0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
12cf0 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70  Cachesize(pBt->p
12d00 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
12d10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12d20 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
12d30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
12d40 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
12d50 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20  AP_SIZE>0./*.** 
12d60 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
12d70 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   on the amount o
12d80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
12d90 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a  ile that may be.
12da0 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  ** memory mapped
12db0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12dc0 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69  BtreeSetMmapLimi
12dd0 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69  t(Btree *p, sqli
12de0 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70  te3_int64 szMmap
12df0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
12e00 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
12e10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12e20 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
12e30 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
12e40 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
12e50 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
12e60 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
12e70 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61  t->pPager, szMma
12e80 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
12e90 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
12ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12eb0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12ec0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
12ed0 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  >0 */../*.** Cha
12ee0 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61  nge the way data
12ef0 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69   is synced to di
12f00 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  sk in order to i
12f10 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65  ncrease or decre
12f20 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20  ase.** how well 
12f30 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73  the database res
12f40 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20  ists damage due 
12f50 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e  to OS crashes an
12f60 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  d power.** failu
12f70 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73  res.  Level 1 is
12f80 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79   the same as asy
12f90 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79  nchronous (no sy
12fa0 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a  ncs() occur and.
12fb0 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69  ** there is a hi
12fc0 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  gh probability o
12fd0 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c  f damage)  Level
12fe0 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c   2 is the defaul
12ff0 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20  t.  There.** is 
13000 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e  a very low but n
13010 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c  on-zero probabil
13020 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20  ity of damage.  
13030 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20  Level 3 reduces 
13040 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69  the.** probabili
13050 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20  ty of damage to 
13060 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69  near zero but wi
13070 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f  th a write perfo
13080 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
13090 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
130a0 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
130b0 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74  RAGMAS.int sqlit
130c0 65 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46  e3BtreeSetPagerF
130d0 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70  lags(.  Btree *p
130e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
130f0 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 73  * The btree to s
13100 65 74 20 74 68 65 20 73 61 66 65 74 79 20 6c 65  et the safety le
13110 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69  vel on */.  unsi
13120 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20  gned pgFlags    
13130 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41     /* Various PA
13140 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29  GER_* flags */.)
13150 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
13160 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
13170 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
13180 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
13190 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
131a0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
131b0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
131c0 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50  SetFlags(pBt->pP
131d0 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a  ager, pgFlags);.
131e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
131f0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
13200 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
13210 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
13220 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
13230 69 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65  iven btree is se
13240 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65  t to safety leve
13250 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a  l 1.  In other.*
13260 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  * words, return 
13270 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28  TRUE if no sync(
13280 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20  ) occurs on the 
13290 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69  disk files..*/.i
132a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
132b0 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65  yncDisabled(Btre
132c0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
132d0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
132e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
132f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
13300 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
13310 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c  utex) );  .  sql
13320 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
13330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
13340 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
13350 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
13360 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74  3PagerNosync(pBt
13370 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c  ->pPager);.  sql
13380 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
13390 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
133a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
133b0 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
133c0 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e  s size and the n
133d0 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
133e0 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  d bytes per page
133f0 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20  ..** Or, if the 
13400 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c  page size has al
13410 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64  ready been fixed
13420 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
13430 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74  READONLY .** wit
13440 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e  hout changing an
13450 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ything..**.** Th
13460 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74  e page size must
13470 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
13480 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
13490 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20   65536.  If the 
134a0 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70  page.** size sup
134b0 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d  plied does not m
134c0 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61  eet this constra
134d0 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67  int then the pag
134e0 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a  e size is not.**
134f0 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20   changed..**.** 
13500 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63  Page sizes are c
13510 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65  onstrained to be
13520 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20   a power of two 
13530 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69  so that the regi
13540 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  on.** of the dat
13550 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20  abase file used 
13560 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67  for locking (beg
13570 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e  inning at PENDIN
13580 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66  G_BYTE,.** the f
13590 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
135a0 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c  he 1GB boundary,
135b0 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65   0x40000000) nee
135c0 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61  ds to occur.** a
135d0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
135e0 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  of a page..**.**
135f0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52   If parameter nR
13600 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74  eserve is less t
13610 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
13620 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
13630 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70  erved.** bytes p
13640 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  er page is left 
13650 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
13660 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20   If the iFix!=0 
13670 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47  then the BTS_PAG
13680 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67  ESIZE_FIXED flag
13690 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20   is set so that 
136a0 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a  the page size.**
136b0 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20   and autovacuum 
136c0 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  mode can no long
136d0 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a  er be changed..*
136e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
136f0 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeSetPageSize(Bt
13700 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65  ree *p, int page
13710 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
13720 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20  ve, int iFix){. 
13730 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13740 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  _OK;.  BtShared 
13750 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
13760 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
13770 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76  e>=-1 && nReserv
13780 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69  e<=255 );.  sqli
13790 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
137a0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ;.  if( pBt->bts
137b0 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45  Flags & BTS_PAGE
137c0 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20  SIZE_FIXED ){.  
137d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
137e0 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
137f0 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
13800 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  LY;.  }.  if( nR
13810 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20  eserve<0 ){.    
13820 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e  nReserve = pBt->
13830 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
13840 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a  usableSize;.  }.
13850 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
13860 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76  ve>=0 && nReserv
13870 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20  e<=255 );.  if( 
13880 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
13890 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
138a0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
138b0 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67  &&.        ((pag
138c0 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
138d0 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  e)==0 ){.    ass
138e0 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
138f0 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73   7)==0 );.    as
13900 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67  sert( !pBt->pPag
13910 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72  e1 && !pBt->pCur
13920 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  sor );.    pBt->
13930 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29  pageSize = (u32)
13940 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72  pageSize;.    fr
13950 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
13960 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
13970 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
13980 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
13990 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
139a0 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70  , nReserve);.  p
139b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
139c0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
139d0 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a   (u16)nReserve;.
139e0 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42 74    if( iFix ) pBt
139f0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
13a00 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
13a10 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13a20 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
13a30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13a40 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
13a50 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67  ntly defined pag
13a60 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71  e size.*/.int sq
13a70 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
13a80 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b  eSize(Btree *p){
13a90 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
13aa0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23  ->pageSize;.}..#
13ab0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
13ac0 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 7c 7c 20  E_HAS_CODEC) || 
13ad0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
13ae0 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73  EBUG)./*.** This
13af0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d   function is sim
13b00 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42  ilar to sqlite3B
13b10 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28 29  treeGetReserve()
13b20 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  , except that it
13b30 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  .** may only be 
13b40 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20  called if it is 
13b50 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
13b60 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78  the b-tree mutex
13b70 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68   is already.** h
13b80 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  eld..**.** This 
13b90 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65  is useful in one
13ba0 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e   special case in
13bb0 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20   the backup API 
13bc0 63 6f 64 65 20 77 68 65 72 65 20 69 74 20 69 73  code where it is
13bd0 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74  .** known that t
13be0 68 65 20 73 68 61 72 65 64 20 62 2d 74 72 65 65  he shared b-tree
13bf0 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20   mutex is held, 
13c00 62 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e  but the mutex on
13c10 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
13c20 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
13c30 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e  ns *p is not. In
13c40 20 74 68 69 73 20 63 61 73 65 20 69 66 20 73 71   this case if sq
13c50 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
13c60 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20  ).** were to be 
13c70 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74  called, it might
13c80 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f   collide with so
13c90 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69  me other operati
13ca0 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  on on the.** dat
13cb0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61  abase handle tha
13cc0 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69  t owns *p, causi
13cd0 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68  ng undefined beh
13ce0 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  avior..*/.int sq
13cf0 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
13d00 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65  erveNoMutex(Btre
13d10 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
13d20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
13d30 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65  eld(p->pBt->mute
13d40 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  x) );.  return p
13d50 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ->pBt->pageSize 
13d60 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  - p->pBt->usable
13d70 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Size;.}.#endif /
13d80 2a 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  * SQLITE_HAS_COD
13d90 45 43 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 42  EC || SQLITE_DEB
13da0 55 47 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  UG */..#if !defi
13db0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13dc0 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c  PAGER_PRAGMAS) |
13dd0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
13de0 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f  E_OMIT_VACUUM)./
13df0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
13e00 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
13e10 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20  of space at the 
13e20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  end of every pag
13e30 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e  e that.** are in
13e40 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75  tentually left u
13e50 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20  nused.  This is 
13e60 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73  the "reserved" s
13e70 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  pace that is.** 
13e80 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62  sometimes used b
13e90 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f  y extensions..*/
13ea0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13eb0 65 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65  eGetReserve(Btre
13ec0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  e *p){.  int n;.
13ed0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
13ee0 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d  ter(p);.  n = p-
13ef0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  >pBt->pageSize -
13f00 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53   p->pBt->usableS
13f10 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ize;.  sqlite3Bt
13f20 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
13f30 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
13f40 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75  * Set the maximu
13f50 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72  m page count for
13f60 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d   a database if m
13f70 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
13f80 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73  e..** No changes
13f90 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50   are made if mxP
13fa0 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61  age is 0 or nega
13fb0 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c  tive..** Regardl
13fc0 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
13fd0 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
13fe0 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  rn the maximum p
13ff0 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
14000 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61  t sqlite3BtreeMa
14010 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65  xPageCount(Btree
14020 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
14030 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
14040 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
14050 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
14060 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
14070 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  t(p->pBt->pPager
14080 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
14090 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
140a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
140b0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
140c0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
140d0 45 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61  E flag if newFla
140e0 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66  g is 0 or 1.  If
140f0 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a   newFlag is -1,.
14100 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20  ** then make no 
14110 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73  changes.  Always
14120 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   return the valu
14130 65 20 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43  e of the BTS_SEC
14140 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65  URE_DELETE.** se
14150 74 74 69 6e 67 20 61 66 74 65 72 20 74 68 65 20  tting after the 
14160 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73  change..*/.int s
14170 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72  qlite3BtreeSecur
14180 65 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70  eDelete(Btree *p
14190 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a  , int newFlag){.
141a0 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70    int b;.  if( p
141b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
141c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
141d0 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65  ter(p);.  if( ne
141e0 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20  wFlag>=0 ){.    
141f0 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
14200 20 26 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f   &= ~BTS_SECURE_
14210 44 45 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20  DELETE;.    if( 
14220 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74  newFlag ) p->pBt
14230 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
14240 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
14250 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e  .  } .  b = (p->
14260 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
14270 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
14280 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  E)!=0;.  sqlite3
14290 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
142a0 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e   return b;.}.#en
142b0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
142c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
142d0 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
142e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
142f0 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f  IT_VACUUM) */../
14300 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
14310 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
14320 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61  operty of the da
14330 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27  tabase. If the '
14340 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70  autoVacuum'.** p
14350 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
14360 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d  zero, then auto-
14370 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65  vacuum mode is e
14380 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c  nabled. If zero,
14390 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c   it.** is disabl
143a0 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  ed. The default 
143b0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75  value for the au
143c0 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72  to-vacuum proper
143d0 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d  ty is .** determ
143e0 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  ined by the SQLI
143f0 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
14400 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  ACUUM macro..*/.
14410 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
14420 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  SetAutoVacuum(Bt
14430 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f  ree *p, int auto
14440 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20  Vacuum){.#ifdef 
14450 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
14460 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
14470 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
14480 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65  .#else.  BtShare
14490 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
144a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
144b0 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d  TE_OK;.  u8 av =
144c0 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b   (u8)autoVacuum;
144d0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
144e0 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
144f0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
14500 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
14510 58 45 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f  XED)!=0 && (av ?
14520 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56  1:0)!=pBt->autoV
14530 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
14540 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
14550 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
14560 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
14570 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70  = av ?1:0;.    p
14580 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
14590 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d   av==2 ?1:0;.  }
145a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
145b0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
145c0 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
145d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
145e0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61   value of the 'a
145f0 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
14600 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61  erty. If auto-va
14610 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62  cuum is .** enab
14620 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65  led 1 is returne
14630 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a  d. Otherwise 0..
14640 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
14650 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d  reeGetAutoVacuum
14660 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64  (Btree *p){.#ifd
14670 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
14680 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
14690 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43  rn BTREE_AUTOVAC
146a0 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a  UUM_NONE;.#else.
146b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
146c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
146d0 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28  ;.  rc = (.    (
146e0 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  !p->pBt->autoVac
146f0 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
14700 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20  ACUUM_NONE:.    
14710 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61  (!p->pBt->incrVa
14720 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
14730 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20  VACUUM_FULL:.   
14740 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
14750 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71  M_INCR.  );.  sq
14760 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
14770 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
14780 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
14790 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63  * Get a referenc
147a0 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74  e to pPage1 of t
147b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
147c0 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20  .  This will.** 
147d0 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72  also acquire a r
147e0 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20  eadlock on that 
147f0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  file..**.** SQLI
14800 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
14810 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  d on success.  I
14820 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  f the file is no
14830 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d  t a.** well-form
14840 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
14850 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f  , then SQLITE_CO
14860 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65  RRUPT is returne
14870 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  d..** SQLITE_BUS
14880 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  Y is returned if
14890 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
148a0 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45   locked.  SQLITE
148b0 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74  _NOMEM.** is ret
148c0 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20  urned if we run 
148d0 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a  out of memory. .
148e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
148f0 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64  ckBtree(BtShared
14900 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
14910 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
14920 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72  * Result code fr
14930 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20  om subfunctions 
14940 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
14950 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67  age1;     /* Pag
14960 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  e 1 of the datab
14970 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
14980 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
14990 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
149a0 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
149b0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
149c0 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20  PageFile = 0;   
149d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
149e0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
149f0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
14a00 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20   nPageHeader;   
14a10 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
14a20 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
14a30 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74  base according t
14a40 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65  o hdr */..  asse
14a50 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
14a60 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
14a70 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
14a80 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29  pBt->pPage1==0 )
14a90 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
14aa0 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  PagerSharedLock(
14ab0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
14ac0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14ad0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
14ae0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
14af0 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
14b00 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  e1, 0);.  if( rc
14b10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
14b20 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44  turn rc;..  /* D
14b30 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20  o some checking 
14b40 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74  to help insure t
14b50 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65  he file we opene
14b60 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a  d really is.  **
14b70 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73   a valid databas
14b80 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20  e file. .  */.  
14b90 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61  nPage = nPageHea
14ba0 64 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32  der = get4byte(2
14bb0 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
14bc0 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  Data);.  sqlite3
14bd0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
14be0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
14bf0 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e  geFile);.  if( n
14c00 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d  Page==0 || memcm
14c10 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31  p(24+(u8*)pPage1
14c20 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a  ->aData, 92+(u8*
14c30 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34  )pPage1->aData,4
14c40 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67  )!=0 ){.    nPag
14c50 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20  e = nPageFile;. 
14c60 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30   }.  if( nPage>0
14c70 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65   ){.    u32 page
14c80 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73  Size;.    u32 us
14c90 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38  ableSize;.    u8
14ca0 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31   *page1 = pPage1
14cb0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20  ->aData;.    rc 
14cc0 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
14cd0 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
14ce0 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61  page1, zMagicHea
14cf0 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20  der, 16)!=0 ){. 
14d00 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
14d10 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
14d20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
14d30 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69  E_OMIT_WAL.    i
14d40 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29  f( page1[18]>1 )
14d50 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
14d60 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
14d70 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
14d80 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
14d90 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  1 ){.      goto 
14da0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
14db0 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  d;.    }.#else. 
14dc0 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
14dd0 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >2 ){.      pBt-
14de0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
14df0 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20  _READ_ONLY;.    
14e00 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
14e10 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67  19]>2 ){.      g
14e20 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
14e30 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
14e40 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74    /* If the writ
14e50 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74  e version is set
14e60 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61   to 2, this data
14e70 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61  base should be a
14e80 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69  ccessed.    ** i
14e90 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74  n WAL mode. If t
14ea0 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c  he log is not al
14eb0 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e  ready open, open
14ec0 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20   it now. Then . 
14ed0 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c     ** return SQL
14ee0 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72  ITE_OK and retur
14ef0 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61  n without popula
14f00 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50  ting BtShared.pP
14f10 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65  age1..    ** The
14f20 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20   caller detects 
14f30 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74  this and calls t
14f40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
14f50 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20  in. This is.    
14f60 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20 74  ** required as t
14f70 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61  he version of pa
14f80 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69  ge 1 currently i
14f90 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66 66  n the page1 buff
14fa0 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  er.    ** may no
14fb0 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74 20  t be the latest 
14fc0 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20  version - there 
14fd0 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f  may be a newer o
14fe0 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20  ne in the log.  
14ff0 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a    ** file..    *
15000 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  /.    if( page1[
15010 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e  19]==2 && (pBt->
15020 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e  btsFlags & BTS_N
15030 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  O_WAL)==0 ){.   
15040 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20     int isOpen = 
15050 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
15060 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61  lite3PagerOpenWa
15070 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  l(pBt->pPager, &
15080 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69  isOpen);.      i
15090 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
150a0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
150b0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
150c0 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ed;.      }else 
150d0 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b  if( isOpen==0 ){
150e0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
150f0 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
15100 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15110 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
15120 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15130 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a  E_NOTADB;.    }.
15140 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54  #endif..    /* T
15150 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64  he maximum embed
15160 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73  ded fraction mus
15170 74 20 62 65 20 65 78 61 63 74 6c 79 20 32 35 25  t be exactly 25%
15180 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d  .  And the minim
15190 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64  um.    ** embedd
151a0 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74  ed fraction must
151b0 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f   be 12.5% for bo
151c0 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64  th leaf-data and
151d0 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a   non-leaf-data..
151e0 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69      ** The origi
151f0 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77  nal design allow
15200 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73  ed these amounts
15210 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73   to vary, but as
15220 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   of.    ** versi
15230 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71  on 3.6.0, we req
15240 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20  uire them to be 
15250 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  fixed..    */.  
15260 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61    if( memcmp(&pa
15270 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30  ge1[21], "\100\0
15280 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b  40\040",3)!=0 ){
15290 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
152a0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
152b0 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a     }.    pageSiz
152c0 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c  e = (page1[16]<<
152d0 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c  8) | (page1[17]<
152e0 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 28 28  <16);.    if( ((
152f0 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
15300 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c  Size)!=0.     ||
15310 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45   pageSize>SQLITE
15320 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a  _MAX_PAGE_SIZE .
15330 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65       || pageSize
15340 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20  <=256 .    ){.  
15350 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
15360 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
15370 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  }.    assert( (p
15380 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
15390 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  );.    usableSiz
153a0 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
153b0 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
153c0 28 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21  ( (u32)pageSize!
153d0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
153e0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72  {.      /* After
153f0 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72   reading the fir
15400 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
15410 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67  atabase assuming
15420 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20   a page size.   
15430 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65     ** of BtShare
15440 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68  d.pageSize, we h
15450 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74  ave discovered t
15460 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
15470 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63  e is.      ** ac
15480 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e  tually pageSize.
15490 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
154a0 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d  base, leave pBt-
154b0 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20  >pPage1 at.     
154c0 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   ** zero and ret
154d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54  urn SQLITE_OK. T
154e0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63  he caller will c
154f0 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
15500 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  n.      ** again
15510 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
15520 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20  t page-size..   
15530 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65     */.      rele
15540 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
15550 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62  .      pBt->usab
15560 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53  leSize = usableS
15570 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ize;.      pBt->
15580 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
15590 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54  ize;.      freeT
155a0 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
155b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
155c0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
155d0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
155e0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  pBt->pageSize,. 
155f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15610 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c    pageSize-usabl
15620 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65  eSize);.      re
15630 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
15640 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d     if( (pBt->db-
15650 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
15660 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30  RecoveryMode)==0
15670 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46   && nPage>nPageF
15680 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ile ){.      rc 
15690 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
156a0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
156b0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
156c0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  led;.    }.    i
156d0 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38  f( usableSize<48
156e0 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
156f0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
15700 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  d;.    }.    pBt
15710 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
15720 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e  eSize;.    pBt->
15730 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61  usableSize = usa
15740 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66  bleSize;.#ifndef
15750 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
15760 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d  OVACUUM.    pBt-
15770 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
15780 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
15790 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
157a0 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
157b0 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
157c0 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d  &page1[36 + 7*4]
157d0 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
157e0 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61   }..  /* maxLoca
157f0 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  l is the maximum
15800 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
15810 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ad to store loca
15820 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63  lly for.  ** a c
15830 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ell.  Make sure 
15840 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  it is small enou
15850 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65  gh so that at le
15860 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20  ast minFanout.  
15870 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c  ** cells can wil
15880 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67  l fit on one pag
15890 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20  e.  We assume a 
158a0 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61  10-byte page hea
158b0 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65  der..  ** Beside
158c0 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74  s the payload, t
158d0 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f  he cell must sto
158e0 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62  re:.  **     2-b
158f0 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  yte pointer to t
15900 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20  he cell.  **    
15910 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f   4-byte child po
15920 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39  inter.  **     9
15930 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65  -byte nKey value
15940 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
15950 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a   nData value.  *
15960 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65  *     4-byte ove
15970 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
15980 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c  er.  ** So a cel
15990 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  l consists of a 
159a0 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20  2-byte pointer, 
159b0 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69  a header which i
159c0 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a  s as much as.  *
159d0 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c  * 17 bytes long,
159e0 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66   0 to N bytes of
159f0 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e   payload, and an
15a00 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65   optional 4 byte
15a10 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70   overflow.  ** p
15a20 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a  age pointer..  *
15a30 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  /.  pBt->maxLoca
15a40 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  l = (u16)((pBt->
15a50 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36  usableSize-12)*6
15a60 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70  4/255 - 23);.  p
15a70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28  Bt->minLocal = (
15a80 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c  u16)((pBt->usabl
15a90 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
15aa0 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 23);.  pBt->m
15ab0 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70  axLeaf = (u16)(p
15ac0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
15ad0 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e   35);.  pBt->min
15ae0 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42  Leaf = (u16)((pB
15af0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
15b00 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*32/255 - 23);.
15b10 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f    if( pBt->maxLo
15b20 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70  cal>127 ){.    p
15b30 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
15b40 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c  oad = 127;.  }el
15b50 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78  se{.    pBt->max
15b60 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28  1bytePayload = (
15b70 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  u8)pBt->maxLocal
15b80 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
15b90 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32  pBt->maxLeaf + 2
15ba0 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a  3 <= MX_CELL_SIZ
15bb0 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d  E(pBt) );.  pBt-
15bc0 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31  >pPage1 = pPage1
15bd0 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d  ;.  pBt->nPage =
15be0 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e   nPage;.  return
15bf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
15c00 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a  e1_init_failed:.
15c10 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
15c20 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50  age1);.  pBt->pP
15c30 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75  age1 = 0;.  retu
15c40 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
15c50 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  f NDEBUG./*.** R
15c60 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
15c70 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e   of cursors open
15c80 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73   on pBt. This is
15c90 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
15ca0 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
15cb0 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
15cc0 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
15cd0 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
15ce0 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  defined..**.** O
15cf0 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72  nly write cursor
15d00 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66  s are counted if
15d10 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e   wrOnly is true.
15d20 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a    If wrOnly is.*
15d30 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c  * false then all
15d40 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75   cursors are cou
15d50 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  nted..**.** For 
15d60 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
15d70 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20  this routine, a 
15d80 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75  cursor is any cu
15d90 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20  rsor that.** is 
15da0 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69  capable of readi
15db0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  ng or writing to
15dc0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
15dd0 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20  Cursors that.** 
15de0 68 61 76 65 20 62 65 65 6e 20 74 72 69 70 70 65  have been trippe
15df0 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f  d into the CURSO
15e00 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61 72  R_FAULT state ar
15e10 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a  e not counted..*
15e20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
15e30 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42  ntValidCursors(B
15e40 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e  tShared *pBt, in
15e50 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43  t wrOnly){.  BtC
15e60 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
15e70 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
15e80 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
15e90 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
15ea0 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
15eb0 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c  if( (wrOnly==0 |
15ec0 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  | (pCur->curFlag
15ed0 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c  s & BTCF_WriteFl
15ee0 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20  ag)!=0).     && 
15ef0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
15f00 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b  RSOR_FAULT ) r++
15f10 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ; .  }.  return 
15f20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r;.}.#endif../*.
15f30 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
15f40 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  no outstanding c
15f50 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72  ursors and we ar
15f60 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64  e not in the mid
15f70 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e  dle.** of a tran
15f80 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72  saction but ther
15f90 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  e is a read lock
15fa0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
15fb0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
15fc0 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68  outine unrefs th
15fd0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
15fe0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15ff0 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  e which .** has 
16000 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65  the effect of re
16010 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64  leasing the read
16020 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
16030 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73  there is a trans
16040 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
16050 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ss, this routine
16060 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
16070 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
16080 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
16090 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
160a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
160b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
160c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
160d0 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64  sert( countValid
160e0 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d  Cursors(pBt,0)==
160f0 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e  0 || pBt->inTran
16100 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f  saction>TRANS_NO
16110 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  NE );.  if( pBt-
16120 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
16130 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42  TRANS_NONE && pB
16140 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a  t->pPage1!=0 ){.
16150 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
16160 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
16170 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
16180 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
16190 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
161a0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
161b0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31  (pBt->pPager)==1
161c0 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   );.    pBt->pPa
161d0 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  ge1 = 0;.    rel
161e0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
161f0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
16200 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20  f pBt points to 
16210 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68  an empty file th
16220 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20  en convert that 
16230 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e  empty file.** in
16240 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64  to a new empty d
16250 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69  atabase by initi
16260 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73  alizing the firs
16270 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65  t page of.** the
16280 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
16290 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61  atic int newData
162a0 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70  base(BtShared *p
162b0 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
162c0 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pP1;.  unsigned 
162d0 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e  char *data;.  in
162e0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
162f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16300 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
16310 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  );.  if( pBt->nP
16320 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  age>0 ){.    ret
16330 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16340 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e   }.  pP1 = pBt->
16350 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
16360 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
16370 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
16380 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
16390 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70  agerWrite(pP1->p
163a0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
163b0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
163c0 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d   memcpy(data, zM
163d0 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65  agicHeader, size
163e0 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
163f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
16400 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
16410 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b  )==16 );.  data[
16420 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  16] = (u8)((pBt-
16430 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78  >pageSize>>8)&0x
16440 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20  ff);.  data[17] 
16450 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
16460 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29  eSize>>16)&0xff)
16470 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31  ;.  data[18] = 1
16480 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31  ;.  data[19] = 1
16490 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
164a0 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74  >usableSize<=pBt
164b0 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42  ->pageSize && pB
164c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35  t->usableSize+25
164d0 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  5>=pBt->pageSize
164e0 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  );.  data[20] = 
164f0 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
16500 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
16510 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31  Size);.  data[21
16520 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32  ] = 64;.  data[2
16530 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b  2] = 32;.  data[
16540 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73  23] = 32;.  mems
16550 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c  et(&data[24], 0,
16560 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f   100-24);.  zero
16570 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e  Page(pP1, PTF_IN
16580 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54  TKEY|PTF_LEAF|PT
16590 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20  F_LEAFDATA );.  
165a0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
165b0 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
165c0 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  XED;.#ifndef SQL
165d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
165e0 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42  UUM.  assert( pB
165f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31  t->autoVacuum==1
16600 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   || pBt->autoVac
16610 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  uum==0 );.  asse
16620 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  rt( pBt->incrVac
16630 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69  uum==1 || pBt->i
16640 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  ncrVacuum==0 );.
16650 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
16660 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d  [36 + 4*4], pBt-
16670 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
16680 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
16690 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69  6 + 7*4], pBt->i
166a0 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  ncrVacuum);.#end
166b0 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  if.  pBt->nPage 
166c0 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20  = 1;.  data[31] 
166d0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
166e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
166f0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
16700 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
16710 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16720 20 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74   (creating a dat
16730 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74  abase.** consist
16740 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
16750 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65  page and no sche
16760 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74  ma objects). Ret
16770 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
16780 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
16790 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
167a0 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
167b0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
167c0 33 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65  3BtreeNewDb(Btre
167d0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
167e0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
167f0 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42  nter(p);.  p->pB
16800 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
16810 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
16820 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69  (p->pBt);.  sqli
16830 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16840 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16850 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
16860 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
16870 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
16880 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
16890 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
168a0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
168b0 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
168c0 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
168d0 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
168e0 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
168f0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
16900 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
16910 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
16920 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
16930 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
16940 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
16950 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
16960 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
16970 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
16980 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
16990 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
169a0 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
169b0 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
169c0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
169d0 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
169e0 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
169f0 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
16a00 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
16a10 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
16a20 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
16a30 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
16a40 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
16a50 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
16a60 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
16a70 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
16a80 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
16a90 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
16aa0 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
16ab0 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
16ac0 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
16ad0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
16ae0 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
16af0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
16b00 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
16b10 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
16b20 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
16b30 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
16b40 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
16b50 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
16b60 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
16b70 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
16b80 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
16b90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
16ba0 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
16bb0 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
16bc0 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
16bd0 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
16be0 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
16bf0 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
16c00 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
16c10 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
16c20 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
16c30 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
16c40 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
16c50 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
16c60 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
16c70 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
16c80 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
16c90 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
16ca0 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
16cb0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
16cc0 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
16cd0 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
16ce0 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
16cf0 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
16d00 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
16d10 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
16d20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
16d30 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
16d40 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
16d50 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
16d60 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
16d70 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
16d80 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
16d90 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
16da0 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
16db0 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
16dc0 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
16dd0 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
16de0 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
16df0 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
16e00 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
16e10 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
16e20 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
16e30 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
16e40 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
16e50 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
16e60 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
16e70 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
16e80 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
16e90 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
16ea0 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
16eb0 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
16ec0 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
16ed0 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
16ee0 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
16ef0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
16f00 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
16f10 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71  nt wrflag){.  sq
16f20 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20  lite3 *pBlock = 
16f30 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  0;.  BtShared *p
16f40 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
16f50 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16f60 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K;..  sqlite3Btr
16f70 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
16f80 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
16f90 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
16fa0 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
16fb0 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
16fc0 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
16fd0 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
16fe0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
16ff0 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
17000 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
17010 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
17020 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
17030 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
17040 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
17050 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
17060 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
17070 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67  wrflag) ){.    g
17080 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
17090 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
170a0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
170b0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  n==TRANS_WRITE |
170c0 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  | IfNotOmitAV(pB
170d0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d  t->bDoTruncate)=
170e0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  =0 );..  /* Writ
170f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e transactions a
17100 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
17110 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  on a read-only d
17120 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28  atabase */.  if(
17130 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
17140 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
17150 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b  !=0 && wrflag ){
17160 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
17170 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67  _READONLY;.    g
17180 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
17190 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
171a0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
171b0 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61  _CACHE.  /* If a
171c0 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20  nother database 
171d0 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61  handle has alrea
171e0 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74  dy opened a writ
171f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
17200 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72   ** on this shar
17210 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75  ed-btree structu
17220 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20  re and a second 
17230 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
17240 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73  n is.  ** reques
17250 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ted, return SQLI
17260 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a  TE_LOCKED..  */.
17270 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26    if( (wrflag &&
17280 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
17290 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
172a0 29 0a 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74  ).   || (pBt->bt
172b0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e  sFlags & BTS_PEN
172c0 44 49 4e 47 29 21 3d 30 0a 20 20 29 7b 0a 20 20  DING)!=0.  ){.  
172d0 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e    pBlock = pBt->
172e0 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d  pWriter->db;.  }
172f0 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e  else if( wrflag>
17300 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  1 ){.    BtLock 
17310 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28  *pIter;.    for(
17320 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
17330 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
17340 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
17350 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
17360 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20  Btree!=p ){.    
17370 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74      pBlock = pIt
17380 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a  er->pBtree->db;.
17390 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
173a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
173b0 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b  .  if( pBlock ){
173c0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
173d0 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
173e0 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20  >db, pBlock);.  
173f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f    rc = SQLITE_LO
17400 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
17410 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
17420 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64  _begun;.  }.#end
17430 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61  if..  /* Any rea
17440 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77  d-only or read-w
17450 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
17460 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d   implies a read-
17470 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61  lock on .  ** pa
17480 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65  ge 1. So if some
17490 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61   other shared-ca
174a0 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61  che client alrea
174b0 64 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c  dy has a write-l
174c0 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67  ock .  ** on pag
174d0 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63  e 1, the transac
174e0 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f  tion cannot be o
174f0 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d  pened. */.  rc =
17500 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
17510 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41  eTableLock(p, MA
17520 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f  STER_ROOT, READ_
17530 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c  LOCK);.  if( SQL
17540 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74  ITE_OK!=rc ) got
17550 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a  o trans_begun;..
17560 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
17570 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c  &= ~BTS_INITIALL
17580 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70  Y_EMPTY;.  if( p
17590 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70  Bt->nPage==0 ) p
175a0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
175b0 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
175c0 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20  PTY;.  do {.    
175d0 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65  /* Call lockBtre
175e0 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72  e() until either
175f0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20   pBt->pPage1 is 
17600 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20  populated or.   
17610 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20   ** lockBtree() 
17620 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e  returns somethin
17630 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  g other than SQL
17640 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65  ITE_OK. lockBtre
17650 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72  e().    ** may r
17660 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
17670 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  but leave pBt->p
17680 50 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69  Page1 set to 0 i
17690 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72  f after.    ** r
176a0 65 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74  eading page 1 it
176b0 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20   discovers that 
176c0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
176d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
176e0 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f     ** file is no
176f0 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e  t pBt->pageSize.
17700 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f   In this case lo
17710 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75  ckBtree() will u
17720 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74  pdate.    ** pBt
17730 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68  ->pageSize to th
17740 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
17750 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
17760 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  .    */.    whil
17770 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  e( pBt->pPage1==
17780 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  0 && SQLITE_OK==
17790 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28  (rc = lockBtree(
177a0 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66  pBt)) );..    if
177b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
177c0 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
177d0 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73     if( (pBt->bts
177e0 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
177f0 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20  _ONLY)!=0 ){.   
17800 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17810 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
17820 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17830 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17840 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  rBegin(pBt->pPag
17850 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69  er,wrflag>1,sqli
17860 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
17870 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
17880 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17890 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
178a0 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
178b0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  (pBt);.        }
178c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
178d0 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51   .    if( rc!=SQ
178e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
178f0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
17900 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d  used(pBt);.    }
17910 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30  .  }while( (rc&0
17920 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53  xFF)==SQLITE_BUS
17930 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  Y && pBt->inTran
17940 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
17950 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  ONE &&.         
17960 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
17970 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a  Handler(pBt) );.
17980 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
17990 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
179a0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
179b0 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
179c0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
179d0 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  n++;.#ifndef SQL
179e0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
179f0 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20  CACHE.      if( 
17a00 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
17a10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17a20 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70  ->lock.pBtree==p
17a30 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62   && p->lock.iTab
17a40 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  le==1 );.       
17a50 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d   p->lock.eLock =
17a60 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
17a70 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78      p->lock.pNex
17a80 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a  t = pBt->pLock;.
17a90 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f          pBt->pLo
17aa0 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20  ck = &p->lock;. 
17ab0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
17ac0 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61    }.    p->inTra
17ad0 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41  ns = (wrflag?TRA
17ae0 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52  NS_WRITE:TRANS_R
17af0 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  EAD);.    if( p-
17b00 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e  >inTrans>pBt->in
17b10 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
17b20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
17b30 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54  saction = p->inT
17b40 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rans;.    }.    
17b50 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20  if( wrflag ){.  
17b60 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
17b70 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
17b80 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
17b90 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
17ba0 43 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74  CHE.      assert
17bb0 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20  ( !pBt->pWriter 
17bc0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57  );.      pBt->pW
17bd0 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20  riter = p;.     
17be0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
17bf0 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45  = ~BTS_EXCLUSIVE
17c00 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c  ;.      if( wrfl
17c10 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46  ag>1 ) pBt->btsF
17c20 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c  lags |= BTS_EXCL
17c30 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20  USIVE;.#endif.. 
17c40 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
17c50 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66 69  b-size header fi
17c60 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74  eld is incorrect
17c70 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
17c80 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a  f an old.      *
17c90 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65  * client has bee
17ca0 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61  n writing the da
17cb0 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70  tabase file), up
17cc0 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69  date it now. Doi
17cd0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  ng.      ** this
17ce0 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74   sooner rather t
17cf0 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20  han later means 
17d00 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
17d10 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20  e can safely .  
17d20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74      ** re-read t
17d30 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
17d40 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20   from page 1 if 
17d50 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74  a savepoint or t
17d60 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20  ransaction.     
17d70 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63   ** rollback occ
17d80 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 74  urs within the t
17d90 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
17da0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
17db0 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62  Bt->nPage!=get4b
17dc0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
17dd0 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20  ta[28]) ){.     
17de0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
17df0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
17e00 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
17e10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17e20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17e30 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
17e40 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
17e50 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
17e60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
17e70 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73     }.  }...trans
17e80 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63  _begun:.  if( rc
17e90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
17ea0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20  rflag ){.    /* 
17eb0 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20  This call makes 
17ec0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61  sure that the pa
17ed0 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72  ger has the corr
17ee0 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  ect number of.  
17ef0 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f    ** open savepo
17f00 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63  ints. If the sec
17f10 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
17f20 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
17f30 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  and.    ** the s
17f40 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  ub-journal is no
17f50 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  t already open, 
17f60 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20  then it will be 
17f70 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20  opened here..   
17f80 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
17f90 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
17fa0 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
17fb0 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  er, p->db->nSave
17fc0 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  point);.  }..  b
17fd0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
17fe0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17ff0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
18000 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
18010 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
18020 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20  TOVACUUM../*.** 
18030 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
18040 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
18050 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
18060 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f  page pPage. Also
18070 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f  , if.** pPage co
18080 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61  ntains cells tha
18090 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
180a0 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74  low pages, set t
180b0 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  he pointer.** ma
180c0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  p entries for th
180d0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
180e0 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61   as well..*/.sta
180f0 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64  tic int setChild
18100 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20  Ptrmaps(MemPage 
18110 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
18120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18140 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c   Counter variabl
18150 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
18160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
18180 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
18190 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20  page pPage */.  
181a0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
181b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181c0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
181d0 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
181e0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
181f0 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72  t;.  u8 isInitOr
18200 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
18210 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  it;.  Pgno pgno 
18220 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
18230 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
18240 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
18250 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
18260 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49  );.  rc = btreeI
18270 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
18280 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18290 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
182a0 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
182b0 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65  s_out;.  }.  nCe
182c0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
182d0 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l;..  for(i=0; i
182e0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
182f0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
18300 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
18310 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ;..    ptrmapPut
18320 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
18330 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20  Cell, &rc);..   
18340 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
18350 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
18360 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
18370 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
18380 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
18390 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
183a0 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
183b0 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
183c0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
183d0 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
183e0 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
183f0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
18400 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
18410 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74  fset+8]);.    pt
18420 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
18430 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
18440 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
18450 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64  ;.  }..set_child
18460 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20  _ptrmaps_out:.  
18470 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
18480 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65  isInitOrig;.  re
18490 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
184a0 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70  * Somewhere on p
184b0 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65  Page is a pointe
184c0 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e  r to page iFrom.
184d0 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f    Modify this po
184e0 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74  inter so.** that
184f0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54   it points to iT
18500 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79  o. Parameter eTy
18510 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  pe describes the
18520 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72   type of pointer
18530 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69   to.** be modifi
18540 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a  ed, as  follows:
18550 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54  .**.** PTRMAP_BT
18560 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69  REE:     pPage i
18570 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
18580 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
18590 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a  ts at a child .*
185a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
185b0 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67      page of pPag
185c0 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
185d0 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65  OVERFLOW1: pPage
185e0 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
185f0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
18600 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66  ints at an overf
18610 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  low.**          
18620 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f           page po
18630 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20  inted to by one 
18640 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20  of the cells on 
18650 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
18660 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70  MAP_OVERFLOW2: p
18670 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
18680 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  low-page. The po
18690 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
186a0 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20  the next.**     
186b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76                ov
186c0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
186d0 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  he list..*/.stat
186e0 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67  ic int modifyPag
186f0 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65  ePointer(MemPage
18700 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46   *pPage, Pgno iF
18710 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75  rom, Pgno iTo, u
18720 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65  8 eType){.  asse
18730 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
18740 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
18750 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
18760 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
18770 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
18780 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
18790 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  ;.  if( eType==P
187a0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
187b0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ){.    /* The po
187c0 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20  inter is always 
187d0 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
187e0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e  s of the page in
187f0 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a   this case.  */.
18800 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
18810 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d  (pPage->aData)!=
18820 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72  iFrom ){.      r
18830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
18840 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
18850 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50  .    put4byte(pP
18860 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29  age->aData, iTo)
18870 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
18880 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  8 isInitOrig = p
18890 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
188a0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
188b0 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62 74 72   nCell;..    btr
188c0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
188d0 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70  );.    nCell = p
188e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
188f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
18900 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
18910 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
18920 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
18930 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
18940 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
18950 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c  1 ){.        Cel
18960 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
18970 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
18980 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
18990 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
189a0 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76      if( info.iOv
189b0 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 20  erflow.         
189c0 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f  && pCell+info.iO
189d0 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65  verflow+3<=pPage
189e0 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d  ->aData+pPage->m
189f0 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20  askPage.        
18a00 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62   && iFrom==get4b
18a10 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
18a20 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20  iOverflow]).    
18a30 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
18a40 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c   put4byte(&pCell
18a50 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
18a60 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
18a70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
18a80 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
18a90 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34          if( get4
18aa0 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72  byte(pCell)==iFr
18ab0 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  om ){.          
18ac0 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
18ad0 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
18ae0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
18af0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18b00 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65   .    if( i==nCe
18b10 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
18b20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54  eType!=PTRMAP_BT
18b30 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  REE || .        
18b40 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67    get4byte(&pPag
18b50 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
18b60 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69  hdrOffset+8])!=i
18b70 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
18b80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
18b90 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
18ba0 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79    }.      put4by
18bb0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
18bc0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
18bd0 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  t+8], iTo);.    
18be0 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  }..    pPage->is
18bf0 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
18c00 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
18c10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
18c20 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70  *.** Move the op
18c30 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
18c40 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61   pDbPage to loca
18c50 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69  tion iFreePage i
18c60 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
18c70 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20  se. The pDbPage 
18c80 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e  reference remain
18c90 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54  s valid..**.** T
18ca0 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  he isCommit flag
18cb0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
18cc0 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
18cd0 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
18ce0 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t.** the journal
18cf0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
18d00 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74  c()ed before dat
18d10 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
18d20 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e  ge->pgno .** can
18d30 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
18d40 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  The caller has a
18d50 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20  lready promised 
18d60 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  not to write to 
18d70 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f  that.** page..*/
18d80 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f  .static int relo
18d90 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68  catePage(.  BtSh
18da0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
18db0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f       /* Btree */
18dc0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50  .  MemPage *pDbP
18dd0 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  age,        /* O
18de0 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  pen page to move
18df0 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
18e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18e10 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74  * Pointer map 't
18e20 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70  ype' entry for p
18e30 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
18e40 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20   iPtrPage,      
18e50 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
18e60 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e  map 'page-no' en
18e70 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
18e80 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50  */.  Pgno iFreeP
18e90 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  age,          /*
18ea0 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f   The location to
18eb0 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f   move pDbPage to
18ec0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
18ed0 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  it             /
18ee0 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  * isCommit flag 
18ef0 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
18f00 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a  3PagerMovepage *
18f10 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
18f20 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54  pPtrPage;   /* T
18f30 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
18f40 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
18f50 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  to pDbPage */.  
18f60 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70  Pgno iDbPage = p
18f70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20  DbPage->pgno;.  
18f80 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
18f90 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pBt->pPager;.  i
18fa0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
18fb0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
18fc0 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79  OVERFLOW2 || eTy
18fd0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
18fe0 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65  LOW1 || .      e
18ff0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
19000 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
19010 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
19020 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
19030 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
19040 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
19050 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70  sert( pDbPage->p
19060 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a  Bt==pBt );..  /*
19070 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61   Move page iDbPa
19080 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72  ge from its curr
19090 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  ent location to 
190a0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65  page number iFre
190b0 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45  ePage */.  TRACE
190c0 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d  (("AUTOVACUUM: M
190d0 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65  oving %d to free
190e0 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61   page %d (ptr pa
190f0 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e  ge %d type %d)\n
19100 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67  ", .      iDbPag
19110 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50  e, iFreePage, iP
19120 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b  trPage, eType));
19130 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
19140 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61  agerMovepage(pPa
19150 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44  ger, pDbPage->pD
19160 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
19170 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69  , isCommit);.  i
19180 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19190 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
191a0 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65  c;.  }.  pDbPage
191b0 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61  ->pgno = iFreePa
191c0 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62  ge;..  /* If pDb
191d0 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65  Page was a btree
191e0 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d  -page, then it m
191f0 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61  ay have child pa
19200 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73  ges and/or cells
19210 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74  .  ** that point
19220 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
19230 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  es. The pointer 
19240 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
19250 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70  all these.  ** p
19260 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
19270 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20  changed..  **.  
19280 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73  ** If pDbPage is
19290 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
192a0 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
192b0 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74  t 4 bytes may st
192c0 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74  ore a.  ** point
192d0 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65  er to a subseque
192e0 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
192f0 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
19300 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a   case, then.  **
19310 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
19320 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
19330 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62  ated for the sub
19340 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
19350 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
19360 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
19370 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
19380 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
19390 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43  ){.    rc = setC
193a0 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50  hildPtrmaps(pDbP
193b0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
193c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
193d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
193e0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
193f0 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c     Pgno nextOvfl
19400 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50   = get4byte(pDbP
19410 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
19420 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30   if( nextOvfl!=0
19430 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
19440 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66  Put(pBt, nextOvf
19450 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
19460 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20  OW2, iFreePage, 
19470 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
19480 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19490 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
194a0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
194b0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20  }.  }..  /* Fix 
194c0 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69  the database poi
194d0 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74  nter on page iPt
194e0 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74  rPage that point
194f0 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f  ed at iDbPage so
19500 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  .  ** that it po
19510 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67  ints at iFreePag
19520 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20  e. Also fix the 
19530 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
19540 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50  y for.  ** iPtrP
19550 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
19560 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
19570 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
19580 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
19590 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26  pBt, iPtrPage, &
195a0 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20  pPtrPage, 0);.  
195b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
195c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
195d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
195e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
195f0 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67  gerWrite(pPtrPag
19600 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
19610 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19620 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
19630 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
19640 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
19650 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
19660 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69   = modifyPagePoi
19670 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69  nter(pPtrPage, i
19680 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
19690 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72  e, eType);.    r
196a0 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
196b0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
196c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
196d0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
196e0 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
196f0 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
19700 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
19710 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19720 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
19730 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ration required 
19740 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  by incrVacuumSte
19750 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  p(). */.static i
19760 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
19770 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c  Page(BtShared *,
19780 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e   MemPage **, Pgn
19790 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a  o *, Pgno, u8);.
197a0 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61  ./*.** Perform a
197b0 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
197c0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  an incremental-v
197d0 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73  acuum. If succes
197e0 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  sful, return.** 
197f0 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
19800 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74  ere is no work t
19810 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66  o do (and theref
19820 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20  ore no point in 
19830 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  .** calling this
19840 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29   function again)
19850 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
19860 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20  DONE. Or, if an 
19870 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
19880 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74  , return some ot
19890 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  her error code..
198a0 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
198b0 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75  fically, this fu
198c0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
198d0 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74  to re-organize t
198e0 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a  he database so .
198f0 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  ** that the last
19900 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
19910 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
19920 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  se is no longer 
19930 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  in use..**.** Pa
19940 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20  rameter nFin is 
19950 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
19960 67 65 73 20 74 68 61 74 20 74 68 69 73 20 64 61  ges that this da
19970 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e  tabase would con
19980 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69  tain.** were thi
19990 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  s function calle
199a0 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72  d until it retur
199b0 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  ns SQLITE_DONE..
199c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f  **.** If the bCo
199d0 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20 69  mmit parameter i
199e0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73  s non-zero, this
199f0 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
19a00 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63  s that the .** c
19a10 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20  aller will keep 
19a20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75  calling incrVacu
19a30 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69  umStep() until i
19a40 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
19a50 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20  _DONE .** or an 
19a60 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69  error. bCommit i
19a70 73 20 70 61 73 73 65 64 20 74 72 75 65 20 66 6f  s passed true fo
19a80 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
19a90 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f  -on-commit .** o
19aa0 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c  peration, or fal
19ab0 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d  se for an increm
19ac0 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f  ental vacuum..*/
19ad0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
19ae0 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
19af0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
19b00 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50  Fin, Pgno iLastP
19b10 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  g, int bCommit){
19b20 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
19b30 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
19b40 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
19b50 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
19b60 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e-list */.  int 
19b70 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
19b80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
19b90 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
19ba0 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74  .  assert( iLast
19bb0 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66  Pg>nFin );..  if
19bc0 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45  ( !PTRMAP_ISPAGE
19bd0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26  (pBt, iLastPg) &
19be0 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49  & iLastPg!=PENDI
19bf0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
19c00 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70  ) ){.    u8 eTyp
19c10 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72  e;.    Pgno iPtr
19c20 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65  Page;..    nFree
19c30 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
19c40 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
19c50 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66  ata[36]);.    if
19c60 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29  ( nFreeList==0 )
19c70 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
19c80 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
19c90 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  }..    rc = ptrm
19ca0 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74  apGet(pBt, iLast
19cb0 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  Pg, &eType, &iPt
19cc0 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
19cd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19ce0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
19cf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19d00 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
19d10 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  OTPAGE ){.      
19d20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
19d30 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
19d40 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  }..    if( eType
19d50 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
19d60 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  E ){.      if( b
19d70 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
19d80 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
19d90 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
19da0 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
19db0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
19dc0 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
19dd0 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * if bCommit is 
19de0 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61  non-zero. In tha
19df0 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65  t case, the free
19e00 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20  -list will be.  
19e10 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74        ** truncat
19e20 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72  ed to zero after
19e30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
19e40 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f  eturns, so it do
19e50 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a  esn't .        *
19e60 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73  * matter if it s
19e70 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f  till contains so
19e80 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69  me garbage entri
19e90 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
19ea0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
19eb0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ePg;.        Mem
19ec0 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
19ed0 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
19ee0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
19ef0 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
19f00 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20  reePg, iLastPg, 
19f10 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a  BTALLOC_EXACT);.
19f20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
19f30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19f40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
19f50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19f60 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
19f70 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a  ePg==iLastPg );.
19f80 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
19f90 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
19fa0 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
19fb0 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46   {.      Pgno iF
19fc0 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20  reePg;          
19fd0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
19fe0 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ree page to move
19ff0 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20   pLastPg to */. 
1a000 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c       MemPage *pL
1a010 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20  astPg;.      u8 
1a020 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f  eMode = BTALLOC_
1a030 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70  ANY;   /* Mode p
1a040 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c  arameter for all
1a050 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29  ocateBtreePage()
1a060 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69   */.      Pgno i
1a070 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Near = 0;       
1a080 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61      /* nearby pa
1a090 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f  rameter for allo
1a0a0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20  cateBtreePage() 
1a0b0 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62  */..      rc = b
1a0c0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1a0d0 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74   iLastPg, &pLast
1a0e0 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Pg, 0);.      if
1a0f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a100 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1a110 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
1a120 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d       /* If bComm
1a130 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  it is zero, this
1a140 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
1a150 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
1a160 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
1a170 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
1a180 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
1a190 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
1a1a0 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
1a1b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1a1c0 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
1a1d0 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20  and, if bCommit 
1a1e0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1a1f0 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a  zero, then keep.
1a200 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67        ** looping
1a210 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61   until a free-pa
1a220 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69  ge located withi
1a230 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e  n the first nFin
1a240 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
1a250 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66  of the file is f
1a260 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ound..      */. 
1a270 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
1a280 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
1a290 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c  Mode = BTALLOC_L
1a2a0 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72  E;.        iNear
1a2b0 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d   = nFin;.      }
1a2c0 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  .      do {.    
1a2d0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
1a2e0 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
1a2f0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
1a300 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
1a310 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e  Pg, &iFreePg, iN
1a320 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20  ear, eMode);.   
1a330 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1a340 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a350 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1a360 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
1a370 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1a380 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a390 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
1a3a0 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68  eePg);.      }wh
1a3b0 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20  ile( bCommit && 
1a3c0 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a  iFreePg>nFin );.
1a3d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
1a3e0 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b  reePg<iLastPg );
1a3f0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63  .      .      rc
1a400 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
1a410 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
1a420 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
1a430 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29  FreePg, bCommit)
1a440 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
1a450 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
1a460 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a470 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1a480 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a490 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1a4a0 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
1a4b0 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  ){.    do {.    
1a4c0 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
1a4d0 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67   }while( iLastPg
1a4e0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1a4f0 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d  AGE(pBt) || PTRM
1a500 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
1a510 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70  LastPg) );.    p
1a520 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1a530 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50  = 1;.    pBt->nP
1a540 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20  age = iLastPg;. 
1a550 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1a560 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1a570 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  The database ope
1a580 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ned by the first
1a590 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
1a5a0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1a5b0 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61  base.** nOrig pa
1a5c0 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74  ges in size cont
1a5d0 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65  aining nFree fre
1a5e0 65 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  e pages. Return 
1a5f0 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
1a600 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1a610 61 62 61 73 65 20 69 6e 20 70 61 67 65 73 20 66  abase in pages f
1a620 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f  ollowing an auto
1a630 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f  -vacuum operatio
1a640 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  n..*/.static Pgn
1a650 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74  o finalDbSize(Bt
1a660 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
1a670 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46  o nOrig, Pgno nF
1a680 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74  ree){.  int nEnt
1a690 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ry;             
1a6a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a6b0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20  r of entries on 
1a6c0 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20  one ptrmap page 
1a6d0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61  */.  Pgno nPtrma
1a6e0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1a6f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a700 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74  f PtrMap pages t
1a710 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
1a720 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a740 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
1a750 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70  */..  nEntry = p
1a760 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
1a770 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e  ;.  nPtrmap = (n
1a780 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
1a790 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
1a7a0 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e  rig)+nEntry)/nEn
1a7b0 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f  try;.  nFin = nO
1a7c0 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50  rig - nFree - nP
1a7d0 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72  trmap;.  if( nOr
1a7e0 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ig>PENDING_BYTE_
1a7f0 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69  PAGE(pBt) && nFi
1a800 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  n<PENDING_BYTE_P
1a810 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1a820 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68  nFin--;.  }.  wh
1a830 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
1a840 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c  GE(pBt, nFin) ||
1a850 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42   nFin==PENDING_B
1a860 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1a870 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d  .    nFin--;.  }
1a880 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b  ..  return nFin;
1a890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74  .}../*.** A writ
1a8a0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
1a8b0 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66  st be opened bef
1a8c0 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
1a8d0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74   function..** It
1a8e0 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67   performs a sing
1a8f0 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20  le unit of work 
1a900 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65  towards an incre
1a910 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
1a920 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72  *.** If the incr
1a930 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69  emental vacuum i
1a940 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72  s finished after
1a950 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
1a960 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54  as run,.** SQLIT
1a970 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
1a980 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  ed. If it is not
1a990 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e   finished, but n
1a9a0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  o error occurred
1a9b0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
1a9c0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1a9d0 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20  rwise an SQLite 
1a9e0 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a  error code. .*/.
1a9f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1aa00 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65  IncrVacuum(Btree
1aa10 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
1aa20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1aa30 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
1aa40 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1aa50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1aa60 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1aa70 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20  =TRANS_WRITE && 
1aa80 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1aa90 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28  S_WRITE );.  if(
1aaa0 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
1aab0 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
1aac0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
1aad0 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72  se{.    Pgno nOr
1aae0 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
1aaf0 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67  unt(pBt);.    Pg
1ab00 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  no nFree = get4b
1ab10 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1ab20 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
1ab30 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69    Pgno nFin = fi
1ab40 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
1ab50 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20  Orig, nFree);.. 
1ab60 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69     if( nOrig<nFi
1ab70 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
1ab80 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1ab90 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  KPT;.    }else i
1aba0 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  f( nFree>0 ){.  
1abb0 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
1abc0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
1abd0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1abe0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1abf0 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
1ac00 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
1ac10 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
1ac20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
1ac30 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e  tep(pBt, nFin, n
1ac40 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  Orig, 0);.      
1ac50 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1ac60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ac70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ac80 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
1ac90 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
1aca0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
1acb0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1acc0 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
1acd0 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
1ace0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1acf0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1ad00 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ONE;.    }.  }. 
1ad10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1ad20 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1ad30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1ad40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1ad50 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c  led prior to sql
1ad60 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20  ite3PagerCommit 
1ad70 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
1ad80 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74  on.** is committ
1ad90 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
1ada0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
1adb0 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
1adc0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
1add0 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
1ade0 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
1adf0 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
1ae00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ae10 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
1ae20 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
1ae30 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
1ae40 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
1ae50 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
1ae60 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
1ae70 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
1ae80 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
1ae90 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
1aea0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1aeb0 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
1aec0 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
1aed0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1aee0 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
1aef0 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
1af00 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c  Pager;.  VVA_ONL
1af10 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71  Y( int nRef = sq
1af20 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
1af30 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  nt(pPager) );.. 
1af40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1af50 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1af60 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76  >mutex) );.  inv
1af70 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
1af80 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
1af90 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f  assert(pBt->auto
1afa0 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21  Vacuum);.  if( !
1afb0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
1afc0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  ){.    Pgno nFin
1afd0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
1afe0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1aff0 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61  database after a
1b000 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a  utovacuuming */.
1b010 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20      Pgno nFree; 
1b020 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b030 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
1b040 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61   freelist initia
1b050 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  lly */.    Pgno 
1b060 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  iFree;        /*
1b070 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74   The next page t
1b080 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
1b090 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
1b0a0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1b0b0 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65   size before fre
1b0c0 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72  eing */..    nOr
1b0d0 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
1b0e0 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66  unt(pBt);.    if
1b0f0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
1b100 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e  pBt, nOrig) || n
1b110 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Orig==PENDING_BY
1b120 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1b130 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e        /* It is n
1b140 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ot possible to c
1b150 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65  reate a database
1b160 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66   for which the f
1b170 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20  inal page.      
1b180 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70  ** is either a p
1b190 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
1b1a0 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62  or the pending-b
1b1b0 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65  yte page. If one
1b1c0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63  .      ** is enc
1b1d0 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69  ountered, this i
1b1e0 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74  ndicates corrupt
1b1f0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
1b200 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b210 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1b220 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65      }..    nFree
1b230 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
1b240 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1b250 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  36]);.    nFin =
1b260 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
1b270 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
1b280 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f  .    if( nFin>nO
1b290 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rig ) return SQL
1b2a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1b2b0 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e  ;.    if( nFin<n
1b2c0 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
1b2d0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1b2e0 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1b2f0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65    }.    for(iFre
1b300 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e  e=nOrig; iFree>n
1b310 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Fin && rc==SQLIT
1b320 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a  E_OK; iFree--){.
1b330 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
1b340 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
1b350 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a  Fin, iFree, 1);.
1b360 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72      }.    if( (r
1b370 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c  c==SQLITE_DONE |
1b380 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  | rc==SQLITE_OK)
1b390 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20   && nFree>0 ){. 
1b3a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1b3b0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
1b3c0 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
1b3d0 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
1b3e0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1b3f0 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20  aData[32], 0);. 
1b400 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1b410 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1b420 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[36], 0);.     
1b430 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1b440 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1b450 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20  ], nFin);.      
1b460 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1b470 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d   = 1;.      pBt-
1b480 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20  >nPage = nFin;. 
1b490 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
1b4a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b4b0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1b4c0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
1b4d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
1b4e0 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c  ssert( nRef>=sql
1b4f0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
1b500 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  t(pPager) );.  r
1b510 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c  eturn rc;.}..#el
1b520 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  se /* ifndef SQL
1b530 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1b540 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  UUM */.# define 
1b550 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
1b560 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  x) SQLITE_OK.#en
1b570 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
1b580 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
1b590 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20   first phase of 
1b5a0 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d  a two-phase comm
1b5b0 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
1b5c0 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f  e.** causes a ro
1b5d0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
1b5e0 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66  o be created (if
1b5f0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
1b600 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61  eady exist).** a
1b610 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  nd populated wit
1b620 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61  h enough informa
1b630 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20  tion so that if 
1b640 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63  a power loss occ
1b650 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  urs.** the datab
1b660 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f  ase can be resto
1b670 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
1b680 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61  nal state by pla
1b690 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65  ying back.** the
1b6a0 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20   journal.  Then 
1b6b0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1b6c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  the journal are 
1b6d0 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a  flushed out to.*
1b6e0 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74  * the disk.  Aft
1b6f0 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
1b700 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64  s safely on oxid
1b710 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74  e, the changes t
1b720 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  o the.** databas
1b730 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  e are written in
1b740 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1b750 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64  file and flushed
1b760 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74   to oxide..** At
1b770 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73   the end of this
1b780 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62   call, the rollb
1b790 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c  ack journal stil
1b7a0 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a  l exists on the.
1b7b0 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61  ** disk and we a
1b7c0 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  re still holding
1b7d0 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74   all locks, so t
1b7e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
1b7f0 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74  as not.** commit
1b800 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65  ted.  See sqlite
1b810 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1b820 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73  eTwo() for the s
1b830 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74  econd phase of t
1b840 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f  he.** commit pro
1b850 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cess..**.** This
1b860 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
1b870 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   if no write-tra
1b880 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72  nsaction is curr
1b890 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20  ently active on 
1b8a0 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  pBt..**.** Other
1b8b0 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64  wise, sync the d
1b8c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
1b8d0 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20   the btree pBt. 
1b8e0 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
1b8f0 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66  o.** the name of
1b900 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1b910 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
1b920 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
1b930 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  to the.** indivi
1b940 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
1b950 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69  e, or is NULL, i
1b960 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73  ndicating no mas
1b970 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1b980 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74   .** (single dat
1b990 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
1b9a0 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  n)..**.** When t
1b9b0 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  his is called, t
1b9c0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1b9d0 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  l should already
1b9e0 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72   have been.** cr
1b9f0 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64  eated, populated
1ba00 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e   with this journ
1ba10 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73  al pointer and s
1ba20 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
1ba30 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69  *.** Once this i
1ba40 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65  s routine has re
1ba50 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79  turned, the only
1ba60 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20   thing required 
1ba70 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65  to commit.** the
1ba80 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1ba90 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  on for this data
1baa0 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20  base file is to 
1bab0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
1bac0 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  al..*/.int sqlit
1bad0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1bae0 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20  seOne(Btree *p, 
1baf0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
1bb00 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ter){.  int rc =
1bb10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
1bb20 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1bb30 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
1bb40 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1bb50 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c   p->pBt;.    sql
1bb60 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1bb70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1bb80 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1bb90 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
1bba0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
1bbb0 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75     rc = autoVacu
1bbc0 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20  umCommit(pBt);. 
1bbd0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1bbe0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1bbf0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1bc00 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
1bc10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1bc20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1bc30 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1bc40 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
1bc50 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
1bc60 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72  mage(pBt->pPager
1bc70 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
1bc80 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1bc90 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1bca0 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
1bcb0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61  pBt->pPager, zMa
1bcc0 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71  ster, 0);.    sq
1bcd0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1bce0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
1bcf0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1bd00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1bd10 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20  alled from both 
1bd20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1bd30 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52  Two() and BtreeR
1bd40 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20  ollback().** at 
1bd50 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
1bd60 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  f a transaction.
1bd70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1bd80 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
1bd90 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ion(Btree *p){. 
1bda0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1bdb0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
1bdc0 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
1bdd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1bde0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1bdf0 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  (p) );..#ifndef 
1be00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1be10 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44  VACUUM.  pBt->bD
1be20 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23  oTruncate = 0;.#
1be30 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69  endif.  if( p->i
1be40 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
1be50 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65  E && db->nVdbeRe
1be60 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ad>1 ){.    /* I
1be70 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  f there are othe
1be80 72 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  r active stateme
1be90 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  nts that belong 
1bea0 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
1beb0 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20  .    ** handle, 
1bec0 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72  downgrade to a r
1bed0 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
1bee0 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20  tion. The other 
1bef0 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a  statements.    *
1bf00 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  * may still be r
1bf10 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
1bf20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20  database.  */.  
1bf30 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68    downgradeAllSh
1bf40 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1bf50 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69  cks(p);.    p->i
1bf60 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52  nTrans = TRANS_R
1bf70 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EAD;.  }else{.  
1bf80 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
1bf90 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20  le had any kind 
1bfa0 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  of transaction o
1bfb0 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74  pen, decrement t
1bfc0 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  he .    ** trans
1bfd0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20  action count of 
1bfe0 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
1bff0 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63  . If the transac
1c000 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20  tion count .    
1c010 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65  ** reaches 0, se
1c020 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
1c030 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
1c040 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65  . The unlockBtre
1c050 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20  eIfUnused().    
1c060 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69  ** call below wi
1c070 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  ll unlock the pa
1c080 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ger.  */.    if(
1c090 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
1c0a0 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
1c0b0 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
1c0c0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
1c0d0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  );.      pBt->nT
1c0e0 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
1c0f0 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
1c100 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
1c110 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54          pBt->inT
1c120 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
1c130 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  NS_NONE;.      }
1c140 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
1c150 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  et the current t
1c160 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
1c170 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
1c180 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20  nd unlock the . 
1c190 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74     ** pager if t
1c1a0 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20  his call closed 
1c1b0 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72  the only read or
1c1c0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1c1d0 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69  on.  */.    p->i
1c1e0 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
1c1f0 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  ONE;.    unlockB
1c200 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
1c210 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
1c220 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a  ntegrity(p);.}..
1c230 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
1c240 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72   transaction cur
1c250 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
1c260 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ss..**.** This r
1c270 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
1c280 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  s the second pha
1c290 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20  se of a 2-phase 
1c2a0 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20  commit.  The.** 
1c2b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1c2c0 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75  itPhaseOne() rou
1c2d0 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
1c2e0 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68  rst phase and sh
1c2f0 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b  ould.** be invok
1c300 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ed prior to call
1c310 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1c320 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74  .  The sqlite3Bt
1c330 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1c340 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64  e().** routine d
1c350 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20  id all the work 
1c360 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72  of writing infor
1c370 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69  mation out to di
1c380 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20  sk and flushing 
1c390 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
1c3a0 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65  so that they are
1c3b0 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68   written onto th
1c3c0 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20  e disk platter. 
1c3d0 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75   All this.** rou
1c3e0 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69  tine has to do i
1c3f0 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e  s delete or trun
1c400 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65  cate or zero the
1c410 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a   header in the.*
1c420 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
1c430 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61  ournal (which ca
1c440 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63  uses the transac
1c450 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20  tion to commit) 
1c460 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b  and.** drop lock
1c470 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  s..**.** Normall
1c480 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  y, if an error o
1c490 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
1c4a0 70 61 67 65 72 20 6c 61 79 65 72 20 69 73 20 61  pager layer is a
1c4b0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a  ttempting to .**
1c4c0 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e   finalize the un
1c4d0 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  derlying journal
1c4e0 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63   file, this func
1c4f0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
1c500 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65  error and.** the
1c510 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c   upper layer wil
1c520 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c  l attempt a roll
1c530 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69  back. However, i
1c540 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
1c550 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d  ument.** is non-
1c560 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62  zero then this b
1c570 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f  -tree transactio
1c580 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d  n is part of a m
1c590 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72  ulti-file .** tr
1c5a0 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
1c5b0 69 73 20 63 61 73 65 2c 20 74 68 65 20 74 72 61  is case, the tra
1c5c0 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
1c5d0 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74  eady been commit
1c5e0 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65  ted .** (by dele
1c5f0 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ting a master jo
1c600 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
1c610 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
1c620 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20  ignore this .** 
1c630 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e  functions return
1c640 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20   code. So, even 
1c650 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
1c660 72 73 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  rs in the pager 
1c670 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20  layer,.** reset 
1c680 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
1c690 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  ts internal stat
1c6a0 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  e to indicate th
1c6b0 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20  at the write.** 
1c6c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1c6d0 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69  been closed. Thi
1c6e0 73 20 69 73 20 71 75 69 74 65 20 73 61 66 65 2c  s is quite safe,
1c6f0 20 61 73 20 74 68 65 20 70 61 67 65 72 20 77 69   as the pager wi
1c700 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73  ll have.** trans
1c710 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65  itioned to the e
1c720 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  rror state..**.*
1c730 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
1c740 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
1c750 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1c760 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
1c770 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
1c780 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
1c790 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
1c7a0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
1c7b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1c7c0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
1c7d0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c  tree *p, int bCl
1c7e0 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70  eanup){..  if( p
1c7f0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1c800 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53  _NONE ) return S
1c810 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
1c820 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1c830 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
1c840 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
1c850 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  the handle has a
1c860 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1c870 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20  on open, commit 
1c880 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
1c890 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  s .  ** transact
1c8a0 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20  ion and set the 
1c8b0 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
1c8c0 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f  TRANS_READ..  */
1c8d0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1c8e0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1c8f0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
1c900 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1c910 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
1c920 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1c930 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1c940 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73  WRITE );.    ass
1c950 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
1c960 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
1c970 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1c980 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
1c990 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
1c9a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c9b0 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d  _OK && bCleanup=
1c9c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
1c9d0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1c9e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1c9f0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  c;.    }.    pBt
1ca00 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1ca10 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
1ca20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
1ca30 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d  ontent(pBt);.  }
1ca40 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
1ca50 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
1ca60 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1ca70 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
1ca80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1ca90 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20   Do both phases 
1caa0 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a  of a commit..*/.
1cab0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1cac0 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29  Commit(Btree *p)
1cad0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1cae0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1caf0 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  p);.  rc = sqlit
1cb00 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1cb10 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69  seOne(p, 0);.  i
1cb20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cb30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1cb40 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1cb50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20  haseTwo(p, 0);. 
1cb60 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
1cb70 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1cb80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1cb90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
1cba0 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20  ts the state to 
1cbb0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64  CURSOR_FAULT and
1cbc0 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f   the error.** co
1cbd0 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f  de to errCode fo
1cbe0 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f  r every cursor o
1cbf0 6e 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20  n BtShared that 
1cc00 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65  pBtree.** refere
1cc10 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72  nces..**.** Ever
1cc20 79 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70  y cursor is trip
1cc30 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63  ped, including c
1cc40 75 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f  ursors that belo
1cc50 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64  ng.** to other d
1cc60 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1cc70 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20  ons that happen 
1cc80 74 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a  to be sharing.**
1cc90 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20   the cache with 
1cca0 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pBtree..**.** Th
1ccb0 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20  is routine gets 
1ccc0 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f  called when a ro
1ccd0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a  llback occurs..*
1cce0 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73  * All cursors us
1ccf0 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63  ing the same cac
1cd00 68 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70  he must be tripp
1cd10 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74  ed.** to prevent
1cd20 20 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e   them from tryin
1cd30 67 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72  g to use the btr
1cd40 65 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  ee after.** the 
1cd50 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72  rollback.  The r
1cd60 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65  ollback may have
1cd70 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a   deleted tables.
1cd80 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74  ** or moved root
1cd90 20 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73   pages, so it is
1cda0 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20   not sufficient 
1cdb0 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73  to.** save the s
1cdc0 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73  tate of the curs
1cdd0 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  or.  The cursor 
1cde0 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c  must be.** inval
1cdf0 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  idated..*/.void 
1ce00 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
1ce10 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65  AllCursors(Btree
1ce20 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72   *pBtree, int er
1ce30 72 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73  rCode){.  BtCurs
1ce40 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
1ce50 72 65 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ree==0 ) return;
1ce60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1ce70 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
1ce80 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
1ce90 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
1cea0 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1ceb0 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74  int i;.    sqlit
1cec0 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
1ced0 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53  or(p);.    p->eS
1cee0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41  tate = CURSOR_FA
1cef0 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70  ULT;.    p->skip
1cf00 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a  Next = errCode;.
1cf10 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
1cf20 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  p->iPage; i++){.
1cf30 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1cf40 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  e(p->apPage[i]);
1cf50 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65  .      p->apPage
1cf60 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
1cf70 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
1cf80 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1cf90 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
1cfa0 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
1cfb0 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20  n in progress.  
1cfc0 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  All cursors will
1cfd0 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64   be.** invalided
1cfe0 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
1cff0 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  on.  Any attempt
1d000 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72   to use a cursor
1d010 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65  .** that was ope
1d020 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  n at the beginni
1d030 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61  ng of this opera
1d040 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
1d050 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  .** in an error.
1d060 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
1d070 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
1d080 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
1d090 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
1d0a0 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
1d0b0 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
1d0c0 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
1d0d0 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
1d0e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d0f0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
1d100 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70  ree *p, int trip
1d110 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Code){.  int rc;
1d120 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1d130 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
1d140 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
1d150 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1d160 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69  er(p);.  if( tri
1d170 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
1d180 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69   ){.    rc = tri
1d190 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43  pCode = saveAllC
1d1a0 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
1d1b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1d1c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d1d0 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f    }.  if( tripCo
1d1e0 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  de ){.    sqlite
1d1f0 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
1d200 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65  sors(p, tripCode
1d210 29 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e  );.  }.  btreeIn
1d220 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69  tegrity(p);..  i
1d230 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1d240 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1d250 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
1d260 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52  assert( TRANS_WR
1d270 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e  ITE==pBt->inTran
1d280 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72  saction );.    r
1d290 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  c2 = sqlite3Page
1d2a0 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  rRollback(pBt->p
1d2b0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1d2c0 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
1d2d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
1d2e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1d2f0 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
1d300 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20   have destroyed 
1d310 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  the pPage1->aDat
1d320 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20  a value.  So.   
1d330 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65   ** call btreeGe
1d340 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
1d350 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a  1 again to make.
1d360 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67      ** sure pPag
1d370 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74  e1->aData is set
1d380 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
1d390 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50     if( btreeGetP
1d3a0 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
1d3b0 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  ge1, 0)==SQLITE_
1d3c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
1d3d0 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
1d3e0 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
1d3f0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74  >aData);.      t
1d400 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d  estcase( nPage==
1d410 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 );.      if( n
1d420 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65  Page==0 ) sqlite
1d430 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1d440 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
1d450 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  age);.      test
1d460 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65  case( pBt->nPage
1d470 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20  !=nPage );.     
1d480 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
1d490 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  age;.      relea
1d4a0 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
1d4b0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1d4c0 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  ( countValidCurs
1d4d0 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29  ors(pBt, 1)==0 )
1d4e0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  ;.    pBt->inTra
1d4f0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1d500 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65  _READ;.    btree
1d510 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
1d520 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
1d530 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
1d540 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
1d550 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1d560 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d570 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
1d580 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
1d590 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
1d5a0 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72  saction can be r
1d5b0 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e  olled.** back in
1d5c0 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
1d5d0 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
1d5e0 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74  ion. You must st
1d5f0 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
1d600 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61  n .** before sta
1d610 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73  rting a subtrans
1d620 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
1d630 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
1d640 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
1d650 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69  y .** if the mai
1d660 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  n transaction co
1d670 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
1d680 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ack..**.** State
1d690 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
1d6a0 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
1d6b0 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
1d6c0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
1d6d0 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
1d6e0 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
1d6f0 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
1d700 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
1d710 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
1d720 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
1d730 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
1d740 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
1d750 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
1d760 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
1d770 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
1d780 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
1d790 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
1d7a0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61  ion..**.** A sta
1d7b0 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73  tement sub-trans
1d7c0 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  action is implem
1d7d0 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e  ented as an anon
1d7e0 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e  ymous savepoint.
1d7f0 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61   The.** value pa
1d800 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
1d810 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
1d820 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
1d830 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a   of savepoints,.
1d840 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
1d850 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73   new anonymous s
1d860 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f  avepoint, open o
1d870 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e  n the B-Tree. i.
1d880 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61  e. if there.** a
1d890 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76  re no active sav
1d8a0 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f  epoints and no o
1d8b0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74  ther statement-t
1d8c0 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e  ransactions open
1d8d0 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20  ,.** iStatement 
1d8e0 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79  is 1. This anony
1d8f0 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63  mous savepoint c
1d900 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f  an be released o
1d910 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a  r rolled back.**
1d920 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
1d930 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
1d940 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
1d950 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1d960 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20  BeginStmt(Btree 
1d970 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65  *p, int iStateme
1d980 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nt){.  int rc;. 
1d990 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1d9a0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
1d9b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1d9c0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
1d9d0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1d9e0 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
1d9f0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1da00 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d   BTS_READ_ONLY)=
1da10 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1da20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  iStatement>0 );.
1da30 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
1da40 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76  ment>p->db->nSav
1da50 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65  epoint );.  asse
1da60 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1da70 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1da80 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74  ITE );.  /* At t
1da90 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20  he pager level, 
1daa0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
1dab0 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76  saction is a sav
1dac0 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a  epoint with.  **
1dad0 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
1dae0 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70  r than all savep
1daf0 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78  oints created ex
1db00 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20  plicitly using. 
1db10 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
1db20 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61  ts. It is illega
1db30 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61  l to open, relea
1db40 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
1db50 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76  ny.  ** such sav
1db60 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68  epoints while th
1db70 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
1db80 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
1db90 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a  t is active..  *
1dba0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1dbb0 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
1dbc0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1dbd0 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73  iStatement);.  s
1dbe0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1dbf0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1dc00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
1dc10 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
1dc20 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
1dc30 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53   op, is always S
1dc40 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1dc50 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e  K.** or SAVEPOIN
1dc60 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20  T_RELEASE. This 
1dc70 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20  function either 
1dc80 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c  releases or roll
1dc90 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61  s back the.** sa
1dca0 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69  vepoint identifi
1dcb0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
1dcc0 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65  iSavepoint, depe
1dcd0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c  nding on the val
1dce0 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a  ue .** of op..**
1dcf0 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53  .** Normally, iS
1dd00 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
1dd10 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
1dd20 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76  l to zero. Howev
1dd30 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20  er, if op is.** 
1dd40 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1dd50 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f  CK, then iSavepo
1dd60 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  int may also be 
1dd70 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  -1. In this case
1dd80 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
1dd90 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  s of the entire 
1dda0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20  transaction are 
1ddb0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69  rolled back. Thi
1ddc0 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a  s is different.*
1ddd0 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20  * from a normal 
1dde0 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
1ddf0 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b  back, as no lock
1de00 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61  s are released a
1de10 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61  nd the.** transa
1de20 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70  ction remains op
1de30 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
1de40 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
1de50 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f  (Btree *p, int o
1de60 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
1de70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1de80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1de90 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  p && p->inTrans=
1dea0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1deb0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1dec0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1ded0 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45  assert( op==SAVE
1dee0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c  POINT_RELEASE ||
1def0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1df00 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61  OLLBACK );.    a
1df10 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
1df20 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f  t>=0 || (iSavepo
1df30 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53  int==-1 && op==S
1df40 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1df50 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  K) );.    sqlite
1df60 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1df70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1df80 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
1df90 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20  Bt->pPager, op, 
1dfa0 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
1dfb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dfc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
1dfd0 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20  iSavepoint<0 && 
1dfe0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1dff0 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45   BTS_INITIALLY_E
1e000 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  MPTY)!=0 ){.    
1e010 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1e020 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1e030 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
1e040 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  se(pBt);.      p
1e050 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34  Bt->nPage = get4
1e060 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70  byte(28 + pBt->p
1e070 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a  Page1->aData);..
1e080 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1e090 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77  abase size was w
1e0a0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1e0b0 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65  offset 28 of the
1e0c0 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a   header.      **
1e0d0 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
1e0e0 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73  ction started, s
1e0f0 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
1e100 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73  he value at offs
1e110 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69  et.      ** 28 i
1e120 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20  s nonzero. */.  
1e130 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1e140 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  >nPage>0 );.    
1e150 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
1e160 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
1e170 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e180 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
1e190 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
1e1a0 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
1e1b0 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
1e1c0 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20  e.** iTable. If 
1e1d0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
1e1e0 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
1e1f0 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1e200 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hat.** the calle
1e210 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74  r already has at
1e220 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e   least a read-on
1e230 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ly transaction o
1e240 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61  pen.** on the da
1e250 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20  tabase already. 
1e260 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  If a write-curso
1e270 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
1e280 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  then.** the call
1e290 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
1e2a0 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
1e2b0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
1e2c0 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  .**.** If wrFlag
1e2d0 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==0, then the cu
1e2e0 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65  rsor can only be
1e2f0 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
1e300 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  g..** If wrFlag=
1e310 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =1, then the cur
1e320 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  sor can be used 
1e330 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66  for reading or f
1e340 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66  or.** writing if
1e350 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
1e360 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72  s for writing ar
1e370 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65  e also met.  The
1e380 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f  se.** are the co
1e390 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
1e3a0 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
1e3b0 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74  er for writing t
1e3c0 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a  o.** be allowed:
1e3d0 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
1e3e0 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
1e3f0 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
1e400 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a   wrFlag==1.**.**
1e410 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62   2:  Other datab
1e420 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
1e430 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73  that share the s
1e440 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a  ame pager cache.
1e450 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68  **     but which
1e460 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
1e470 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
1e480 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68   state may not h
1e490 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f  ave.**     curso
1e4a0 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46  rs open with wrF
1e4b0 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61  lag==0 on the sa
1e4c0 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72  me table.  Other
1e4d0 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20  wise.**     the 
1e4e0 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
1e4f0 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f  this write curso
1e500 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62  r would be visib
1e510 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  le to.**     the
1e520 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e   read cursors in
1e530 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62   the other datab
1e540 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
1e550 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61  **.** 3:  The da
1e560 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77  tabase must be w
1e570 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20  ritable (not on 
1e580 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29  read-only media)
1e590 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65  .**.** 4:  There
1e5a0 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69   must be an acti
1e5b0 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ve transaction..
1e5c0 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e  **.** No checkin
1e5d0 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b  g is done to mak
1e5e0 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65  e sure that page
1e5f0 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69   iTable really i
1e600 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
1e610 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20  ge of a b-tree. 
1e620 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
1e630 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61  hen the cursor a
1e640 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20  cquired.** will 
1e650 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
1e660 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ly..**.** It is 
1e670 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1e680 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1e690 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65  sorZero() has be
1e6a0 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20  en called.** on 
1e6b0 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69  pCur to initiali
1e6c0 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70  ze the memory sp
1e6d0 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  ace prior to inv
1e6e0 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
1e6f0 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
1e700 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20  t btreeCursor(. 
1e710 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
1e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e730 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
1e740 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
1e750 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1e760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e770 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
1e780 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
1e790 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
1e7c0 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
1e7d0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
1e7e0 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1e7f0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1e800 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
1e810 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  o comparison fun
1e820 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72  ction */.  BtCur
1e830 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e850 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e    /* Space for n
1e860 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  ew cursor */.){.
1e870 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1e880 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
1e890 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
1e8a0 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65  ed b-tree handle
1e8b0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
1e8c0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1e8d0 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
1e8e0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1e8f0 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a  || wrFlag==1 );.
1e900 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1e910 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65  ing assert state
1e920 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61  ments verify tha
1e930 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  t if this is a s
1e940 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d  harable .  ** b-
1e950 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74  tree database, t
1e960 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
1e970 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71   holding the req
1e980 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b  uired table lock
1e990 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61  s, .  ** and tha
1e9a0 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  t no other conne
1e9b0 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70  ction has any op
1e9c0 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63  en cursor that c
1e9d0 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20  onflicts with . 
1e9e0 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20   ** this lock.  
1e9f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  */.  assert( has
1ea00 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1ea10 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
1ea20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46  pKeyInfo!=0, wrF
1ea30 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  lag+1) );.  asse
1ea40 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1ea50 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1ea60 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b  ts(p, iTable) );
1ea70 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
1ea80 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
1ea90 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71  s opened the req
1eaa0 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f  uired transactio
1eab0 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
1eac0 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
1ead0 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  _NONE );.  asser
1eae0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
1eaf0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1eb00 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
1eb10 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
1eb20 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
1eb30 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28  >aData );..  if(
1eb40 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26 26   NEVER(wrFlag &&
1eb50 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1eb60 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1eb70 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  !=0) ){.    retu
1eb80 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
1eb90 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 72  LY;.  }.  if( wr
1eba0 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f  Flag ){.    allo
1ebb0 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
1ebc0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  t);.    if( pBt-
1ebd0 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20  >pTmpSpace==0 ) 
1ebe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1ebf0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  MEM;.  }.  if( i
1ec00 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65  Table==1 && btre
1ec10 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d  ePagecount(pBt)=
1ec20 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
1ec30 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20  ( wrFlag==0 );. 
1ec40 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20     iTable = 0;. 
1ec50 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61   }..  /* Now tha
1ec60 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72  t no other error
1ec70 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e  s can occur, fin
1ec80 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  ish filling in t
1ec90 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a  he BtCursor.  **
1eca0 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c   variables and l
1ecb0 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69  ink the cursor i
1ecc0 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64  nto the BtShared
1ecd0 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75   list.  */.  pCu
1ece0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50  r->pgnoRoot = (P
1ecf0 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43  gno)iTable;.  pC
1ed00 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a  ur->iPage = -1;.
1ed10 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f    pCur->pKeyInfo
1ed20 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
1ed30 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b  Cur->pBtree = p;
1ed40 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70  .  pCur->pBt = p
1ed50 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72  Bt;.  assert( wr
1ed60 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61  Flag==0 || wrFla
1ed70 67 3d 3d 42 54 43 46 5f 57 72 69 74 65 46 6c 61  g==BTCF_WriteFla
1ed80 67 20 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  g );.  pCur->cur
1ed90 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 3b 0a  Flags = wrFlag;.
1eda0 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
1edb0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
1edc0 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
1edd0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  ){.    pCur->pNe
1ede0 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
1edf0 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75  ;.  }.  pBt->pCu
1ee00 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
1ee10 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
1ee20 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
1ee30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ee40 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
1ee50 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
1ee60 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
1ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ee90 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
1eea0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
1eeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eec0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
1eed0 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
1eee0 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
1eef0 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
1ef00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef10 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
1ef20 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
1ef30 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
1ef40 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef60 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
1ef70 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f  to xCompare() */
1ef80 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1ef90 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1efb0 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73  * Write new curs
1efc0 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  or here */.){.  
1efd0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1efe0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1eff0 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73    rc = btreeCurs
1f000 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72  or(p, iTable, wr
1f010 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20  Flag, pKeyInfo, 
1f020 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  pCur);.  sqlite3
1f030 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1f040 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f050 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1f060 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73  size of a BtCurs
1f070 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74  or object in byt
1f080 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
1f090 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65 65  nterfaces is nee
1f0a0 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65 72  ded so that user
1f0b0 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e  s of cursors can
1f0c0 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20   preallocate.** 
1f0d0 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61  sufficient stora
1f0e0 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72  ge to hold a cur
1f0f0 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72 73  sor.  The BtCurs
1f100 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61  or object is opa
1f110 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20  que.** to users 
1f120 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64  so they cannot d
1f130 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74  o the sizeof() t
1f140 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79  hemselves - they
1f150 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68   must call.** th
1f160 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69  is routine..*/.i
1f170 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1f180 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b  ursorSize(void){
1f190 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38  .  return ROUND8
1f1a0 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72  (sizeof(BtCursor
1f1b0 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ));.}../*.** Ini
1f1c0 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74  tialize memory t
1f1d0 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76  hat will be conv
1f1e0 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43  erted into a BtC
1f1f0 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a  ursor object..**
1f200 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61  .** The simple a
1f210 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75  pproach here wou
1f220 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28  ld be to memset(
1f230 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a  ) the entire obj
1f240 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20  ect.** to zero. 
1f250 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75   But it turns ou
1f260 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61 67  t that the apPag
1f270 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20  e[] and aiIdx[] 
1f280 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74  arrays.** do not
1f290 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f   need to be zero
1f2a0 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65 20  ed and they are 
1f2b0 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e  large, so we can
1f2c0 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f   save a lot.** o
1f2d0 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b  f run-time by sk
1f2e0 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
1f2f0 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f  alization of tho
1f300 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a  se elements..*/.
1f310 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
1f320 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75  eCursorZero(BtCu
1f330 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73  rsor *p){.  mems
1f340 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f  et(p, 0, offseto
1f350 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67  f(BtCursor, iPag
1f360 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  e));.}../*.** Cl
1f370 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54  ose a cursor.  T
1f380 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20  he read lock on 
1f390 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f3a0 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a  e is released.**
1f3b0 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63   when the last c
1f3c0 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e  ursor is closed.
1f3d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1f3e0 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
1f3f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1f400 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
1f410 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
1f420 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
1f430 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1f440 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1f450 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73  pCur->pBt;.    s
1f460 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1f470 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71  (pBtree);.    sq
1f480 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
1f490 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20  ursor(pCur);.   
1f4a0 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76   if( pCur->pPrev
1f4b0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1f4c0 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
1f4d0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
1f4e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74  }else{.      pBt
1f4f0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
1f500 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
1f510 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65     if( pCur->pNe
1f520 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  xt ){.      pCur
1f530 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
1f540 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20   pCur->pPrev;.  
1f550 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
1f560 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
1f570 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
1f580 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
1f590 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
1f5a0 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
1f5b0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
1f5c0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1f5d0 28 70 42 74 72 65 65 2d 3e 64 62 2c 20 70 43 75  (pBtree->db, pCu
1f5e0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  r->aOverflow);. 
1f5f0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72     /* sqlite3_fr
1f600 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20  ee(pCur); */.   
1f610 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1f620 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
1f630 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f640 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  OK;.}../*.** Mak
1f650 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72  e sure the BtCur
1f660 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68  sor* given in th
1f670 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61  e argument has a
1f680 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73   valid.** BtCurs
1f690 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72  or.info structur
1f6a0 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
1f6b0 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20   already valid, 
1f6c0 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72  call.** btreePar
1f6d0 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c  seCell() to fill
1f6e0 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74   it in..**.** Bt
1f6f0 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61  Cursor.info is a
1f700 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e   cache of the in
1f710 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
1f720 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a   current cell..*
1f730 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63  * Using this cac
1f740 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e  he reduces the n
1f750 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74  umber of calls t
1f760 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  o btreeParseCell
1f770 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30  ()..**.** 2007-0
1f780 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73 20  6-25:  There is 
1f790 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65  a bug in some ve
1f7a0 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74  rsions of MSVC t
1f7b0 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a  hat cause the.**
1f7c0 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61   compiler to cra
1f7d0 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49  sh when getCellI
1f7e0 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65  nfo() is impleme
1f7f0 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e  nted as a macro.
1f800 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69 73  .** But there is
1f810 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73   a measureable s
1f820 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20 74  peed advantage t
1f830 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72  o using the macr
1f840 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65  o on gcc.** (whe
1f850 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20  n less compiler 
1f860 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69  optimizations li
1f870 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72  ke -Os or -O0 ar
1f880 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  e used and the.*
1f890 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f  * compiler is no
1f8a0 74 20 64 6f 69 6e 67 20 61 67 67 72 65 73 73 69  t doing aggressi
1f8b0 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53  ve inlining.)  S
1f8c0 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20  o we use a real 
1f8d0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  function.** for 
1f8e0 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f  MSVC and a macro
1f8f0 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20   for everything 
1f900 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32  else.  Ticket #2
1f910 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  457..*/.#ifndef 
1f920 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  NDEBUG.  static 
1f930 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49  void assertCellI
1f940 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
1f950 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  ur){.    CellInf
1f960 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  o info;.    int 
1f970 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
1f980 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  age;.    memset(
1f990 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  &info, 0, sizeof
1f9a0 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72  (info));.    btr
1f9b0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
1f9c0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
1f9d0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61   pCur->aiIdx[iPa
1f9e0 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ge], &info);.   
1f9f0 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
1fa00 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69  _DB || memcmp(&i
1fa10 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  nfo, &pCur->info
1fa20 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d  , sizeof(info))=
1fa30 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  =0 );.  }.#else.
1fa40 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74    #define assert
1fa50 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64  CellInfo(x).#end
1fa60 69 66 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56  if.#ifdef _MSC_V
1fa70 45 52 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65  ER.  /* Use a re
1fa80 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d  al function in M
1fa90 53 56 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75  SVC to work arou
1faa0 6e 64 20 62 75 67 73 20 69 6e 20 74 68 61 74 20  nd bugs in that 
1fab0 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73  compiler. */.  s
1fac0 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 43 65  tatic void getCe
1fad0 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
1fae0 2a 70 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20  *pCur){.    if( 
1faf0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1fb00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
1fb10 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
1fb20 50 61 67 65 3b 0a 20 20 20 20 20 20 62 74 72 65  Page;.      btre
1fb30 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
1fb40 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70  >apPage[iPage],p
1fb50 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
1fb60 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  ],&pCur->info);.
1fb70 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
1fb80 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
1fb90 69 64 4e 4b 65 79 3b 0a 20 20 20 20 7d 65 6c 73  idNKey;.    }els
1fba0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43  e{.      assertC
1fbb0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1fbc0 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f     }.  }.#else /
1fbd0 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45  * if not _MSC_VE
1fbe0 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20  R */.  /* Use a 
1fbf0 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68  macro in all oth
1fc00 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20  er compilers so 
1fc10 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f  that the functio
1fc20 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a  n is inlined */.
1fc30 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49  #define getCellI
1fc40 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20  nfo(pCur)       
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1fc80 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66  .  if( pCur->inf
1fc90 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20  o.nSize==0 ){   
1fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcd0 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  \.    int iPage 
1fce0 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20  = pCur->iPage;  
1fcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd20 20 5c 0a 20 20 20 20 62 74 72 65 65 50 61 72 73   \.    btreePars
1fd30 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1fd40 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
1fd50 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
1fd60 75 72 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20 20  ur->info);      
1fd70 20 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 63 75    \.    pCur->cu
1fd80 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
1fd90 61 6c 69 64 4e 4b 65 79 3b 20 20 20 20 20 20 20  alidNKey;       
1fda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdc0 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20     \.  }else{   
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe10 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74      \.    assert
1fe20 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20  CellInfo(pCur); 
1fe30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe60 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69       \.  }.#endi
1fe70 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f  f /* _MSC_VER */
1fe80 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1fe90 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f    /* The next ro
1fea0 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20  utine used only 
1feb0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
1fec0 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a  statements */./*
1fed0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1fee0 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43  if the given BtC
1fef0 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
1ff00 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20   A valid cursor 
1ff10 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69  is one.** that i
1ff20 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
1ff30 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e  ting to a row in
1ff40 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74   a (non-empty) t
1ff50 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  able..** This is
1ff60 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20   a verification 
1ff70 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1ff80 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
1ff90 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
1ffa0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1ffb0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
1ffc0 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
1ffd0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
1ffe0 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
1fff0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
20000 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42  }.#endif /* NDEB
20010 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  UG */../*.** Set
20020 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73   *pSize to the s
20030 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65  ize of the buffe
20040 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  r needed to hold
20050 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
20060 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65   the key for the
20070 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
20080 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
20090 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a  s not pointing.*
200a0 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  * to a valid ent
200b0 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65  ry, *pSize is se
200c0 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46  t to 0. .**.** F
200d0 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
200e0 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20  the INTKEY flag 
200f0 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  set, this routin
20100 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65  e returns the ke
20110 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74  y.** itself, not
20120 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
20130 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e  ytes in the key.
20140 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
20150 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20  r must position 
20160 74 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72  the cursor prior
20170 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
20180 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a  s routine..** .*
20190 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
201a0 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20  annot fail.  It 
201b0 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
201c0 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69  QLITE_OK.  .*/.i
201d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
201e0 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  eySize(BtCursor 
201f0 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a  *pCur, i64 *pSiz
20200 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  e){.  assert( cu
20210 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
20220 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
20230 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
20240 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
20250 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
20260 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
20270 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
20280 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
20290 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d   ){.    *pSize =
202a0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
202b0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
202c0 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d  r);.    *pSize =
202d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
202e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
202f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
20300 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
20310 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
20320 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20  ytes of data in 
20330 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a  the entry the.**
20340 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
20350 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a  y points to..**.
20360 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
20370 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  st guarantee tha
20380 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
20390 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f  pointing to a no
203a0 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20  n-NULL.** valid 
203b0 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72  entry.  In other
203c0 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c   words, the call
203d0 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75  ing procedure mu
203e0 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20  st guarantee.** 
203f0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
20400 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74  has Cursor.eStat
20410 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  e==CURSOR_VALID.
20420 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  .**.** Failure i
20430 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
20440 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
20450 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
20460 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d  LITE_OK..** It m
20470 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c  ight just as wel
20480 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72 65  l be a procedure
20490 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64   (returning void
204a0 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75  ) but we continu
204b0 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61  e.** to return a
204c0 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74  n integer result
204d0 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72   code for histor
204e0 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f  ical reasons..*/
204f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
20500 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
20510 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
20520 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
20530 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
20540 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
20550 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
20560 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
20570 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
20580 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
20590 69 50 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65  iPage]->intKeyLe
205a0 61 66 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43 65  af==1 );.  getCe
205b0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
205c0 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
205d0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  nfo.nPayload;.  
205e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
205f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
20600 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
20610 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
20620 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
20630 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
20640 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
20650 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
20660 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
20670 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
20680 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
20690 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
206a0 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
206b0 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
206c0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
206d0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
206e0 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
206f0 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
20700 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
20710 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
20720 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
20730 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
20740 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
20750 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
20760 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75  *.** The page nu
20770 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
20780 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
20790 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
207a0 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  t is .** written
207b0 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20   to *pPgnoNext. 
207c0 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20  If page ovfl is 
207d0 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
207e0 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20   its linked .** 
207f0 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74  list, *pPgnoNext
20800 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
20810 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67   .**.** If ppPag
20820 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61  e is not NULL, a
20830 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  nd a reference t
20840 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
20850 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69  ject correspondi
20860 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75  ng.** to page nu
20870 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f  mber pOvfl was o
20880 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70  btained, then *p
20890 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
208a0 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a  point to that.**
208b0 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69   reference. It i
208c0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
208d0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
208e0 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61  er to call relea
208f0 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a  sePage().** on *
20900 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74  ppPage to free t
20910 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e  he reference. In
20920 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
20930 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61  s obtained (beca
20940 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  use.** the point
20950 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20  er-map was used 
20960 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61  to obtain the va
20970 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65  lue for *pPgnoNe
20980 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70  xt), then.** *pp
20990 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a  Page is set to z
209a0 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
209b0 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  nt getOverflowPa
209c0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
209d0 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
209e0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
209f0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
20a00 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20  o ovfl,         
20a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
20a20 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  rent overflow pa
20a30 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d  ge number */.  M
20a40 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
20a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
20a60 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
20a70 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
20a80 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
20a90 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
20aa0 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
20ab0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
20ac0 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
20ad0 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
20ae0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
20af0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
20b00 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
20b10 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
20b20 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
20b30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
20b40 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
20b50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
20b60 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
20b70 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
20b80 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
20b90 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
20ba0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
20bb0 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
20bc0 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
20bd0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
20be0 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
20bf0 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
20c00 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
20c10 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
20c20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
20c30 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
20c40 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
20c50 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
20c60 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
20c70 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
20c80 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
20c90 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
20ca0 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
20cb0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
20cc0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
20cd0 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
20ce0 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
20cf0 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
20d00 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
20d10 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
20d20 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
20d30 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
20d40 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
20d50 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
20d60 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63  uess<=btreePagec
20d70 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
20d80 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
20d90 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
20da0 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
20db0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
20dc0 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
20dd0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
20de0 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
20df0 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
20e00 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
20e10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
20e20 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
20e30 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
20e40 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20  assert( next==0 
20e50 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  || rc==SQLITE_DO
20e60 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  NE );.  if( rc==
20e70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20e80 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
20e90 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70  ge(pBt, ovfl, &p
20ea0 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30  Page, (ppPage==0
20eb0 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  ) ? PAGER_GET_RE
20ec0 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20  ADONLY : 0);.   
20ed0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
20ee0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
20ef0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  =0 );.    if( rc
20f00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20f10 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34       next = get4
20f20 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
20f30 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  a);.    }.  }.. 
20f40 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65   *pPgnoNext = ne
20f50 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65  xt;.  if( ppPage
20f60 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
20f70 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  = pPage;.  }else
20f80 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
20f90 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
20fa0 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
20fb0 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45  TE_DONE ? SQLITE
20fc0 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  _OK : rc);.}../*
20fd0 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
20fe0 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
20ff0 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
21000 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
21010 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
21020 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
21030 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
21040 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
21050 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
21060 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
21070 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
21080 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
21090 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
210a0 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
210b0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
210c0 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
210d0 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
210e0 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
210f0 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
21100 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
21110 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
21120 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
21130 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
21140 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
21150 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
21160 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
21170 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
21180 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
21190 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
211a0 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
211b0 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
211c0 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
211d0 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
211e0 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
211f0 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
21200 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
21210 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
21220 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
21230 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21240 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
21250 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21270 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
21280 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
21290 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
212a0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
212b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
212c0 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
212d0 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
212e0 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
212f0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
21300 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
21310 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
21320 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
21330 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
21340 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
21350 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21360 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
21370 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
21380 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
21390 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
213a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
213b0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
213c0 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
213d0 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
213e0 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
213f0 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
21400 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
21410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
21430 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
21440 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
21450 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
21460 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
21470 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
21480 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
21490 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54  s pointing to. T
214a0 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65  he eOp.** argume
214b0 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  nt is interprete
214c0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
214d0 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65  .**   0: The ope
214e0 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64  ration is a read
214f0 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
21500 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
21510 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61  *   1: The opera
21520 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e  tion is a write.
21530 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
21540 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
21550 20 20 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74     2: The operat
21560 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44  ion is a read. D
21570 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74  o not populate t
21580 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
21590 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  e..**.** A total
215a0 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
215b0 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
215c0 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
215d0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
215e0 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
215f0 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
21600 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
21610 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
21620 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
21630 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
21640 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
21650 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
21660 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
21670 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
21680 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
21690 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72  rent cursor entr
216a0 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
216b0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
216c0 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70  s and the.** eOp
216d0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
216e0 20 32 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f   2, this functio
216f0 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73  n may allocate s
21700 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a  pace for and laz
21710 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65  ily .** populate
21720 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  s the overflow p
21730 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61  age-list cache a
21740 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61  rray (BtCursor.a
21750 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53  Overflow). .** S
21760 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
21770 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74  use this cache t
21780 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
21790 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
217a0 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65  ffset .** more e
217b0 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
217c0 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
217d0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
217e0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
217f0 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a  ted, it may be.*
21800 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
21810 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
21820 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
21830 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
21840 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
21850 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
21860 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
21870 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
21880 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
21890 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
218a0 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
218b0 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
218c0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
218d0 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
218e0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
218f0 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
21900 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
21910 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
21920 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
21930 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
21940 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
21950 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
21960 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
21970 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
21980 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
21990 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
219a0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
219b0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
219c0 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20  .  u32 offset,  
219d0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
219e0 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
219f0 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
21a00 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
21a10 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
21a20 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
21a30 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
21a40 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
21a50 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
21a60 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
21a70 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  / .  int eOp    
21a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
21a90 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
21aa0 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
21ab0 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
21ac0 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
21ad0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21ae0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  _OK;.  int iIdx 
21af0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
21b00 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
21b10 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
21b20 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
21b30 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
21b40 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
21b50 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
21b60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21b70 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
21b80 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
21b90 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  to */.#ifdef SQL
21ba0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
21bb0 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67  LOW_READ.  unsig
21bc0 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  ned char * const
21bd0 20 70 42 75 66 53 74 61 72 74 20 3d 20 70 42 75   pBufStart = pBu
21be0 66 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20  f;.  int bEnd;  
21bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21c10 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e  * True if readin
21c20 67 20 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61  g to end of data
21c30 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
21c40 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
21c50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
21c60 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
21c70 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
21c80 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
21c90 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
21ca0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
21cb0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
21cc0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
21cd0 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c  assert( eOp!=2 |
21ce0 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  | offset==0 );  
21cf0 20 20 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72    /* Always star
21d00 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67  t from beginning
21d10 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a   for eOp==2 */..
21d20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
21d30 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
21d40 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  = pCur->info.pPa
21d50 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20 53 51  yload;.#ifdef SQ
21d60 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
21d70 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64  FLOW_READ.  bEnd
21d80 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70   = offset+amt==p
21d90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
21da0 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  ad;.#endif.  ass
21db0 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20  ert( offset+amt 
21dc0 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  <= pCur->info.nP
21dd0 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 69 66 28  ayload );..  if(
21de0 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d   &aPayload[pCur-
21df0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20  >info.nLocal] > 
21e00 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
21e10 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29  t->usableSize] )
21e20 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20  {.    /* Trying 
21e30 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
21e40 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
21e50 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20   the data is an 
21e60 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74  error */.    ret
21e70 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
21e80 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
21e90 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61  /* Check if data
21ea0 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72   must be read/wr
21eb0 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68  itten to/from th
21ec0 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73  e btree page its
21ed0 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66  elf. */.  if( of
21ee0 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset<pCur->info.
21ef0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  nLocal ){.    in
21f00 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69  t a = amt;.    i
21f10 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72  f( a+offset>pCur
21f20 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
21f30 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d  .      a = pCur-
21f40 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f  >info.nLocal - o
21f50 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ffset;.    }.   
21f60 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
21f70 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
21f80 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65  et], pBuf, a, (e
21f90 4f 70 20 26 20 30 78 30 31 29 2c 20 70 50 61 67  Op & 0x01), pPag
21fa0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
21fb0 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
21fc0 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
21fd0 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
21fe0 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
21ff0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
22000 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  al;.  }..  if( r
22010 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
22020 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e  amt>0 ){.    con
22030 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20  st u32 ovflSize 
22040 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
22050 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73  e - 4;  /* Bytes
22060 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66   content per ovf
22070 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  l page */.    Pg
22080 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20  no nextPage;..  
22090 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
220a0 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b  4byte(&aPayload[
220b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
220c0 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  l]);..    /* If 
220d0 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76  the BtCursor.aOv
220e0 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74  erflow[] has not
220f0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
22100 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77   allocate it now
22110 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c  ..    ** Except,
22120 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65   do not allocate
22130 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72   aOverflow[] for
22140 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a   eOp==2..    **.
22150 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72      ** The aOver
22160 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20  flow[] array is 
22170 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74  sized at one ent
22180 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72  ry for each over
22190 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a  flow page.    **
221a0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
221b0 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
221c0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66   number of the f
221d0 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
221e0 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f  ge is.    ** sto
221f0 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
22200 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75  [0], etc. A valu
22210 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f  e of 0 in the aO
22220 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a  verflow[] array.
22230 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f      ** means "no
22240 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68  t yet known" (th
22250 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c  e cache is lazil
22260 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20  y populated)..  
22270 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70    */.    if( eOp
22280 21 3d 32 20 26 26 20 28 70 43 75 72 2d 3e 63 75  !=2 && (pCur->cu
22290 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
222a0 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20  lidOvfl)==0 ){. 
222b0 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
222c0 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
222d0 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
222e0 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
222f0 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
22300 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43      if( nOvfl>pC
22310 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29  ur->nOvflAlloc )
22320 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a  {.        Pgno *
22330 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71  aNew = (Pgno*)sq
22340 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 0a  lite3DbRealloc(.
22350 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
22360 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2c 20 70 43  ->pBtree->db, pC
22370 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e  ur->aOverflow, n
22380 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67  Ovfl*2*sizeof(Pg
22390 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  no).        );. 
223a0 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d         if( aNew=
223b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
223c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
223d0 4d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  M;.        }else
223e0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  {.          pCur
223f0 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e  ->nOvflAlloc = n
22400 4f 76 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20  Ovfl*2;.        
22410 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
22420 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20  w = aNew;.      
22430 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
22440 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22450 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  _OK ){.        m
22460 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65  emset(pCur->aOve
22470 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a  rflow, 0, nOvfl*
22480 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20  sizeof(Pgno));. 
22490 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
224a0 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61  Flags |= BTCF_Va
224b0 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d  lidOvfl;.      }
224c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
224d0 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  f the overflow p
224e0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
224f0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
22500 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  d and the.    **
22510 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
22520 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76  irst required ov
22530 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76  erflow page is v
22540 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a  alid, skip.    *
22550 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74  * directly to it
22560 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
22570 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
22580 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
22590 6c 29 21 3d 30 0a 20 20 20 20 20 26 26 20 70 43  l)!=0.     && pC
225a0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66  ur->aOverflow[of
225b0 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20  fset/ovflSize]. 
225c0 20 20 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78     ){.      iIdx
225d0 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53   = (offset/ovflS
225e0 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74  ize);.      next
225f0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
22600 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20  erflow[iIdx];.  
22610 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66      offset = (of
22620 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset%ovflSize);.
22630 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20      }..    for( 
22640 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
22650 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74  && amt>0 && next
22660 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a  Page; iIdx++){..
22670 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75        /* If requ
22680 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74  ired, populate t
22690 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
226a0 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a  -list cache. */.
226b0 20 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d        if( (pCur-
226c0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
226d0 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29  _ValidOvfl)!=0 )
226e0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
226f0 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  (!pCur->aOverflo
22700 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d  w[iIdx] || pCur-
22710 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
22720 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20  ==nextPage);.   
22730 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
22740 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78  flow[iIdx] = nex
22750 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tPage;.      }..
22760 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74        if( offset
22770 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  >=ovflSize ){.  
22780 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
22790 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64  y reason to read
227a0 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f   this page is to
227b0 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   obtain the page
227c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
227d0 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  er for the next 
227e0 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
227f0 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
22800 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
22810 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75  data is not requ
22820 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74  ired. So first t
22830 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ry to lookup the
22840 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20   overflow.      
22850 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63    ** page-list c
22860 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68  ache, if any, th
22870 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  en fall back to 
22880 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  the getOverflowP
22890 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a  age().        **
228a0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
228b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
228c0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61   Note that the a
228d0 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
228e0 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
228f0 65 64 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d  ed because eOp!=
22900 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72  2.        ** her
22910 65 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74  e.  If eOp==2, t
22920 68 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e  hen offset==0 an
22930 64 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 73  d this branch is
22940 20 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20   never taken..  
22950 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
22960 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20   assert( eOp!=2 
22970 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
22980 74 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  t( pCur->curFlag
22990 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
229a0 66 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  fl );.        if
229b0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
229c0 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20  w[iIdx+1] ){.   
229d0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
229e0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
229f0 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20  w[iIdx+1];.     
22a00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22a10 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
22a20 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65  flowPage(pBt, ne
22a30 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74  xtPage, 0, &next
22a40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
22a50 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
22a60 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
22a70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22a80 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61    /* Need to rea
22a90 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70  d this page prop
22aa0 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e  erly. It contain
22ab0 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20  s some of the.  
22ac0 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f        ** range o
22ad0 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62  f data that is b
22ae0 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d  eing read (eOp==
22af0 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65  0) or written (e
22b00 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20  Op!=0)..        
22b10 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
22b20 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
22b30 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71  _READ.        sq
22b40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a  lite3_file *fd;.
22b50 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
22b60 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
22b70 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73      if( a + offs
22b80 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b  et > ovflSize ){
22b90 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f  .          a = o
22ba0 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  vflSize - offset
22bb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66  ;.        }..#if
22bc0 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
22bd0 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
22be0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c          /* If al
22bf0 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  l the following 
22c00 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20  are true:.      
22c10 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
22c20 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72    1) this is a r
22c30 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61  ead operation, a
22c40 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  nd .        **  
22c50 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75   2) data is requ
22c60 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  ired from the st
22c70 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72  art of this over
22c80 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20  flow page, and. 
22c90 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74         **   3) t
22ca0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66  he database is f
22cb0 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a  ile-backed, and.
22cc0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20          **   4) 
22cd0 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e  there is no open
22ce0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
22cf0 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  on, and.        
22d00 2a 2a 20 20 20 35 29 20 74 68 65 20 64 61 74 61  **   5) the data
22d10 62 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41  base is not a WA
22d20 4c 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20  L database,.    
22d30 20 20 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20      **   6) all 
22d40 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 70 61  data from the pa
22d50 67 65 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  ge is being read
22d60 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 37  ..        **   7
22d70 29 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  ) at least 4 byt
22d80 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
22d90 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74  been read into t
22da0 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
22db0 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
22dc0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74       ** then dat
22dd0 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69  a can be read di
22de0 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
22df0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
22e00 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
22e10 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c  * output buffer,
22e20 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70   bypassing the p
22e30 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65  age-cache altoge
22e40 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64  ther. This speed
22e50 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20  s.        ** up 
22e60 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65  loading large re
22e70 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20  cords that span 
22e80 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61  many overflow pa
22e90 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ges..        */.
22ea0 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70          if( (eOp
22eb0 26 30 78 30 31 29 3d 3d 30 20 20 20 20 20 20 20  &0x01)==0       
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22ee0 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (1) */.       
22ef0 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20    && offset==0  
22f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a          /* (2) *
22f30 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 62  /.         && (b
22f40 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69  End || a==ovflSi
22f50 7a 65 29 20 20 20 20 20 20 20 20 20 20 20 20 20  ze)             
22f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f70 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20   /* (6) */.     
22f80 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72      && pBt->inTr
22f90 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
22fa0 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20  _READ           
22fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29            /* (4)
22fc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
22fd0 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (fd = sqlite3Pag
22fe0 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67  erFile(pBt->pPag
22ff0 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20  er))->pMethods  
23000 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20     /* (3) */.   
23010 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50        && pBt->pP
23020 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d  age1->aData[19]=
23030 3d 30 78 30 31 20 20 20 20 20 20 20 20 20 20 20  =0x01           
23040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
23050 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  5) */.         &
23060 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75  & &pBuf[-4]>=pBu
23070 66 53 74 61 72 74 20 20 20 20 20 20 20 20 20 20  fStart          
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23090 20 20 20 20 20 2f 2a 20 28 37 29 20 2a 2f 0a 20       /* (7) */. 
230a0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
230b0 20 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b      u8 aSave[4];
230c0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61  .          u8 *a
230d0 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34  Write = &pBuf[-4
230e0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ];.          ass
230f0 65 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75  ert( aWrite>=pBu
23100 66 53 74 61 72 74 20 29 3b 20 20 20 20 20 20 20  fStart );       
23110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23120 20 20 2f 2a 20 68 65 6e 63 65 20 28 37 29 20 2a    /* hence (7) *
23130 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  /.          memc
23140 70 79 28 61 53 61 76 65 2c 20 61 57 72 69 74 65  py(aSave, aWrite
23150 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
23160 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
23170 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61  ad(fd, aWrite, a
23180 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61  +4, (i64)pBt->pa
23190 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65  geSize*(nextPage
231a0 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
231b0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
231c0 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20  yte(aWrite);.   
231d0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57         memcpy(aW
231e0 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b  rite, aSave, 4);
231f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
23200 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b  endif..        {
23210 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67  .          DbPag
23220 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20  e *pDbPage;.    
23230 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23240 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
23250 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
23260 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a  Page, &pDbPage,.
23270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
23280 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 3f 20 50  eOp&0x01)==0 ? P
23290 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
232a0 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20  Y : 0).         
232b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
232c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
232d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
232e0 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65  Payload = sqlite
232f0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
23300 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
23310 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
23320 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64  et4byte(aPayload
23330 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
23340 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
23350 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
23360 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65  +4], pBuf, a, (e
23370 4f 70 26 30 78 30 31 29 2c 20 70 44 62 50 61 67  Op&0x01), pDbPag
23380 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
23390 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
233a0 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
233b0 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
233c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
233d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
233e0 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20    amt -= a;.    
233f0 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
23400 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
23410 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
23420 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
23430 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
23440 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23450 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
23460 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
23470 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79   part of the key
23480 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
23490 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
234a0 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
234b0 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
234c0 61 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70  ansferred into p
234d0 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
234e0 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
234f0 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
23500 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
23510 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43  t ensure that pC
23520 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  ur is pointing t
23530 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a  o a valid row.**
23540 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
23550 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
23560 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
23570 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
23580 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
23590 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
235a0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
235b0 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
235c0 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
235d0 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
235e0 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
235f0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
23600 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
23610 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
23620 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
23630 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  uf){.  assert( c
23640 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
23650 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
23660 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
23670 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
23680 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
23690 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
236a0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
236b0 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
236c0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
236d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
236e0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
236f0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
23700 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73  .  return access
23710 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
23720 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69  fset, amt, (unsi
23730 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c  gned char*)pBuf,
23740 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   0);.}../*.** Re
23750 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ad part of the d
23760 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
23770 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
23780 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
23790 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
237a0 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f   transfered into
237b0 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
237c0 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
237d0 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
237e0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
237f0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
23800 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
23810 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
23820 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
23830 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
23840 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
23850 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
23860 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
23870 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
23880 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
23890 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ta(BtCursor *pCu
238a0 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
238b0 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
238c0 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  uf){.  int rc;..
238d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
238e0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69  MIT_INCRBLOB.  i
238f0 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  f ( pCur->eState
23900 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
23910 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
23920 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
23930 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
23940 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
23950 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
23960 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
23970 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
23980 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
23990 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
239a0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
239b0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
239c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
239d0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
239e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
239f0 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20  r->iPage] );.   
23a00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
23a10 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
23a20 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
23a30 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
23a40 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  ll );.    rc = a
23a50 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
23a60 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
23a70 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pBuf, 0);.  }.  
23a80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23a90 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
23aa0 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20  nter to payload 
23ab0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
23ac0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
23ad0 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72  the .** pCur cur
23ae0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
23af0 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72  to.  The pointer
23b00 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e   is to the begin
23b10 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  ning of.** the k
23b20 65 79 20 69 66 20 69 6e 64 65 78 20 62 74 72 65  ey if index btre
23b30 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  es (pPage->intKe
23b40 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65  y==0) and is the
23b50 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62   data for.** tab
23b60 6c 65 20 62 74 72 65 65 73 20 28 70 50 61 67 65  le btrees (pPage
23b70 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68  ->intKey==1). Th
23b80 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
23b90 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a  s of available.*
23ba0 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72  * key/data is wr
23bb0 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74  itten into *pAmt
23bc0 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20  .  If *pAmt==0, 
23bd0 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a  then the value.*
23be0 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  * returned will 
23bf0 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20 70  not be a valid p
23c00 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ointer..**.** Th
23c10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
23c20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
23c30 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72  It is common for
23c40 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a   the entire key.
23c50 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66  ** and data to f
23c60 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  it on the local 
23c70 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65  page and for the
23c80 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72  re to be no over
23c90 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20  flow.** pages.  
23ca0 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c  When that is so,
23cb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
23cc0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63  n be used to acc
23cd0 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61  ess the.** key a
23ce0 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20  nd data without 
23cf0 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20  making a copy.  
23d00 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f  If the key and/o
23d10 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a  r data spills.**
23d20 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   onto overflow p
23d30 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73  ages, then acces
23d40 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20  sPayload() must 
23d50 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73  be used to reass
23d60 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79  emble.** the key
23d70 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69  /data and copy i
23d80 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f  t into a preallo
23d90 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a  cated buffer..**
23da0 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
23db0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
23dc0 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64   routine looks d
23dd0 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65  irectly into the
23de0 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20   cached.** page 
23df0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
23e00 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74    The data might
23e10 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20   change or move 
23e20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a  the next time.**
23e30 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69   any btree routi
23e40 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ne is called..*/
23e50 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f  .static const vo
23e60 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64  id *fetchPayload
23e70 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
23e80 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
23e90 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
23ea0 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
23eb0 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74  m */.  u32 *pAmt
23ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
23ed0 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
23ee0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
23ef0 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  es here */.){.  
23f00 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
23f10 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  && pCur->iPage>=
23f20 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
23f30 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
23f40 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
23f50 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
23f60 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
23f70 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
23f80 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
23f90 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
23fa0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
23fb0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
23fc0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
23fd0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
23fe0 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
23ff0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
24000 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  e]->nCell );.  a
24010 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
24020 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 2a  o.nSize>0 );.  *
24030 70 41 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66  pAmt = pCur->inf
24040 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75  o.nLocal;.  retu
24050 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e  rn (void*)pCur->
24060 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d  info.pPayload;.}
24070 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  .../*.** For the
24080 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
24090 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  or pCur is point
240a0 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a   to, return as.*
240b0 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  * many bytes of 
240c0 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20  the key or data 
240d0 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  as are available
240e0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a   on the local.**
240f0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57   b-tree page.  W
24100 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
24110 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
24120 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a  es into *pAmt..*
24130 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
24140 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68   returned is eph
24150 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79  emeral.  The key
24160 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a  /data may move.*
24170 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65  * or be destroye
24180 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61  d on the next ca
24190 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20  ll to any Btree 
241a0 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c  routine,.** incl
241b0 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d  uding calls from
241c0 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
241d0 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20  gainst the same 
241e0 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  cache..** Hence,
241f0 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20   a mutex on the 
24200 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20  BtShared should 
24210 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f  be held prior to
24220 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73   calling.** this
24230 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
24240 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69  These routines i
24250 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75  s used to get qu
24260 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65  ick access to ke
24270 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e  y and data.** in
24280 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
24290 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c   where no overfl
242a0 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65  ow pages are use
242b0 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  d..*/.const void
242c0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65   *sqlite3BtreeKe
242d0 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  yFetch(BtCursor 
242e0 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74  *pCur, u32 *pAmt
242f0 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63  ){.  return fetc
24300 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
24310 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f  Amt);.}.const vo
24320 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
24330 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73  DataFetch(BtCurs
24340 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
24350 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  Amt){.  return f
24360 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
24370 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , pAmt);.}.../*.
24380 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
24390 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
243a0 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
243b0 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
243c0 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
243d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
243e0 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
243f0 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ve to..**.** Thi
24400 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
24410 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ns SQLITE_CORRUP
24420 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65  T if the page-he
24430 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64  ader flags field
24440 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63   of.** the new c
24450 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e  hild page does n
24460 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61  ot match the fla
24470 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  gs field of the 
24480 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20  parent (i.e..** 
24490 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67  if an intkey pag
244a0 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
244b0 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20  the parent of a 
244c0 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c  non-intkey page,
244d0 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73   or.** vice-vers
244e0 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  a)..*/.static in
244f0 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
24500 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
24510 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e  2 newPgno){.  in
24520 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20  t rc;.  int i = 
24530 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d  pCur->iPage;.  M
24540 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65  emPage *pNewPage
24550 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
24560 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a  t = pCur->pBt;..
24570 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
24580 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
24590 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
245a0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
245b0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
245c0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
245d0 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  e<BTCURSOR_MAX_D
245e0 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
245f0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
24600 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
24610 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
24620 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
24630 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24640 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
24650 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41  .  }.  rc = getA
24660 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
24670 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61  newPgno, &pNewPa
24680 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge,.            
24690 20 20 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61     (pCur->curFla
246a0 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
246b0 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f  lag)==0 ? PAGER_
246c0 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30  GET_READONLY : 0
246d0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
246e0 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d  turn rc;.  pCur-
246f0 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70  >apPage[i+1] = p
24700 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  NewPage;.  pCur-
24710 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b  >aiIdx[i+1] = 0;
24720 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b  .  pCur->iPage++
24730 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ;..  pCur->info.
24740 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
24750 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
24760 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
24770 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
24780 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d  .  if( pNewPage-
24790 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77  >nCell<1 || pNew
247a0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43  Page->intKey!=pC
247b0 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69  ur->apPage[i]->i
247c0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74  ntKey ){.    ret
247d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
247e0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
247f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24800 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20  .}..#if 0./*.** 
24810 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20  Page pParent is 
24820 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e  an internal (non
24830 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65  -leaf) tree page
24840 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
24850 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74  .** asserts that
24860 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
24870 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d  ild is the left-
24880 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64  child if the iId
24890 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20  x'th.** cell in 
248a0 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72  page pParent. Or
248b0 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75  , if iIdx is equ
248c0 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20  al to the total 
248d0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c  number of.** cel
248e0 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74  ls in pParent, t
248f0 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
24900 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69  iChild is the ri
24910 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20  ght-child of.** 
24920 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
24930 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50  tic void assertP
24940 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61  arentIndex(MemPa
24950 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74  ge *pParent, int
24960 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69   iIdx, Pgno iChi
24970 6c 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ld){.  assert( i
24980 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx<=pParent->nC
24990 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64  ell );.  if( iId
249a0 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x==pParent->nCel
249b0 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  l ){.    assert(
249c0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
249d0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
249e0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
249f0 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65  ==iChild );.  }e
24a00 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
24a10 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
24a20 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78  ll(pParent, iIdx
24a30 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ))==iChild );.  
24a40 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66  }.}.#else.#  def
24a50 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74  ine assertParent
24a60 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65  Index(x,y,z) .#e
24a70 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ndif../*.** Move
24a80 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74   the cursor up t
24a90 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
24aa0 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69  e..**.** pCur->i
24ab0 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
24ac0 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74   cell index that
24ad0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
24ae0 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
24af0 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69  page we are comi
24b00 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20  ng from.  If we 
24b10 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20  are coming from 
24b20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  the.** right-mos
24b30 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65  t child page the
24b40 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  n pCur->idx is s
24b50 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74  et to one more t
24b60 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65  han.** the large
24b70 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a  st cell index..*
24b80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f  /.static void mo
24b90 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72  veToParent(BtCur
24ba0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
24bb0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
24bc0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
24bd0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24be0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
24bf0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
24c00 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20  ( pCur->iPage>0 
24c10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
24c20 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24c30 69 50 61 67 65 5d 20 29 3b 0a 0a 20 20 2f 2a 20  iPage] );..  /* 
24c40 55 50 44 41 54 45 3a 20 49 74 20 69 73 20 61 63  UPDATE: It is ac
24c50 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  tually possible 
24c60 66 6f 72 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  for the conditio
24c70 6e 20 74 65 73 74 65 64 20 62 79 20 74 68 65 20  n tested by the 
24c80 61 73 73 65 72 74 0a 20 20 2a 2a 20 62 65 6c 6f  assert.  ** belo
24c90 77 20 74 6f 20 62 65 20 75 6e 74 72 75 65 20 69  w to be untrue i
24ca0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
24cb0 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20  ile is corrupt. 
24cc0 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72 20 69  This can occur i
24cd0 66 0a 20 20 2a 2a 20 6f 6e 65 20 63 75 72 73 6f  f.  ** one curso
24ce0 72 20 68 61 73 20 6d 6f 64 69 66 69 65 64 20 70  r has modified p
24cf0 61 67 65 20 70 50 61 72 65 6e 74 20 77 68 69 6c  age pParent whil
24d00 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
24d10 20 69 74 20 69 73 20 68 65 6c 64 20 0a 20 20 2a   it is held .  *
24d20 2a 20 62 79 20 61 20 73 65 63 6f 6e 64 20 63 75  * by a second cu
24d30 72 73 6f 72 2e 20 57 68 69 63 68 20 63 61 6e 20  rsor. Which can 
24d40 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61  only happen if a
24d50 20 73 69 6e 67 6c 65 20 70 61 67 65 20 69 73 20   single page is 
24d60 6c 69 6e 6b 65 64 0a 20 20 2a 2a 20 69 6e 74 6f  linked.  ** into
24d70 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62   more than one b
24d80 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
24d90 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  in a corrupt dat
24da0 61 62 61 73 65 2e 20 20 2a 2f 0a 23 69 66 20 30  abase.  */.#if 0
24db0 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
24dc0 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e  ndex(.    pCur->
24dd0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
24de0 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
24df0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
24e00 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
24e10 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24e20 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29  iPage]->pgno.  )
24e30 3b 0a 23 65 6e 64 69 66 0a 20 20 74 65 73 74 63  ;.#endif.  testc
24e40 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ase( pCur->aiIdx
24e50 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20  [pCur->iPage-1] 
24e60 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  > pCur->apPage[p
24e70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e  Cur->iPage-1]->n
24e80 43 65 6c 6c 20 29 3b 0a 0a 20 20 72 65 6c 65 61  Cell );..  relea
24e90 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
24ea0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
24eb0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  );.  pCur->iPage
24ec0 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  --;.  pCur->info
24ed0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
24ee0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
24ef0 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
24f00 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
24f10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
24f20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
24f30 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  int to the root 
24f40 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72  page of its b-tr
24f50 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ee structure..**
24f60 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
24f70 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72   has a virtual r
24f80 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74  oot page, then t
24f90 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
24fa0 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74  ed to point.** t
24fb0 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f  o the virtual ro
24fc0 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20  ot page instead 
24fd0 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  of the actual ro
24fe0 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65  ot page. A table
24ff0 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61   has a.** virtua
25000 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e  l root page when
25010 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
25020 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
25030 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a  o cells and a .*
25040 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70  * single child p
25050 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  age. This can on
25060 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74  ly happen with t
25070 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
25080 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a  at page 1..**.**
25090 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73   If the b-tree s
250a0 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74  tructure is empt
250b0 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  y, the cursor st
250c0 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a  ate is set to .*
250d0 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  * CURSOR_INVALID
250e0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
250f0 20 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74   cursor is set t
25100 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  o point to the f
25110 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63  irst.** cell loc
25120 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74  ated on the root
25130 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f   (or virtual roo
25140 74 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  t) page and the 
25150 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20  cursor state.** 
25160 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52  is set to CURSOR
25170 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66  _VALID..**.** If
25180 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
25190 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75  eturns successfu
251a0 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61  lly, it may be a
251b0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a  ssumed that the.
251c0 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66  ** page-header f
251d0 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68  lags indicate th
251e0 61 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d  at the [virtual]
251f0 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68   root-page is th
25200 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b  e expected .** k
25210 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61  ind of b-tree pa
25220 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e  ge (i.e. if when
25230 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72   opening the cur
25240 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64  sor the caller d
25250 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66  id not.** specif
25260 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  y a KeyInfo stru
25270 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
25280 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
25290 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20  x05 or 0x0D,.** 
252a0 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62  indicating a tab
252b0 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66  le b-tree, or if
252c0 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
252d0 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
252e0 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  o .** structure 
252f0 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
25300 73 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72  s set to 0x02 or
25310 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e   0x0A, indicatin
25320 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d  g an index.** b-
25330 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tree)..*/.static
25340 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
25350 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
25360 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
25370 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
25380 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
25390 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
253a0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
253b0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49  assert( CURSOR_I
253c0 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f  NVALID < CURSOR_
253d0 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
253e0 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
253f0 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52  VALID   < CURSOR
25400 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
25410 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
25420 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f  _FAULT   > CURSO
25430 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
25440 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
25450 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
25460 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69  IRESEEK ){.    i
25470 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
25480 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
25490 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
254a0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53  Cur->skipNext!=S
254b0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
254c0 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
254d0 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  kipNext;.    }. 
254e0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
254f0 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
25500 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75  ;.  }..  if( pCu
25510 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
25520 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
25530 69 50 61 67 65 20 29 20 72 65 6c 65 61 73 65 50  iPage ) releaseP
25540 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
25550 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29  [pCur->iPage--])
25560 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  ;.  }else if( pC
25570 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
25580 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
25590 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
255a0 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ALID;.    return
255b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
255c0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 67 65  lse{.    rc = ge
255d0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75  tAndInitPage(pCu
255e0 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20  r->pBtree->pBt, 
255f0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
25600 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  &pCur->apPage[0]
25610 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25620 20 20 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61     (pCur->curFla
25630 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
25640 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f  lag)==0 ? PAGER_
25650 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30  GET_READONLY : 0
25660 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
25670 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25680 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
25690 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
256a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
256b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
256c0 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  ->iPage = 0;.  }
256d0 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
256e0 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73  >apPage[0];.  as
256f0 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
25700 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
25710 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43  t );..  /* If pC
25720 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20  ur->pKeyInfo is 
25730 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
25740 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f  he caller that o
25750 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f  pened this curso
25760 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20  r.  ** expected 
25770 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e  to open it on an
25780 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f   index b-tree. O
25790 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65  therwise, if pKe
257a0 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55  yInfo is.  ** NU
257b0 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65  LL, the caller e
257c0 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62  xpects a table b
257d0 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69  -tree. If this i
257e0 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a  s not the case,.
257f0 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53    ** return an S
25800 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
25810 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ror. .  **.  ** 
25820 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73  Earlier versions
25830 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d   of SQLite assum
25840 65 64 20 74 68 61 74 20 74 68 69 73 20 74 65 73  ed that this tes
25850 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c  t could not fail
25860 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f  .  ** if the roo
25870 74 20 70 61 67 65 20 77 61 73 20 61 6c 72 65 61  t page was alrea
25880 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74  dy loaded when t
25890 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
258a0 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20   called (i.e..  
258b0 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67  ** if pCur->iPag
258c0 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20  e>=0). But this 
258d0 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65  is not so if the
258e0 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
258f0 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20  rupted .  ** in 
25900 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
25910 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69  page pRoot is li
25920 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f  nked into a seco
25930 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20  nd b-tree table 
25940 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72  .  ** (or the fr
25950 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61  eelist).  */.  a
25960 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e  ssert( pRoot->in
25970 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74  tKey==1 || pRoot
25980 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
25990 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e   if( pRoot->isIn
259a0 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  it==0 || (pCur->
259b0 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52  pKeyInfo==0)!=pR
259c0 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  oot->intKey ){. 
259d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
259e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
259f0 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64   }..  pCur->aiId
25a00 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  x[0] = 0;.  pCur
25a10 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
25a20 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
25a30 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c  gs &= ~(BTCF_AtL
25a40 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  ast|BTCF_ValidNK
25a50 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
25a60 6c 29 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74  l);..  if( pRoot
25a70 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20  ->nCell>0 ){.   
25a80 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
25a90 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
25aa0 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74  }else if( !pRoot
25ab0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
25ac0 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
25ad0 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21  if( pRoot->pgno!
25ae0 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
25af0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
25b00 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67  .    subpage = g
25b10 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  et4byte(&pRoot->
25b20 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
25b30 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
25b40 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
25b50 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
25b60 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
25b70 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
25b80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
25b90 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
25ba0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
25bb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
25bc0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
25bd0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
25be0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
25bf0 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
25c00 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
25c10 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
25c20 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
25c30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
25c40 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
25c50 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
25c60 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
25c70 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
25c80 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
25c90 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
25ca0 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
25cb0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
25cc0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
25cd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
25ce0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
25cf0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
25d00 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
25d10 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
25d20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
25d30 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
25d40 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
25d50 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
25d60 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
25d70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
25d80 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
25d90 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
25da0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
25db0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
25dc0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
25dd0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
25de0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
25df0 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72  >iPage]));.    r
25e00 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
25e10 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
25e20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25e30 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
25e40 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
25e50 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
25e60 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
25e70 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
25e80 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
25e90 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
25ea0 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
25eb0 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
25ec0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
25ed0 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
25ee0 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
25ef0 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
25f00 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
25f10 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
25f20 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
25f30 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
25f40 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
25f50 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
25f60 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
25f70 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
25f80 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
25f90 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
25fa0 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
25fb0 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
25fc0 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
25fd0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
25fe0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
25ff0 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
26000 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
26010 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
26020 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
26030 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
26040 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
26050 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
26060 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
26070 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
26080 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
26090 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20   while( !(pPage 
260a0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
260b0 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
260c0 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
260d0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
260e0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
260f0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
26100 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
26110 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
26120 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
26130 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
26140 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
26150 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
26160 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
26170 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
26180 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
26190 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ll-1;.  assert( 
261a0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
261b0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
261c0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
261d0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
261e0 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  y)==0 );.  retur
261f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
26200 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
26210 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
26220 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
26230 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
26240 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
26250 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
26260 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
26270 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
26280 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
26290 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
262a0 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
262b0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
262c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
262d0 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
262e0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
262f0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
26300 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
26310 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
26320 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
26330 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
26340 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
26350 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
26360 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
26370 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
26380 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
26390 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
263a0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
263b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
263c0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
263d0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
263e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
263f0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
26400 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
26410 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
26420 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
26430 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
26440 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20  nCell>0 );.     
26450 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
26460 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
26470 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
26480 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
26490 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
264a0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
264b0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
264c0 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
264d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
264e0 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
264f0 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
26500 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
26510 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
26520 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
26530 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
26540 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
26550 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
26560 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73  BtreeLast(BtCurs
26570 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
26580 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
26590 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73   .  assert( curs
265a0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
265b0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
265c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
265d0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
265e0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
265f0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
26600 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  or already point
26610 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  s to the last en
26620 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e  try, this is a n
26630 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43  o-op. */.  if( C
26640 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
26650 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43  r->eState && (pC
26660 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
26670 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29  TCF_AtLast)!=0 )
26680 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
26690 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69  DEBUG.    /* Thi
266a0 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74  s block serves t
266b0 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
266c0 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c  the cursor reall
266d0 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20  y does point .  
266e0 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74    ** to the last
266f0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d   entry in the b-
26700 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tree. */.    int
26710 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   ii;.    for(ii=
26720 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67  0; ii<pCur->iPag
26730 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
26740 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
26750 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61  Idx[ii]==pCur->a
26760 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c  pPage[ii]->nCell
26770 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
26780 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
26790 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
267a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
267b0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
267c0 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
267d0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
267e0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61  Cur->iPage]->lea
267f0 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  f );.#endif.    
26800 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26810 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  ;.  }..  rc = mo
26820 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
26830 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26840 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43  _OK ){.    if( C
26850 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
26860 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
26870 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
26880 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
26890 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
268a0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
268b0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
268c0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
268d0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
268e0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
268f0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
26900 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
26910 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
26920 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
26930 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
26940 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26950 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
26960 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74  Flags |= BTCF_At
26970 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Last;.      }els
26980 65 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  e{.        pCur-
26990 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
269a0 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20  CF_AtLast;.     
269b0 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d   }.   .    }.  }
269c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
269d0 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
269e0 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  sor so that it p
269f0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72  oints to an entr
26a00 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a  y near the key .
26a10 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
26a20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65  pIdxKey or intKe
26a30 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75  y.   Return a su
26a40 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  ccess code..**.*
26a50 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62  * For INTKEY tab
26a60 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20  les, the intKey 
26a70 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65  parameter is use
26a80 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20  d.  pIdxKey .** 
26a90 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46  must be NULL.  F
26aa0 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c  or index tables,
26ab0 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64   pIdxKey is used
26ac0 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69   and intKey.** i
26ad0 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  s ignored..**.**
26ae0 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74   If an exact mat
26af0 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  ch is not found,
26b00 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
26b10 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65   is always.** le
26b20 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
26b30 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
26b40 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
26b50 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77  entry if it.** w
26b60 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68  ere present.  Th
26b70 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70  e cursor might p
26b80 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79  oint to an entry
26b90 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62   that comes.** b
26ba0 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74  efore or after t
26bb0 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e  he key..**.** An
26bc0 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74   integer is writ
26bd0 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77  ten into *pRes w
26be0 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75  hich is the resu
26bf0 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69  lt of.** compari
26c00 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20  ng the key with 
26c10 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69  the entry to whi
26c20 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ch the cursor is
26c30 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20   .** pointing.  
26c40 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  The meaning of t
26c50 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74  he integer writt
26c60 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73  en into.** *pRes
26c70 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
26c80 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c  **.**     *pRes<
26c90 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
26ca0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
26cb0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
26cc0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
26cd0 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
26ce0 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
26cf0 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65  IdxKey or if the
26d00 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a   table is empty.
26d10 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
26d20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73      and the curs
26d30 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  or is therefore 
26d40 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f  left point to no
26d50 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  thing..**.**    
26d60 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68   *pRes==0     Th
26d70 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
26d80 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
26d90 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
26da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
26db0 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69  xactly matches i
26dc0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
26dd0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30  *.**     *pRes>0
26de0 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
26df0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
26e00 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
26e10 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
26e20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72         is larger
26e30 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
26e40 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20  xKey..**.*/.int 
26e50 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
26e60 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74  toUnpacked(.  Bt
26e70 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
26e80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
26e90 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64  rsor to be moved
26ea0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
26eb0 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f  cord *pIdxKey, /
26ec0 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
26ed0 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e   key */.  i64 in
26ee0 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  tKey,           
26ef0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
26f00 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  key */.  int bia
26f10 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  sRight,         
26f20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69    /* If true, bi
26f30 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  as the search to
26f40 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
26f50 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
26f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
26f70 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
26f80 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
26f90 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72   int rc;.  Recor
26fa0 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64  dCompare xRecord
26fb0 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65  Compare;..  asse
26fc0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
26fd0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
26fe0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
26ff0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
27000 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
27010 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
27020 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72   pRes );.  asser
27030 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d  t( (pIdxKey==0)=
27040 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  =(pCur->pKeyInfo
27050 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ==0) );..  /* If
27060 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
27070 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65  lready positione
27080 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77  d at the point w
27090 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a  e are trying.  *
270a0 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68  * to move to, th
270b0 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77  en just return w
270c0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
270d0 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70   work */.  if( p
270e0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
270f0 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43  SOR_VALID && (pC
27100 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
27110 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d  TCF_ValidNKey)!=
27120 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70  0.   && pCur->ap
27130 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
27140 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  .  ){.    if( pC
27150 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69  ur->info.nKey==i
27160 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
27170 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
27180 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27190 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
271a0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
271b0 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d  & BTCF_AtLast)!=
271c0 30 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0 && pCur->info.
271d0 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  nKey<intKey ){. 
271e0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b       *pRes = -1;
271f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
27200 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
27210 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65   }..  if( pIdxKe
27220 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64  y ){.    xRecord
27230 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65  Compare = sqlite
27240 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65  3VdbeFindCompare
27250 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70  (pIdxKey);.    p
27260 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20  IdxKey->errCode 
27270 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
27280 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
27290 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20  t_rc==1 .       
272a0 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65    || pIdxKey->de
272b0 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20  fault_rc==0 .   
272c0 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79        || pIdxKey
272d0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31  ->default_rc==-1
272e0 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
272f0 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70  .    xRecordComp
27300 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20  are = 0; /* All 
27310 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67 65 72  keys are integer
27320 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  s */.  }..  rc =
27330 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
27340 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
27350 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
27360 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
27370 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
27380 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
27390 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
273a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
273b0 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
273c0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
273d0 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29  iPage]->isInit )
273e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
273f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
27400 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
27410 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27420 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
27430 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
27440 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
27450 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65  ALID ){.    *pRe
27460 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65  s = -1;.    asse
27470 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
27480 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
27490 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
274a0 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
274b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
274c0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
274d0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
274e0 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70  [0]->intKey || p
274f0 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
27500 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
27510 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20  , upr, idx, c;. 
27520 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
27530 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
27540 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
27550 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
27560 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20      u8 *pCell;  
27570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27580 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
27590 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65  er to current ce
275a0 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a  ll in pPage */..
275b0 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43      /* pPage->nC
275c0 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  ell must be grea
275d0 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49  ter than zero. I
275e0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f  f this is the ro
275f0 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74  ot-page.    ** t
27600 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  he cursor would 
27610 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49  have been INVALI
27620 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73  D above and this
27630 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20   for(;;) loop.  
27640 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66    ** not run. If
27650 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
27660 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e   root-page, then
27670 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64   the moveToChild
27680 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  () routine.    *
27690 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72  * would have alr
276a0 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62  eady detected db
276b0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d   corruption. Sim
276c0 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75  ilarly, pPage mu
276d0 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
276e0 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64   right kind (ind
276f0 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20  ex or table) of 
27700 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68  b-tree page. Oth
27710 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20  erwise.    ** a 
27720 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72  moveToChild() or
27730 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61   moveToRoot() ca
27740 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  ll would have de
27750 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
27760 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  n.  */.    asser
27770 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
27780 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
27790 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d   pPage->intKey==
277a0 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a  (pIdxKey==0) );.
277b0 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
277c0 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
277d0 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72  ell-1;.    asser
277e0 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20  t( biasRight==0 
277f0 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20  || biasRight==1 
27800 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72  );.    idx = upr
27810 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b  >>(1-biasRight);
27820 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69   /* idx = biasRi
27830 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72  ght ? upr : (lwr
27840 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20  +upr)/2; */.    
27850 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27860 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
27870 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65  idx;.    if( xRe
27880 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29  cordCompare==0 )
27890 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
278a0 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65  .        i64 nCe
278b0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70  llKey;.        p
278c0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
278d0 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50  pPage, idx) + pP
278e0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
278f0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
27900 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
27910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
27920 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70  ile( 0x80 <= *(p
27930 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20  Cell++) ){.     
27940 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
27950 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  >=pPage->aDataEn
27960 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
27970 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
27980 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27990 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65      }.        ge
279a0 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28  tVarint(pCell, (
279b0 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b  u64*)&nCellKey);
279c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
279d0 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  llKey<intKey ){.
279e0 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
279f0 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  idx+1;.         
27a00 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20   if( lwr>upr ){ 
27a10 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d  c = -1; break; }
27a20 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
27a30 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b  f( nCellKey>intK
27a40 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
27a50 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
27a60 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
27a70 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72  pr ){ c = +1; br
27a80 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d  eak; }.        }
27a90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
27aa0 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79  assert( nCellKey
27ab0 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  ==intKey );.    
27ac0 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
27ad0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
27ae0 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  idNKey;.        
27af0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65    pCur->info.nKe
27b00 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  y = nCellKey;.  
27b10 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
27b20 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
27b30 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
27b40 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
27b50 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
27b60 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
27b70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
27b80 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c  to moveto_next_l
27b90 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  ayer;.          
27ba0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
27bb0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
27bc0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
27bd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
27be0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
27bf0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
27c00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
27c10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27c20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20  lwr+upr>=0 );.  
27c30 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72        idx = (lwr
27c40 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64  +upr)>>1;  /* id
27c50 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  x = (lwr+upr)/2;
27c60 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
27c70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72  }else{.      for
27c80 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  (;;){.        in
27c90 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20  t nCell;.       
27ca0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
27cb0 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20  l(pPage, idx) + 
27cc0 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
27cd0 69 7a 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  ize;..        /*
27ce0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70   The maximum sup
27cf0 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65  ported page-size
27d00 20 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e   is 65536 bytes.
27d10 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
27d20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
27d30 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
27d40 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73  f record bytes s
27d50 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65  tored on an inde
27d60 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20  x B-Tree.       
27d70 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73   ** page is less
27d80 20 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65   than 16384 byte
27d90 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f  s and may be sto
27da0 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a  red as a 2-byte.
27db0 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e          ** varin
27dc0 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  t. This informat
27dd0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
27de0 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20  ttempt to avoid 
27df0 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20  parsing .       
27e00 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63   ** the entire c
27e10 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20  ell by checking 
27e20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68  for the cases wh
27e30 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  ere the record i
27e40 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  s .        ** st
27e50 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69  ored entirely wi
27e60 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20  thin the b-tree 
27e70 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69  page by inspecti
27e80 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20  ng the first .  
27e90 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73        ** 2 bytes
27ea0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20   of the cell..  
27eb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27ec0 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30   nCell = pCell[0
27ed0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ];.        if( n
27ee0 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  Cell<=pPage->max
27ef0 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a  1bytePayload ){.
27f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
27f10 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66  s branch runs if
27f20 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   the record-size
27f30 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65   field of the ce
27f40 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20  ll is a.        
27f50 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65    ** single byte
27f60 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
27f70 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69  record fits enti
27f80 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
27f90 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d  .          ** b-
27fa0 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
27fb0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
27fc0 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31  e( pCell+nCell+1
27fd0 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  ==pPage->aDataEn
27fe0 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  d );.          c
27ff0 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
28000 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29  e(nCell, (void*)
28010 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b  &pCell[1], pIdxK
28020 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
28030 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31  se if( !(pCell[1
28040 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20  ] & 0x80) .     
28050 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d       && (nCell =
28060 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c   ((nCell&0x7f)<<
28070 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d  7) + pCell[1])<=
28080 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a  pPage->maxLocal.
28090 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
280a0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
280b0 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73  rd-size field is
280c0 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74   a 2 byte varint
280d0 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
280e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
280f0 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
28100 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70  he main b-tree p
28110 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
28120 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65     testcase( pCe
28130 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67  ll+nCell+2==pPag
28140 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
28150 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
28160 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
28170 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
28180 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [2], pIdxKey);. 
28190 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
281a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
281b0 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72  ecord flows over
281c0 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   onto one or mor
281d0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
281e0 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  . In.          *
281f0 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  * this case the 
28200 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73  whole cell needs
28210 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61   to be parsed, a
28220 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
28230 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  d.          ** a
28240 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nd accessPayload
28250 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69  () used to retri
28260 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  eve the record i
28270 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
28280 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f    ** buffer befo
28290 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  re VdbeRecordCom
282a0 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61  pare() can be ca
282b0 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lled. */.       
282c0 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65     void *pCellKe
282d0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  y;.          u8 
282e0 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64  * const pCellBod
282f0 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67  y = pCell - pPag
28300 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
28310 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
28320 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
28330 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26  ge, pCellBody, &
28340 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
28350 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28         nCell = (
28360 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
28370 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
28380 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
28390 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29  3Malloc( nCell )
283a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
283b0 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
283c0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
283d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
283e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
283f0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
28400 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28410 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
28420 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
28430 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
28440 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
28450 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e  yload(pCur, 0, n
28460 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20  Cell, (unsigned 
28470 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20  char*)pCellKey, 
28480 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  2);.          if
28490 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
284a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
284b0 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
284c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
284d0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
284e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
284f0 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
28500 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c  pare(nCell, pCel
28510 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  lKey, pIdxKey);.
28520 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
28530 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
28540 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28550 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20      assert( .   
28560 20 20 20 20 20 20 20 20 20 28 70 49 64 78 4b 65           (pIdxKe
28570 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  y->errCode!=SQLI
28580 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d  TE_CORRUPT || c=
28590 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0).         && 
285a0 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
285b0 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  e!=SQLITE_NOMEM 
285c0 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  || pCur->pBtree-
285d0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
285e0 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  d).        );.  
285f0 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
28600 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
28610 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
28620 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b  }else if( c>0 ){
28630 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
28640 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
28650 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
28660 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b   assert( c==0 );
28670 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
28680 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
28690 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
286a0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
286b0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
286c0 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
286d0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
286e0 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20  xKey->errCode ) 
286f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
28700 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  UPT;.          g
28710 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
28720 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
28730 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
28740 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
28750 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70    assert( lwr+up
28760 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r>=0 );.        
28770 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e  idx = (lwr+upr)>
28780 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c  >1;  /* idx = (l
28790 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20  wr+upr)/2 */.   
287a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
287b0 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b  ssert( lwr==upr+
287c0 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74  1 || (pPage->int
287d0 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
287e0 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65  eaf) );.    asse
287f0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
28800 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  t );.    if( pPa
28810 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
28820 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28830 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
28840 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
28850 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
28860 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75  ell );.      pCu
28870 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
28880 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
28890 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
288a0 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  c;.      rc = SQ
288b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67  LITE_OK;.      g
288c0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
288d0 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f  h;.    }.moveto_
288e0 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20  next_layer:.    
288f0 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
28900 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
28910 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
28920 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
28930 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
28940 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
28950 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
28960 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
28970 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
28980 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61     }.    pCur->a
28990 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
289a0 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20  ] = (u16)lwr;.  
289b0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
289c0 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29  ld(pCur, chldPg)
289d0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62  ;.    if( rc ) b
289e0 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f  reak;.  }.moveto
289f0 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d  _finish:.  pCur-
28a00 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
28a10 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
28a20 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
28a30 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
28a40 4f 76 66 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  Ovfl);.  return 
28a50 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
28a60 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
28a70 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
28a80 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
28a90 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
28aa0 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
28ab0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
28ac0 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
28ad0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
28ae0 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
28af0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
28b00 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
28b10 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
28b20 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
28b30 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
28b40 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
28b50 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
28b60 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
28b70 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
28b80 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
28b90 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
28ba0 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
28bb0 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
28bc0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
28bd0 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
28be0 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
28bf0 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
28c00 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
28c10 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
28c20 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
28c30 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
28c40 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
28c50 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
28c60 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
28c70 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
28c80 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ate);.}../*.** A
28c90 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
28ca0 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
28cb0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
28cc0 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
28cd0 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
28ce0 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
28cf0 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
28d00 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
28d10 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
28d20 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
28d30 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
28d40 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
28d50 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
28d60 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Res=1..**.** The
28d70 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
28d80 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
28d90 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20 72  eNext().  That r
28da0 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
28db0 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
28dc0 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
28dd0 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e  rely incrementin
28de0 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
28df0 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
28e00 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74  x.** to the next
28e10 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72   cell on the cur
28e20 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20  rent page.  The 
28e30 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65  (slower) btreeNe
28e40 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72  xt() helper.** r
28e50 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
28e60 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65   when it is nece
28e70 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f  ssary to move to
28e80 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67   a different pag
28e90 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f  e or.** to resto
28ea0 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  re the cursor..*
28eb0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  *.** The calling
28ec0 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
28ed0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72  et *pRes to 0 or
28ee0 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c   1.  The initial
28ef0 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20   *pRes value.** 
28f00 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65  will be 1 if the
28f10 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74   cursor being st
28f20 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64  epped correspond
28f30 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
28f40 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73  x and.** if this
28f50 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
28f60 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
28f70 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64   if that SQL ind
28f80 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61  ex had been.** a
28f90 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20   unique index.  
28fa0 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61  Otherwise the ca
28fb0 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73  ller will have s
28fc0 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f  et *pRes to zero
28fd0 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65  ..** Zero is the
28fe0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68   common case. Th
28ff0 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
29000 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74  tation is free t
29010 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69  o use the.** ini
29020 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
29030 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d   as a hint to im
29040 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  prove performanc
29050 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65  e, but the curre
29060 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72  nt.** SQLite btr
29070 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
29080 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74  n does not. (Not
29090 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62  e that the comdb
290a0 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65  2 btree.** imple
290b0 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75  mentation does u
290c0 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f  se this hint, ho
290d0 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69  wever.).*/.stati
290e0 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
290f0 45 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28  E int btreeNext(
29100 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
29110 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
29120 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
29130 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
29140 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
29150 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
29160 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
29170 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
29180 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
29190 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
291a0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  D );.  assert( *
291b0 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28  pRes==0 );.  if(
291c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
291d0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
291e0 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72     assert( (pCur
291f0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
29200 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
29210 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74  );.    rc = rest
29220 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
29230 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  n(pCur);.    if(
29240 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29250 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
29260 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
29270 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
29280 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
29290 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
292a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
292b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
292c0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
292d0 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ipNext ){.      
292e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
292f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
29300 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
29310 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
29320 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75  EXT );.      pCu
29330 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
29340 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
29350 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
29360 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  xt>0 ){.        
29370 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
29380 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
29390 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
293a0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
293b0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
293c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
293d0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
293e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
293f0 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e    idx = ++pCur->
29400 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29410 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
29420 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a  age->isInit );..
29430 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
29440 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72  base file is cor
29450 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73  rupt, it is poss
29460 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c  ible for the val
29470 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20  ue of idx .  ** 
29480 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65  to be invalid he
29490 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  re. This can onl
294a0 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65 63  y occur if a sec
294b0 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66  ond cursor modif
294c0 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ies.  ** the pag
294d0 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70  e while cursor p
294e0 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  Cur is holding a
294f0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74   reference to it
29500 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a  . Which can.  **
29510 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
29520 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
29530 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68 20  corrupt in such 
29540 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b  a way as to link
29550 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69   the.  ** page i
29560 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  nto more than on
29570 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
29580 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  re. */.  testcas
29590 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43  e( idx>pPage->nC
295a0 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64  ell );..  if( id
295b0 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
295c0 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
295d0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
295e0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
295f0 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
29600 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
29610 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
29620 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  8]));.      if( 
29630 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
29640 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76        return mov
29650 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
29660 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  );.    }.    do{
29670 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
29680 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
29690 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
296a0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
296b0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
296c0 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
296d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
296e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
296f0 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
29700 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
29710 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29720 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
29730 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69  }while( pCur->ai
29740 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
29750 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
29760 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
29770 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
29780 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
29790 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
297a0 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
297b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
297c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
297d0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
297e0 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
297f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
29800 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
29810 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
29820 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e  (pCur);.  }.}.in
29830 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
29840 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
29850 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
29860 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
29870 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
29880 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
29890 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
298a0 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res!=0 );.  asse
298b0 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20  rt( *pRes==0 || 
298c0 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73  *pRes==1 );.  as
298d0 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
298e0 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
298f0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
29900 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d  VALID );.  pCur-
29910 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
29920 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
29930 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
29940 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
29950 4f 76 66 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d  Ovfl);.  *pRes =
29960 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
29970 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
29980 41 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62 74  ALID ) return bt
29990 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
299a0 65 73 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  es);.  pPage = p
299b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
299c0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20  ->iPage];.  if( 
299d0 28 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  (++pCur->aiIdx[p
299e0 43 75 72 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50  Cur->iPage])>=pP
299f0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
29a00 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
29a10 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20  ur->iPage]--;.  
29a20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65    return btreeNe
29a30 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
29a40 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
29a50 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
29a60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
29a70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
29a80 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
29a90 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  t(pCur);.  }.}..
29aa0 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63  /*.** Step the c
29ab0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63  ursor to the bac
29ac0 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  k to the previou
29ad0 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  s entry in the d
29ae0 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
29af0 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
29b00 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
29b10 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
29b20 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
29b30 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
29b40 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
29b50 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
29b60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
29b70 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
29b80 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a  et *pRes=1..**.*
29b90 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79  * The main entry
29ba0 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65   point is sqlite
29bb0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29  3BtreePrevious()
29bc0 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
29bd0 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
29be0 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
29bf0 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65  ase of merely de
29c00 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
29c10 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
29c20 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
29c30 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 65   the previous ce
29c40 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ll on the curren
29c50 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c  t page.  The (sl
29c60 6f 77 65 72 29 20 62 74 72 65 65 50 72 65 76 69  ower) btreePrevi
29c70 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20  ous().** helper 
29c80 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
29c90 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63  d when it is nec
29ca0 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74  essary to move t
29cb0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  o a different pa
29cc0 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74  ge.** or to rest
29cd0 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ore the cursor..
29ce0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  **.** The callin
29cf0 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  g function will 
29d00 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f  set *pRes to 0 o
29d10 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61  r 1.  The initia
29d20 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a  l *pRes value.**
29d30 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68   will be 1 if th
29d40 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73  e cursor being s
29d50 74 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e  tepped correspon
29d60 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64  ds to an SQL ind
29d70 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69  ex and.** if thi
29d80 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20  s routine could 
29d90 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65  have been skippe
29da0 64 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e  d if that SQL in
29db0 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20  dex had been.** 
29dc0 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
29dd0 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63   Otherwise the c
29de0 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20  aller will have 
29df0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72  set *pRes to zer
29e00 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68  o..** Zero is th
29e10 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54  e common case. T
29e20 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  he btree impleme
29e30 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20  ntation is free 
29e40 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e  to use the.** in
29e50 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
29e60 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69  e as a hint to i
29e70 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e  mprove performan
29e80 63 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72  ce, but the curr
29e90 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74  ent.** SQLite bt
29ea0 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
29eb0 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f  on does not. (No
29ec0 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64  te that the comd
29ed0 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c  b2 btree.** impl
29ee0 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
29ef0 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68  use this hint, h
29f00 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74  owever.).*/.stat
29f10 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
29f20 4e 45 20 69 6e 74 20 62 74 72 65 65 50 72 65 76  NE int btreePrev
29f30 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
29f40 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
29f50 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
29f60 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
29f70 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
29f80 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
29f90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
29fa0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
29fb0 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61   *pRes==0 );.  a
29fc0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
29fd0 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
29fe0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
29ff0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
2a000 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2a010 61 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61  ags & (BTCF_AtLa
2a020 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
2a030 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
2a040 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
2a050 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
2a060 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ize==0 );.  if( 
2a070 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2a080 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
2a090 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
2a0a0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2a0b0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
2a0c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a0d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2a0e0 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53    }.    if( CURS
2a0f0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
2a100 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
2a110 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2a120 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2a130 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
2a140 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2a150 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
2a160 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2a170 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
2a180 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2a190 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
2a1a0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  ;.      pCur->eS
2a1b0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
2a1c0 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70  LID;.      if( p
2a1d0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20  Cur->skipNext<0 
2a1e0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2a1f0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2a200 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2a210 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2a220 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  .      pCur->ski
2a230 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  pNext = 0;.    }
2a240 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
2a250 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2a260 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
2a270 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2a280 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  it );.  if( !pPa
2a290 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2a2a0 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
2a2b0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2a2c0 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  e];.    rc = mov
2a2d0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
2a2e0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2a2f0 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a  (pPage, idx)));.
2a300 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2a310 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
2a320 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2a330 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
2a340 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
2a350 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2a360 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  age]==0 ){.     
2a370 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2a380 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
2a390 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2a3a0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2a3b0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
2a3c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2a3d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2a3e0 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
2a3f0 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
2a400 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
2a410 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
2a420 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2a430 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2a440 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4e  s & (BTCF_ValidN
2a450 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2a460 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  fl))==0 );..    
2a470 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2a480 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
2a490 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2a4a0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a4b0 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ];.    if( pPage
2a4c0 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
2a4d0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2a4e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2a4f0 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
2a500 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
2a510 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
2a520 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2a530 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2a540 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2a550 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
2a560 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2a570 2a 70 52 65 73 29 7b 0a 20 20 61 73 73 65 72 74  *pRes){.  assert
2a580 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2a590 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2a5a0 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2a5b0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2a5c0 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20  ==0 || *pRes==1 
2a5d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2a5e0 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2a5f0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2a600 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2a610 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 70    *pRes = 0;.  p
2a620 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2a630 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42   ~(BTCF_AtLast|B
2a640 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54  TCF_ValidOvfl|BT
2a650 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20  CF_ValidNKey);. 
2a660 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2a670 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  e = 0;.  if( pCu
2a680 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2a690 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43  R_VALID.   || pC
2a6a0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2a6b0 69 50 61 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20  iPage]==0.   || 
2a6c0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2a6d0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d  r->iPage]->leaf=
2a6e0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
2a6f0 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  rn btreePrevious
2a700 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2a710 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  }.  pCur->aiIdx[
2a720 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a  pCur->iPage]--;.
2a730 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a740 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
2a750 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
2a760 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2a770 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
2a780 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
2a790 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
2a7a0 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
2a7b0 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
2a7c0 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
2a7d0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
2a7e0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
2a7f0 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
2a800 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
2a810 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
2a820 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
2a830 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
2a840 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
2a850 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
2a860 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
2a870 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
2a880 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
2a890 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2a8a0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
2a8b0 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
2a8c0 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
2a8d0 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
2a8e0 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67  *ppPage and *pPg
2a8f0 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  no are undefined
2a900 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
2a910 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f   an error..** Do
2a920 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69   not invoke sqli
2a930 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
2a940 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e  on *ppPage if an
2a950 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
2a960 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
2a970 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
2a980 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
2a990 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20  en an effort is 
2a9a0 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
2a9b0 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
2a9c0 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
2a9d0 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
2a9e0 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
2a9f0 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
2aa00 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
2aa10 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
2aa20 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
2aa30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
2aa40 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
2aa50 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
2aa60 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
2aa70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
2aa80 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69  Mode parameter i
2aa90 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  s BTALLOC_EXACT 
2aaa0 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20 70  and the nearby p
2aab0 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e  age exists.** an
2aac0 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ywhere on the fr
2aad0 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74  ee-list, then it
2aae0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2aaf0 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  o be returned.  
2ab00 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42  If.** eMode is B
2ab10 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74  TALLOC_LT then t
2ab20 68 65 20 70 61 67 65 20 72 65 74 75 72 6e 65 64  he page returned
2ab30 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68   will be less th
2ab40 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
2ab50 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20  o nearby if any 
2ab60 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73  such page exists
2ab70 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42  .  If eMode is B
2ab80 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20  TALLOC_ANY then 
2ab90 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
2aba0 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20  restrictions on 
2abb0 77 68 69 63 68 20 70 61 67 65 20 69 73 20 72 65  which page is re
2abc0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
2abd0 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
2abe0 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
2abf0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
2ac00 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
2ac10 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
2ac20 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74  Page,      /* St
2ac30 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ore pointer to t
2ac40 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
2ac50 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  e here */.  Pgno
2ac60 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20   *pPgno,        
2ac70 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
2ac80 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65  page number here
2ac90 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62   */.  Pgno nearb
2aca0 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
2acb0 53 65 61 72 63 68 20 66 6f 72 20 61 20 70 61 67  Search for a pag
2acc0 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20  e near this one 
2acd0 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20  */.  u8 eMode   
2ace0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
2acf0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54  TALLOC_EXACT, BT
2ad00 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41  ALLOC_LT, or BTA
2ad10 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20  LLOC_ANY */.){. 
2ad20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
2ad30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
2ad40 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 n;     /* Numb
2ad50 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
2ad60 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
2ad70 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e   u32 k;     /* N
2ad80 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20  umber of leaves 
2ad90 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20  on the trunk of 
2ada0 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
2adb0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
2adc0 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  k = 0;.  MemPage
2add0 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30   *pPrevTrunk = 0
2ade0 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b  ;.  Pgno mxPage;
2adf0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
2ae00 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
2ae10 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73  se file */..  as
2ae20 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2ae30 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2ae40 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2ae50 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2ae60 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e  _ANY || (nearby>
2ae70 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56  0 && IfNotOmitAV
2ae80 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
2ae90 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  )) );.  pPage1 =
2aea0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
2aeb0 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  mxPage = btreePa
2aec0 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
2aed0 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
2aee0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
2aef0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
2af00 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69  =mxPage-1 );.  i
2af10 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a  f( n>=mxPage ){.
2af20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2af30 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2af40 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b    }.  if( n>0 ){
2af50 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
2af60 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
2af70 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
2af80 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
2af90 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
2afa0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
2afb0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
2afc0 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
2afd0 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
2afe0 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
2aff0 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   */.    .    /* 
2b000 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  If eMode==BTALLO
2b010 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75  C_EXACT and a qu
2b020 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
2b030 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
2b040 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
2b050 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
2b060 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
2b070 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
2b080 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
2b090 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
2b0a0 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
2b0b0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
2b0c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b0d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2b0e0 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
2b0f0 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20  OC_EXACT ){.    
2b100 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78    if( nearby<=mx
2b110 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2b120 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
2b130 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
2b140 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
2b150 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
2b160 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20  acuum );.       
2b170 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
2b180 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
2b190 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ype, 0);.       
2b1a0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2b1b0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28   rc;.        if(
2b1c0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
2b1d0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
2b1e0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
2b1f0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
2b200 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2b210 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
2b220 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
2b230 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
2b240 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
2b250 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
2b260 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75  he free-list cou
2b270 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72  nt by 1. Set iTr
2b280 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78  unk to the index
2b290 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
2b2a0 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74  irst free-list t
2b2b0 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76  runk page. iPrev
2b2c0 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c  Trunk is initial
2b2d0 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ly 1..    */.   
2b2e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2b2f0 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
2b300 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2b310 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2b320 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
2b330 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
2b340 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
2b350 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
2b360 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
2b370 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
2b380 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
2b390 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
2b3a0 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
2b3b0 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
2b3c0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
2b3d0 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
2b3e0 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
2b3f0 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
2b400 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
2b410 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
2b420 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a  LOC_EXACT).    *
2b430 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67  * or until a pag
2b440 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61  e less than 'nea
2b450 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
2b460 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
2b470 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  LT).    */.    d
2b480 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
2b490 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
2b4a0 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
2b4b0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unk ){.        i
2b4c0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
2b4d0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
2b4e0 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ata[0]);.      }
2b4f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54  else{.        iT
2b500 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2b510 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2b520 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
2b530 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72     testcase( iTr
2b540 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
2b550 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e       if( iTrunk>
2b560 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
2b570 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2b580 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2b590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b5a0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
2b5b0 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
2b5c0 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
2b5d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2b5e0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72  c ){.        pTr
2b5f0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
2b600 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2b610 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d  te_page;.      }
2b620 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2b630 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20  Trunk!=0 );.    
2b640 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
2b650 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 0a 20  ->aData!=0 );.. 
2b660 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74       k = get4byt
2b670 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2b680 5b 34 5d 29 3b 20 2f 2a 20 23 20 6f 66 20 6c 65  [4]); /* # of le
2b690 61 76 65 73 20 6f 6e 20 74 68 69 73 20 74 72 75  aves on this tru
2b6a0 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  nk page */.     
2b6b0 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
2b6c0 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
2b6d0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
2b6e0 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
2b6f0 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
2b700 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
2b710 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
2b720 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
2b730 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
2b740 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
2b750 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
2b760 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
2b770 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
2b780 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
2b790 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
2b7a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2b7b0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2b7c0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2b7d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2b7e0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2b7f0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2b800 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
2b810 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
2b820 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
2b830 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2b840 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
2b850 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
2b860 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
2b870 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
2b880 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
2b890 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
2b8a0 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
2b8b0 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
2b8c0 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
2b8d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
2b8e0 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75  ( k>(u32)(pBt->u
2b8f0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29  sableSize/4 - 2)
2b900 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
2b910 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
2b920 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
2b930 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
2b940 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
2b950 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2b960 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
2b970 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2b980 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  age;.#ifndef SQL
2b990 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2b9a0 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  UUM.      }else 
2b9b0 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a  if( searchList .
2b9c0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
2b9d0 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c  nearby==iTrunk |
2b9e0 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79  | (iTrunk<nearby
2b9f0 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   && eMode==BTALL
2ba00 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29  OC_LE)) .      )
2ba10 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2ba20 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73   list is being s
2ba30 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73  earched and this
2ba40 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74   trunk page is t
2ba50 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
2ba60 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20  ** to allocate, 
2ba70 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
2ba80 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61  ether it has lea
2ba90 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ves..        */.
2baa0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
2bab0 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
2bac0 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
2bad0 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  k;.        searc
2bae0 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
2baf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2bb00 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
2bb10 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2bb20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2bb30 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2bb40 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2bb50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bb60 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20    if( k==0 ){.  
2bb70 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
2bb80 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
2bb90 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
2bba0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2bbb0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
2bbc0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
2bbd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bbe0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2bbf0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
2bc00 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
2bc10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2bc20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2bc30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2bc40 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2bc50 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2bc60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bc70 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65      memcpy(&pPre
2bc80 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
2bc90 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
2bca0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
2bcb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
2bcc0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2bcd0 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   The trunk page 
2bce0 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
2bcf0 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74  he caller but it
2bd00 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20   contains .     
2bd10 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73       ** pointers
2bd20 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65   to free-list le
2bd30 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  aves. The first 
2bd40 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74  leaf becomes a t
2bd50 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a  runk.          *
2bd60 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  * page in this c
2bd70 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
2bd80 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50  /.          MemP
2bd90 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a  age *pNewTrunk;.
2bda0 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
2bdb0 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62  NewTrunk = get4b
2bdc0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2bdd0 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
2bde0 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e    if( iNewTrunk>
2bdf0 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20  mxPage ){ .     
2be00 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2be10 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2be20 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2be30 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2be40 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
2be50 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2be60 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d  ase( iNewTrunk==
2be70 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
2be80 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2be90 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54  tPage(pBt, iNewT
2bea0 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b  runk, &pNewTrunk
2beb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2bec0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2bed0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2bee0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2bef0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2bf00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
2bf10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2bf20 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d  Write(pNewTrunk-
2bf30 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2bf40 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2bf50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bf60 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2bf70 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
2bf80 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2bf90 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2bfa0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2bfb0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2bfc0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
2bfd0 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
2bfe0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
2bff0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2c000 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
2c010 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
2c020 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
2c030 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  wTrunk->aData[8]
2c040 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
2c050 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a  [12], (k-1)*4);.
2c060 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
2c070 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
2c080 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c090 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
2c0a0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
2c0b0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2c0c0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2c0d0 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  1->pDbPage) );. 
2c0e0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
2c0f0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2c100 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e  ta[32], iNewTrun
2c110 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  k);.          }e
2c120 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2c130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2c140 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
2c150 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2c160 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2c170 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c180 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2c190 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2c1a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c1b0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2c1c0 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
2c1d0 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  0], iNewTrunk);.
2c1e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c1f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
2c200 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
2c210 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2c220 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
2c230 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
2c240 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
2c250 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
2c260 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20    }else if( k>0 
2c270 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ){.        /* Ex
2c280 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
2c290 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
2c2a0 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65         u32 close
2c2b0 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
2c2c0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
2c2d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
2c2e0 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
2c2f0 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66  Data;.        if
2c300 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20  ( nearby>0 ){.  
2c310 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20          u32 i;. 
2c320 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
2c330 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2c340 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
2c350 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20  OC_LE ){.       
2c360 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2c370 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
2c380 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
2c390 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
2c3a0 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  +i*4]);.        
2c3b0 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3c        if( iPage<
2c3c0 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20  =nearby ){.     
2c3d0 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
2c3e0 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
2c3f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2c400 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2c410 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c420 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2c430 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69            int di
2c440 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  st;.            
2c450 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62  dist = sqlite3Ab
2c460 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
2c470 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
2c480 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
2c490 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
2c4a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2c4b0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
2c4c0 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
2c4d0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
2c4e0 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  *4]) - nearby);.
2c4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2c500 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20  ( d2<dist ){.   
2c510 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
2c520 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
2c530 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
2c540 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
2c550 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c560 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2c570 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2c580 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
2c590 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
2c5a0 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
2c5b0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
2c5c0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
2c5d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2c5e0 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
2c5f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ;.        if( iP
2c600 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  age>mxPage ){.  
2c610 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2c620 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2c630 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2c640 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2c650 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
2c660 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c670 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
2c680 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
2c690 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
2c6a0 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65     || (iPage==ne
2c6b0 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e  arby || (iPage<n
2c6c0 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
2c6d0 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
2c6e0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2c6f0 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74     int noContent
2c700 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  ;.          *pPg
2c710 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
2c720 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2c730 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
2c740 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
2c750 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
2c760 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
2c770 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
2c780 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2c790 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
2c7a0 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
2c7b0 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
2c7c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2c7d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2c7e0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
2c7f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
2c800 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
2c810 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2c820 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
2c830 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
2c840 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2c850 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
2c860 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
2c870 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2c880 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
2c890 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
2c8a0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
2c8b0 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74   noContent = !bt
2c8c0 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
2c8d0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50  (pBt, *pPgno)? P
2c8e0 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
2c8f0 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20  NT : 0;.        
2c900 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
2c910 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
2c920 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
2c930 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
2c940 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c960 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2c970 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
2c980 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2c990 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2c9a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c9b0 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
2c9c0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
2c9d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2c9e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c9f0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
2ca00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
2ca10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
2ca20 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
2ca30 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65  unk);.      pPre
2ca40 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  vTrunk = 0;.    
2ca50 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69  }while( searchLi
2ca60 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
2ca70 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
2ca80 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  no pages on the 
2ca90 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70  freelist, so app
2caa0 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20 74  end a new page t
2cab0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  o the.    ** dat
2cac0 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20  abase image..   
2cad0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61   **.    ** Norma
2cae0 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61  lly, new pages a
2caf0 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
2cb00 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65   block can be re
2cb10 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65  quested from the
2cb20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61  .    ** pager la
2cb30 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
2cb40 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
2cb50 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74  et. This prevent
2cb60 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  s the pager.    
2cb70 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74  ** from trying t
2cb80 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65 73  o read the pages
2cb90 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
2cba0 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  sk. However, if 
2cbb0 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  the.    ** curre
2cbc0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  nt transaction h
2cbd0 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f  as already run o
2cbe0 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65  ne or more incre
2cbf0 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20  mental-vacuum.  
2cc00 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e    ** steps, then
2cc10 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
2cc20 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61   about to alloca
2cc30 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63  te may contain c
2cc40 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68  ontent.    ** th
2cc50 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
2cc60 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
2cc70 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68   rollback. In th
2cc80 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20  is case, do.    
2cc90 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e  ** not set the n
2cca0 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20  o-content flag. 
2ccb0 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65 20  This causes the 
2ccc0 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e  pager to load an
2ccd0 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  d journal.    **
2cce0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2ccf0 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65  e content before
2cd00 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e   overwriting it.
2cd10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
2cd20 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
2cd30 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75  er will not actu
2cd40 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20  ally attempt to 
2cd50 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  load or journal 
2cd60 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20  .    ** content 
2cd70 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68 61  for any page tha
2cd80 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69  t really does li
2cd90 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
2cda0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
2cdb0 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69     ** file on di
2cdc0 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63  sk. So the effec
2cdd0 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20  ts of disabling 
2cde0 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f  the no-content o
2cdf0 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
2ce00 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66  ** here are conf
2ce10 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61  ined to those pa
2ce20 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65 74  ges that lie bet
2ce30 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  ween the end of 
2ce40 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
2ce50 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68  ase image and th
2ce60 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
2ce70 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
2ce80 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f  */.    int bNoCo
2ce90 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f  ntent = (0==IfNo
2cea0 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f  tOmitAV(pBt->bDo
2ceb0 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45  Truncate))? PAGE
2cec0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a  R_GET_NOCONTENT:
2ced0 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0;..    rc = sql
2cee0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2cef0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
2cf00 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2cf10 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2cf20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
2cf30 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
2cf40 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
2cf50 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74  _PAGE(pBt) ) pBt
2cf60 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e  ->nPage++;..#ifn
2cf70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2cf80 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
2cf90 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2cfa0 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
2cfb0 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  AGE(pBt, pBt->nP
2cfc0 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  age) ){.      /*
2cfd0 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72   If *pPgno refer
2cfe0 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d  s to a pointer-m
2cff0 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74  ap page, allocat
2d000 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a  e two new pages.
2d010 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20        ** at the 
2d020 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
2d030 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20  instead of one. 
2d040 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61  The first alloca
2d050 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ted page.      *
2d060 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20  * becomes a new 
2d070 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2d080 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  , the second is 
2d090 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  used by the call
2d0a0 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
2d0b0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20     MemPage *pPg 
2d0c0 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45  = 0;.      TRACE
2d0d0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
2d0e0 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
2d0f0 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61   (pointer-map pa
2d100 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61  ge)\n", pBt->nPa
2d110 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ge));.      asse
2d120 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  rt( pBt->nPage!=
2d130 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2d140 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20  E(pBt) );.      
2d150 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2d160 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  e(pBt, pBt->nPag
2d170 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74  e, &pPg, bNoCont
2d180 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ent);.      if( 
2d190 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2d1a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2d1b0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2d1c0 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pPg->pDbPage);. 
2d1d0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2d1e0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  ge(pPg);.      }
2d1f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2d200 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2d210 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
2d220 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
2d230 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
2d240 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 70  E_PAGE(pBt) ){ p
2d250 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20  Bt->nPage++; }. 
2d260 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2d270 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28 75  put4byte(28 + (u
2d280 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  8*)pBt->pPage1->
2d290 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67  aData, pBt->nPag
2d2a0 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d  e);.    *pPgno =
2d2b0 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20   pBt->nPage;..  
2d2c0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
2d2d0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
2d2e0 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
2d2f0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2d300 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
2d310 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e  pPage, bNoConten
2d320 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
2d330 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2d340 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2d350 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
2d360 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2d370 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2d380 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
2d390 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
2d3a0 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
2d3b0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
2d3c0 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
2d3d0 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
2d3e0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
2d3f0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
2d400 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
2d410 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61  .end_allocate_pa
2d420 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ge:.  releasePag
2d430 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c  e(pTrunk);.  rel
2d440 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
2d450 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  unk);.  if( rc==
2d460 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d470 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
2d480 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a  rPageRefcount((*
2d490 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
2d4a0 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  )>1 ){.      rel
2d4b0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
2d4c0 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  );.      *ppPage
2d4d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
2d4e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2d4f0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
2d500 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49    (*ppPage)->isI
2d510 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nit = 0;.  }else
2d520 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
2d530 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
2d540 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
2d550 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2d560 77 72 69 74 65 61 62 6c 65 28 28 2a 70 70 50 61  writeable((*ppPa
2d570 67 65 29 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge)->pDbPage) );
2d580 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2d590 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2d5a0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2d5b0 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
2d5c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2d5d0 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
2d5e0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
2d5f0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
2d600 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
2d610 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
2d620 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
2d630 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
2d640 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
2d650 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
2d660 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
2d670 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
2d680 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
2d690 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
2d6a0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
2d6b0 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
2d6c0 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
2d6d0 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
2d6e0 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
2d6f0 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
2d700 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
2d710 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
2d720 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
2d730 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
2d740 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
2d750 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
2d760 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
2d770 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
2d780 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
2d790 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
2d7a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2d7b0 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
2d7c0 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
2d7d0 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
2d7e0 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
2d7f0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
2d800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d810 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
2d820 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
2d830 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
2d840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d850 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
2d860 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
2d870 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
2d880 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
2d890 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
2d8a0 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
2d8b0 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
2d8c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2d8d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d8e0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
2d8f0 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
2d900 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
2d910 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2d920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d930 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
2d940 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
2d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d960 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
2d970 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
2d980 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
2d990 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
2d9a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2d9b0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
2d9c0 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65  .  assert( iPage
2d9d0 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
2d9e0 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
2d9f0 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
2da00 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65  ge );..  if( pMe
2da10 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  mPage ){.    pPa
2da20 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20  ge = pMemPage;. 
2da30 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
2da40 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
2da50 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
2da60 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
2da70 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50  geLookup(pBt, iP
2da80 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
2da90 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
2daa0 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
2dab0 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
2dac0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2dad0 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
2dae0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
2daf0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2db00 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65  ut;.  nFree = ge
2db10 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2db20 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
2db30 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2db40 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65  aData[36], nFree
2db50 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d  +1);..  if( pBt-
2db60 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
2db70 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
2db80 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
2db90 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74  ecure_delete opt
2dba0 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
2dbb0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61  then.    ** alwa
2dbc0 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
2dbd0 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
2dbe0 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
2dbf0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
2dc00 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72  ( (!pPage && ((r
2dc10 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2dc20 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
2dc30 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20  age, 0))!=0) ). 
2dc40 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20      ||          
2dc50 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33    ((rc = sqlite3
2dc60 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2dc70 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a  ->pDbPage))!=0).
2dc80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
2dc90 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2dca0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
2dcb0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
2dcc0 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
2dcd0 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
2dce0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
2dcf0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
2dd00 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61  -vacuum, write a
2dd10 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  n entry in the p
2dd20 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20  ointer-map.  ** 
2dd30 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
2dd40 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65   the page is fre
2dd50 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53  e..  */.  if( IS
2dd60 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2dd70 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
2dd80 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
2dd90 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29  REEPAGE, 0, &rc)
2dda0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2ddb0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2ddc0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
2ddd0 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61  manipulate the a
2dde0 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66  ctual database f
2ddf0 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75  ree-list structu
2de00 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  re. There are tw
2de10 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69  o.  ** possibili
2de20 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65  ties. If the fre
2de30 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e  e-list is curren
2de40 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66  tly empty, or if
2de50 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
2de60 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
2de70 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
2de80 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ull, then this p
2de90 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
2dea0 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d  a.  ** new free-
2deb0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
2dec0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77   Otherwise, it w
2ded0 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61  ill become a lea
2dee0 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69  f of the.  ** fi
2def0 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
2df00 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  n the current fr
2df10 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c  ee-list. This bl
2df20 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a  ock tests if it.
2df30 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
2df40 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65   to add the page
2df50 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c   as a new free-l
2df60 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20  ist leaf..  */. 
2df70 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b   if( nFree!=0 ){
2df80 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20  .    u32 nLeaf; 
2df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2dfa0 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
2dfb0 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f   of leaf cells o
2dfc0 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  n trunk page */.
2dfd0 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65  .    iTrunk = ge
2dfe0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2dff0 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
2e000 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2e010 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
2e020 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
2e030 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2e040 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
2e050 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2e060 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d    }..    nLeaf =
2e070 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
2e080 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
2e090 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
2e0a0 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a  sableSize>32 );.
2e0b0 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20      if( nLeaf > 
2e0c0 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
2e0d0 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20  Size/4 - 2 ){.  
2e0e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2e0f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2e100 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
2e110 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
2e120 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33   if( nLeaf < (u3
2e130 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  2)pBt->usableSiz
2e140 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
2e150 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
2e160 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f   there is room o
2e170 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  n the trunk page
2e180 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70   to insert the p
2e190 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  age.      ** bei
2e1a0 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65  ng freed as a ne
2e1b0 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a  w leaf..      **
2e1c0 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  .      ** Note t
2e1d0 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  hat the trunk pa
2e1e0 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  ge is not really
2e1f0 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63   full until it c
2e200 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
2e210 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
2e220 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75  2 entries, not u
2e230 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
2e240 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61  entries as we ha
2e250 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  ve.      ** code
2e260 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61  d.  But due to a
2e270 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e   coding error in
2e280 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
2e290 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  ite prior to.   
2e2a0 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74     ** 3.6.0, dat
2e2b0 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65  abases with free
2e2c0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73  list trunk pages
2e2d0 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68   holding more th
2e2e0 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  an.      ** usab
2e2f0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
2e300 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70  ries will be rep
2e310 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74  orted as corrupt
2e320 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20  .  In order.    
2e330 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e    ** to maintain
2e340 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
2e350 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c  tibility with ol
2e360 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
2e370 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a  SQLite,.      **
2e380 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
2e390 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68  e to restrict th
2e3a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
2e3b0 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a  ies to usableSiz
2e3c0 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a  e/4 - 8.      **
2e3d0 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f   for now.  At so
2e3e0 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
2e3f0 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65  future (once eve
2e400 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64  ryone has upgrad
2e410 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33  ed.      ** to 3
2e420 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77  .6.0 or later) w
2e430 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65  e should conside
2e440 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e  r fixing the con
2e450 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20  ditional above. 
2e460 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20       ** to read 
2e470 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22  "usableSize/4-2"
2e480 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61   instead of "usa
2e490 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20  bleSize/4-8"..  
2e4a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2e4b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2e4c0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
2e4d0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
2e4e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e4f0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
2e500 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2e510 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20  [4], nLeaf+1);. 
2e520 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2e530 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
2e540 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65  +nLeaf*4], iPage
2e550 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2e560 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74  Page && (pBt->bt
2e570 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
2e580 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29  URE_DELETE)==0 )
2e590 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2e5a0 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
2e5b0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2e5c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2e5d0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53       rc = btreeS
2e5e0 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
2e5f0 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
2e600 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
2e610 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
2e620 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
2e630 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
2e640 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
2e650 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  );.      goto fr
2e660 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
2e670 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63  }.  }..  /* If c
2e680 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20  ontrol flows to 
2e690 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
2e6a0 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73   it was not poss
2e6b0 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a  ible to add the.
2e6c0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65    ** the page be
2e6d0 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c  ing freed as a l
2e6e0 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20  eaf page of the 
2e6f0 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
2e700 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
2e710 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61  ** Possibly beca
2e720 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73  use the free-lis
2e730 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70  t is empty, or p
2e740 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
2e750 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20  the .  ** first 
2e760 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
2e770 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20  e-list is full. 
2e780 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
2e790 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
2e7a0 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d  .  ** will becom
2e7b0 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20  e the new first 
2e7c0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
2e7d0 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
2e7e0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30  /.  if( pPage==0
2e7f0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
2e800 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2e810 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
2e820 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20  Page, 0)) ){.   
2e830 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2e840 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  ut;.  }.  rc = s
2e850 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2e860 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2e870 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2e880 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
2e890 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2e8a0 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70    }.  put4byte(p
2e8b0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72  Page->aData, iTr
2e8c0 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65  unk);.  put4byte
2e8d0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34  (&pPage->aData[4
2e8e0 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74  ], 0);.  put4byt
2e8f0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2e900 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  [32], iPage);.  
2e910 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
2e920 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20  E: %d new trunk 
2e930 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25  page replacing %
2e940 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
2e950 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72  o, iTrunk));..fr
2e960 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  eepage_out:.  if
2e970 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70  ( pPage ){.    p
2e980 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
2e990 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
2e9a0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
2e9b0 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
2e9c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2e9d0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  }.static void fr
2e9e0 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  eePage(MemPage *
2e9f0 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29  pPage, int *pRC)
2ea00 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d  {.  if( (*pRC)==
2ea10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ea20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67 65   *pRC = freePage
2ea30 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50  2(pPage->pBt, pP
2ea40 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  age, pPage->pgno
2ea50 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2ea60 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f  Free any overflo
2ea70 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74  w pages associat
2ea80 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
2ea90 6e 20 43 65 6c 6c 2e 20 20 57 72 69 74 65 20 74  n Cell.  Write t
2eaa0 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c  he.** local Cell
2eab0 20 73 69 7a 65 20 28 74 68 65 20 6e 75 6d 62 65   size (the numbe
2eac0 72 20 6f 66 20 62 79 74 65 73 20 6f 6e 20 74 68  r of bytes on th
2ead0 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2c  e original page,
2eae0 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65   omitting.** ove
2eaf0 72 66 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53  rflow) into *pnS
2eb00 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
2eb10 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20  nt clearCell(.  
2eb20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2eb30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2eb40 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
2eb50 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20  ns the Cell */. 
2eb60 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2eb70 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72  pCell,    /* Fir
2eb80 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 43  st byte of the C
2eb90 65 6c 6c 20 2a 2f 0a 20 20 75 31 36 20 2a 70 6e  ell */.  u16 *pn
2eba0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
2ebb0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73    /* Write the s
2ebc0 69 7a 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20  ize of the Cell 
2ebd0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  here */.){.  BtS
2ebe0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
2ebf0 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49  ge->pBt;.  CellI
2ec00 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f  nfo info;.  Pgno
2ec10 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74   ovflPgno;.  int
2ec20 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c   rc;.  int nOvfl
2ec30 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65  ;.  u32 ovflPage
2ec40 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Size;..  assert(
2ec50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2ec60 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2ec70 6d 75 74 65 78 29 20 29 3b 0a 20 20 62 74 72 65  mutex) );.  btre
2ec80 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
2ec90 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
2eca0 6f 29 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20  o);.  *pnSize = 
2ecb0 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 69 66  info.nSize;.  if
2ecc0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
2ecd0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2ece0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
2ecf0 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
2ed00 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
2ed10 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
2ed20 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  g */.  }.  if( p
2ed30 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell+info.iOverf
2ed40 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61  low+3 > pPage->a
2ed50 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
2ed60 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
2ed70 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2ed80 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c  T_BKPT;  /* Cell
2ed90 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e   extends past en
2eda0 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d  d of page */.  }
2edb0 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65  .  ovflPgno = ge
2edc0 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
2edd0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
2ede0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
2edf0 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b  sableSize > 4 );
2ee00 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20  .  ovflPageSize 
2ee10 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
2ee20 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d  e - 4;.  nOvfl =
2ee30 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
2ee40 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20  - info.nLocal + 
2ee50 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31  ovflPageSize - 1
2ee60 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  )/ovflPageSize;.
2ee70 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67    assert( ovflPg
2ee80 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30  no==0 || nOvfl>0
2ee90 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76   );.  while( nOv
2eea0 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  fl-- ){.    Pgno
2eeb0 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20   iNext = 0;.    
2eec0 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
2eed0 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c   0;.    if( ovfl
2eee0 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67  Pgno<2 || ovflPg
2eef0 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no>btreePagecoun
2ef00 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
2ef10 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65  /* 0 is not a le
2ef20 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
2ef30 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f  and page 1 canno
2ef40 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a  t be an .      *
2ef50 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  * overflow page.
2ef60 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76   Therefore if ov
2ef70 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74  flPgno<2 or past
2ef80 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2ef90 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74  .      ** file t
2efa0 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
2efb0 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a   be corrupt. */.
2efc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2efd0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2efe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2eff0 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72  nOvfl ){.      r
2f000 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
2f010 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  age(pBt, ovflPgn
2f020 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78  o, &pOvfl, &iNex
2f030 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
2f040 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2f050 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70    }..    if( ( p
2f060 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20  Ovfl || ((pOvfl 
2f070 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
2f080 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29  p(pBt, ovflPgno)
2f090 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20  )!=0) ).     && 
2f0a0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2f0b0 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e  Refcount(pOvfl->
2f0c0 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20  pDbPage)!=1.    
2f0d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  ){.      /* Ther
2f0e0 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61  e is no reason a
2f0f0 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64  ny cursor should
2f100 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e   have an outstan
2f110 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a  ding reference .
2f120 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f        ** to an o
2f130 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c  verflow page bel
2f140 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c  onging to a cell
2f150 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64   that is being d
2f160 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a  eleted/updated..
2f170 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74        ** So if t
2f180 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65  here exists more
2f190 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65   than one refere
2f1a0 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  nce to this page
2f1b0 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20  , then it .     
2f1c0 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61   ** must not rea
2f1d0 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  lly be an overfl
2f1e0 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  ow page and the 
2f1f0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
2f200 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20   corrupt. .     
2f210 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75   ** It is helpfu
2f220 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73  l to detect this
2f230 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
2f240 66 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20  freePage2(), as 
2f250 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61  .      ** freePa
2f260 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74  ge2() may zero t
2f270 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  he page contents
2f280 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74   if secure-delet
2f290 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20  e mode is.      
2f2a0 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74  ** enabled. If t
2f2b0 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70  his 'overflow' p
2f2c0 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  age happens to b
2f2d0 65 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68  e a page that th
2f2e0 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65  e.      ** calle
2f2f0 72 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74  r is iterating t
2f300 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20  hrough or using 
2f310 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61  in some other wa
2f320 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  y, this.      **
2f330 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61   can be problema
2f340 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tic..      */.  
2f350 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f360 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2f370 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2f380 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42  c = freePage2(pB
2f390 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67  t, pOvfl, ovflPg
2f3a0 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  no);.    }..    
2f3b0 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20  if( pOvfl ){.   
2f3c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
2f3d0 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50  nref(pOvfl->pDbP
2f3e0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
2f3f0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2f400 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f  rc;.    ovflPgno
2f410 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20   = iNext;.  }.  
2f420 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2f430 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
2f440 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65  e the byte seque
2f450 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72  nce used to repr
2f460 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20  esent a cell on 
2f470 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e  page pPage.** an
2f480 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74  d write that byt
2f490 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20  e sequence into 
2f4a0 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c  pCell[].  Overfl
2f4b0 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ow pages are.** 
2f4c0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69  allocated and fi
2f4d0 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73  lled in as neces
2f4e0 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69  sary.  The calli
2f4f0 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20  ng procedure.** 
2f500 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
2f510 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73  or making sure s
2f520 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
2f530 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
2f540 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b  ed.** for pCell[
2f550 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  ]..**.** Note th
2f560 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f  at pCell does no
2f570 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64  t necessary need
2f580 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
2f590 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
2f5a0 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69   area.  pCell mi
2f5b0 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d  ght point to som
2f5c0 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  e temporary stor
2f5d0 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77  age.  The cell w
2f5e0 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72  ill.** be constr
2f5f0 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65  ucted in this te
2f600 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65  mporary area the
2f610 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50  n copied into pP
2f620 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61  age->aData.** la
2f630 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
2f640 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20  nt fillInCell(. 
2f650 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
2f660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f670 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
2f680 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65   contains the ce
2f690 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ll */.  unsigned
2f6a0 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20   char *pCell,   
2f6b0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65         /* Comple
2f6c0 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  te text of the c
2f6d0 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ell */.  const v
2f6e0 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e  oid *pKey, i64 n
2f6f0 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b  Key,    /* The k
2f700 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ey */.  const vo
2f710 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44  id *pData,int nD
2f720 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61  ata,   /* The da
2f730 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72  ta */.  int nZer
2f740 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
2f750 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
2f760 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70  zero bytes to ap
2f770 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f  pend to pData */
2f780 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20  .  int *pnSize  
2f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7a0 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20    /* Write cell 
2f7b0 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  size here */.){.
2f7c0 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a    int nPayload;.
2f7d0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63    const u8 *pSrc
2f7e0 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c  ;.  int nSrc, n,
2f7f0 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65   rc;.  int space
2f800 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Left;.  MemPage 
2f810 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65  *pOvfl = 0;.  Me
2f820 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73  mPage *pToReleas
2f830 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  e = 0;.  unsigne
2f840 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a  d char *pPrior;.
2f850 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2f860 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53  *pPayload;.  BtS
2f870 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
2f880 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ge->pBt;.  Pgno 
2f890 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  pgnoOvfl = 0;.  
2f8a0 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20  int nHeader;..  
2f8b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2f8c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2f8d0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2f8e0 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20  ..  /* pPage is 
2f8f0 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
2f900 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20  writeable since 
2f910 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61  pCell might be a
2f920 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75  uxiliary.  ** bu
2f930 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20  ffer space that 
2f940 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d  is separate from
2f950 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65   the pPage buffe
2f960 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65  r area */.  asse
2f970 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d  rt( pCell<pPage-
2f980 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e  >aData || pCell>
2f990 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
2f9a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
2f9b0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
2f9c0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2f9d0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2f9e0 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  age) );..  /* Fi
2f9f0 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ll in the header
2fa00 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d  . */.  nHeader =
2fa10 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
2fa20 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64  Size;.  nPayload
2fa30 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f   = nData + nZero
2fa40 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
2fa50 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
2fa60 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
2fa70 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
2fa80 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61  Header], nPayloa
2fa90 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
2faa0 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d   assert( nData==
2fab0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2fac0 20 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d   nZero==0 );.  }
2fad0 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75  .  nHeader += pu
2fae0 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
2faf0 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29  Header], *(u64*)
2fb00 26 6e 4b 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20  &nKey);.  .  /* 
2fb10 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c  Fill in the payl
2fb20 6f 61 64 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66  oad size */.  if
2fb30 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2fb40 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44  ){.    pSrc = pD
2fb50 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  ata;.    nSrc = 
2fb60 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61  nData;.    nData
2fb70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a   = 0;.  }else{ .
2fb80 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b      if( NEVER(nK
2fb90 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c  ey>0x7fffffff ||
2fba0 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20   pKey==0) ){.   
2fbb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2fbc0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2fbd0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
2fbe0 64 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20  d = (int)nKey;. 
2fbf0 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a     pSrc = pKey;.
2fc00 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29      nSrc = (int)
2fc10 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
2fc20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
2fc30 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
2fc40 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e   n = nHeader + n
2fc50 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73  Payload;.    tes
2fc60 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20  tcase( n==3 );. 
2fc70 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
2fc80 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34  4 );.    if( n<4
2fc90 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70   ) n = 4;.    *p
2fca0 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73  nSize = n;.    s
2fcb0 70 61 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c  paceLeft = nPayl
2fcc0 6f 61 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20  oad;.    pPrior 
2fcd0 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65  = pCell;.  }else
2fce0 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70  {.    int mn = p
2fcf0 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
2fd00 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50      n = mn + (nP
2fd10 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28  ayload - mn) % (
2fd20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2fd30 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
2fd40 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50   testcase( n==pP
2fd50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
2fd60 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
2fd70 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
2fd80 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  l+1 );.    if( n
2fd90 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63   > pPage->maxLoc
2fda0 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20  al ) n = mn;.   
2fdb0 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a   spaceLeft = n;.
2fdc0 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20      *pnSize = n 
2fdd0 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20  + nHeader + 4;. 
2fde0 20 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65     pPrior = &pCe
2fdf0 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20  ll[nHeader+n];. 
2fe00 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20   }.  pPayload = 
2fe10 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b  &pCell[nHeader];
2fe20 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
2fe30 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73  oint variables s
2fe40 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20  hould be set as 
2fe50 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
2fe60 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20  **   nPayload   
2fe70 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61          Total pa
2fe80 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79  yload size in by
2fe90 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c  tes.  **   pPayl
2fea0 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 42 65  oad           Be
2feb0 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c  gin writing payl
2fec0 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20  oad here.  **   
2fed0 73 70 61 63 65 4c 65 66 74 20 20 20 20 20 20 20  spaceLeft       
2fee0 20 20 20 53 70 61 63 65 20 61 76 61 69 6c 61 62     Space availab
2fef0 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20  le at pPayload. 
2ff00 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61   If nPayload>spa
2ff10 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20  ceLeft,.  **    
2ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff30 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e    that means con
2ff40 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20  tent must spill 
2ff50 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  into overflow pa
2ff60 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53  ges..  **   *pnS
2ff70 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 53  ize            S
2ff80 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c  ize of the local
2ff90 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74   cell (not count
2ffa0 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ing overflow pag
2ffb0 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f  es).  **   pPrio
2ffc0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 57 68  r             Wh
2ffd0 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ere to write the
2ffe0 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72   pgno of the fir
2fff0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
30000 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61  .  **.  ** Use a
30010 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61   call to btreePa
30020 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20  rseCellPtr() to 
30030 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
30040 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a  values above.  *
30050 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20  * were computed 
30060 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a  correctly..  */.
30070 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
30080 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  .  {.    CellInf
30090 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 62 74 72 65  o info;.    btre
300a0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
300b0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
300c0 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
300d0 6e 48 65 61 64 65 72 3d 28 69 6e 74 29 28 69 6e  nHeader=(int)(in
300e0 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43  fo.pPayload - pC
300f0 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ell) );.    asse
30100 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e  rt( info.nKey==n
30110 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Key );.    asser
30120 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e  t( *pnSize == in
30130 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20  fo.nSize );.    
30140 61 73 73 65 72 74 28 20 73 70 61 63 65 4c 65 66  assert( spaceLef
30150 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  t == info.nLocal
30160 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
30170 70 50 72 69 6f 72 20 3d 3d 20 26 70 43 65 6c 6c  pPrior == &pCell
30180 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
30190 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
301a0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
301b0 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20  ayload into the 
301c0 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61  local Cell and a
301d0 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76  ny extra into ov
301e0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a  erflow pages */.
301f0 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
30200 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
30210 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23  paceLeft==0 ){.#
30220 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
30230 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
30240 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
30250 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
30260 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
30270 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
30280 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
30290 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
302a0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
302b0 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
302c0 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
302d0 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
302e0 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
302f0 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
30300 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
30310 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
30320 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
30330 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
30340 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
30350 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
30360 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
30370 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
30380 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
30390 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
303a0 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
303b0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
303c0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
303d0 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
303e0 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
303f0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
30400 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
30410 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
30420 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
30430 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
30440 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
30450 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
30460 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
30470 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
30480 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
30490 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
304a0 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
304b0 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
304c0 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
304d0 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
304e0 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
304f0 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
30500 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
30510 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
30520 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
30530 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
30540 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
30550 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
30560 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e  alized values an
30570 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
30580 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
30590 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
305a0 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
305b0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
305c0 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
305d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
305e0 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
305f0 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
30600 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
30610 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
30620 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
30630 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
30640 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61  eType, pgnoPtrma
30650 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  p, &rc);.       
30660 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
30670 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
30680 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
30690 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
306a0 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
306b0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
306c0 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
306d0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
306e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
306f0 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65       /* If pToRe
30700 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
30710 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f  o than pPrior po
30720 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
30730 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a  ta area.      **
30740 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
30750 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
30760 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
30770 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
30780 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
30790 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
307a0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
307b0 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
307c0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
307d0 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20     /* If pPrior 
307e0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
307f0 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
30800 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
30810 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  e pPage.      **
30820 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
30830 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
30840 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67  ert( pPrior<pPag
30850 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69  e->aData || pPri
30860 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  or>=&pPage->aDat
30870 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
30880 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
30890 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
308a0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
308b0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
308c0 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
308d0 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
308e0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
308f0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
30900 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
30910 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
30920 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
30930 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
30940 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
30950 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
30960 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
30970 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
30980 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
30990 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
309a0 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
309b0 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
309c0 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
309d0 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Left;..    /* If
309e0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
309f0 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61  ot zero than pPa
30a00 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74  yload points int
30a10 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
30a20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
30a30 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
30a40 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
30a50 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
30a60 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
30a70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
30a80 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
30a90 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
30aa0 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
30ab0 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c  .    /* If pPayl
30ac0 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74  oad is part of t
30ad0 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
30ae0 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
30af0 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
30b00 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
30b10 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73  eable */.    ass
30b20 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50  ert( pPayload<pP
30b30 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
30b40 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e  ayload>=&pPage->
30b50 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
30b60 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
30b70 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
30b80 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
30b90 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
30ba0 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29      if( nSrc>0 )
30bb0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53  {.      if( n>nS
30bc0 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20  rc ) n = nSrc;. 
30bd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
30be0 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  c );.      memcp
30bf0 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
30c00 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
30c10 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
30c20 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
30c30 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
30c40 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79  d -= n;.    pPay
30c50 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
30c60 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
30c70 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
30c80 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20  ceLeft -= n;.   
30c90 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a   if( nSrc==0 ){.
30ca0 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61        nSrc = nDa
30cb0 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d  ta;.      pSrc =
30cc0 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20   pData;.    }.  
30cd0 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
30ce0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72  pToRelease);.  r
30cf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30d00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
30d10 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66   the i-th cell f
30d20 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73  rom pPage.  This
30d30 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73   routine effects
30d40 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20   pPage only..** 
30d50 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  The cell content
30d60 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72   is not freed or
30d70 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49   deallocated.  I
30d80 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
30d90 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f  t.** the cell co
30da0 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63  ntent has been c
30db0 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20  opied someplace 
30dc0 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  else.  This rout
30dd0 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f  ine just.** remo
30de0 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  ves the referenc
30df0 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72  e to the cell fr
30e00 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  om pPage..**.** 
30e10 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65  "sz" must be the
30e20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
30e30 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f   in the cell..*/
30e40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f  .static void dro
30e50 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  pCell(MemPage *p
30e60 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69  Page, int idx, i
30e70 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29  nt sz, int *pRC)
30e80 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20  {.  u32 pc;     
30e90 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
30ea0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
30eb0 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
30ec0 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
30ed0 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
30ee0 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
30ef0 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
30f00 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
30f10 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
30f20 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
30f30 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
30f40 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
30f50 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
30f60 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
30f70 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
30f80 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
30f90 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
30fa0 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
30fb0 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
30fc0 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
30fd0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
30fe0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
30ff0 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
31000 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
31010 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
31020 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
31030 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
31040 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
31050 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
31060 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
31070 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
31080 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61  ta;.  ptr = &pPa
31090 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69  ge->aCellIdx[2*i
310a0 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
310b0 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72  byte(ptr);.  hdr
310c0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
310d0 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28  set;.  testcase(
310e0 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64   pc==get2byte(&d
310f0 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
31100 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
31110 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ==pPage->pBt->us
31120 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  ableSize );.  if
31130 28 20 70 63 20 3c 20 28 75 33 32 29 67 65 74 32  ( pc < (u32)get2
31140 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
31150 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50  ]) || pc+sz > pP
31160 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
31170 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43  Size ){.    *pRC
31180 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
31190 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
311a0 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66  rn;.  }.  rc = f
311b0 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
311c0 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72  pc, sz);.  if( r
311d0 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  c ){.    *pRC = 
311e0 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
311f0 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
31200 6c 6c 2d 2d 3b 0a 20 20 6d 65 6d 6d 6f 76 65 28  ll--;.  memmove(
31210 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70  ptr, ptr+2, 2*(p
31220 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64  Page->nCell - id
31230 78 29 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  x));.  put2byte(
31240 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
31250 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  age->nCell);.  p
31260 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32  Page->nFree += 2
31270 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
31280 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
31290 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
312a0 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
312b0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
312c0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
312d0 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
312e0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
312f0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
31300 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
31310 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
31320 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
31330 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
31340 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
31350 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
31360 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
31370 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
31380 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
31390 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
313a0 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
313b0 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d  ->apOvfl[] and m
313c0 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
313d0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
313e0 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70   (either.** in p
313f0 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67  Temp or the orig
31400 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20  inal pCell) and 
31410 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20  also record its 
31420 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63  index. .** Alloc
31430 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  ating a new entr
31440 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
31450 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74  l[] implies that
31460 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65   .** pPage->nOve
31470 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65  rflow is increme
31480 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nted..*/.static 
31490 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28  void insertCell(
314a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
314b0 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74  e,   /* Page int
314c0 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63  o which we are c
314d0 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  opying */.  int 
314e0 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i,            /*
314f0 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65   New cell become
31500 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  s the i-th cell 
31510 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
31520 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
31530 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
31540 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f   the new cell */
31550 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20  .  int sz,      
31560 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
31570 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c   content in pCel
31580 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70  l */.  u8 *pTemp
31590 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ,        /* Temp
315a0 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66   storage space f
315b0 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65  or pCell, if nee
315c0 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ded */.  Pgno iC
315d0 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66  hild,      /* If
315e0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61   non-zero, repla
315f0 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  ce first 4 bytes
31600 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65   with this value
31610 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20   */.  int *pRC  
31620 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
31630 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e  and write return
31640 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20   code from here 
31650 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20  */.){.  int idx 
31660 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65  = 0;      /* Whe
31670 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20  re to write new 
31680 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
31690 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
316a0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
316b0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
316c0 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20  .  int end;     
316d0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
316e0 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  te past the last
316f0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
31700 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
31710 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f   ins;          /
31720 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b  * Index in data[
31730 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c  ] where new cell
31740 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65   pointer is inse
31750 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65  rted */.  int ce
31760 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41  llOffset;   /* A
31770 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20  ddress of first 
31780 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
31790 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
317a0 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
317b0 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
317c0 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
317d0 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
317e0 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
317f0 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50  t( i>=0 && i<=pP
31800 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65  age->nCell+pPage
31810 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
31820 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c   assert( MX_CELL
31830 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30  (pPage->pBt)<=10
31840 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  921 );.  assert(
31850 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d   pPage->nCell<=M
31860 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
31870 74 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  t) || CORRUPT_DB
31880 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
31890 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d  age->nOverflow<=
318a0 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
318b0 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73  >apOvfl) );.  as
318c0 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28  sert( ArraySize(
318d0 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d  pPage->apOvfl)==
318e0 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
318f0 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73  >aiOvfl) );.  as
31900 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
31910 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
31920 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
31930 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f   /* The cell sho
31940 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20  uld normally be 
31950 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  sized correctly.
31960 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20    However, when 
31970 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61  moving a.  ** ma
31980 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f  lformed cell fro
31990 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f  m a leaf page to
319a0 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67   an interior pag
319b0 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73  e, if the cell s
319c0 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20  ize.  ** wanted 
319d0 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  to be less than 
319e0 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65  4 but got rounde
319f0 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65  d up to 4 on the
31a00 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65   leaf, then size
31a10 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c  .  ** might be l
31a20 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66  ess than 8 (leaf
31a30 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29  -size + pointer)
31a40 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72   on the interior
31a50 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20   node.  Hence.  
31a60 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74 65  ** the term afte
31a70 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20  r the || in the 
31a80 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
31a90 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  (). */.  assert(
31aa0 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72   sz==cellSizePtr
31ab0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c  (pPage, pCell) |
31ac0 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69  | (sz==8 && iChi
31ad0 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70  ld>0) );.  if( p
31ae0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
31af0 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e  || sz+2>pPage->n
31b00 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Free ){.    if( 
31b10 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d  pTemp ){.      m
31b20 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 70 43 65  emcpy(pTemp, pCe
31b30 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 70  ll, sz);.      p
31b40 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
31b50 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69    }.    if( iChi
31b60 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
31b70 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69  byte(pCell, iChi
31b80 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  ld);.    }.    j
31b90 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
31ba0 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  low++;.    asser
31bb0 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f  t( j<(int)(sizeo
31bc0 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  f(pPage->apOvfl)
31bd0 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  /sizeof(pPage->a
31be0 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20  pOvfl[0])) );.  
31bf0 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b    pPage->apOvfl[
31c00 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  j] = pCell;.    
31c10 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d  pPage->aiOvfl[j]
31c20 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c   = (u16)i;.  }el
31c30 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  se{.    int rc =
31c40 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31c50 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
31c60 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
31c70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31c80 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
31c90 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
31ca0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  }.    assert( sq
31cb0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
31cc0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
31cd0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74  Page) );.    dat
31ce0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
31cf0 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74  ;.    cellOffset
31d00 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
31d10 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20  fset;.    end = 
31d20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
31d30 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
31d40 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65   ins = cellOffse
31d50 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20  t + 2*i;.    rc 
31d60 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
31d70 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29  pPage, sz, &idx)
31d80 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20  ;.    if( rc ){ 
31d90 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72  *pRC = rc; retur
31da0 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20  n; }.    /* The 
31db0 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20  allocateSpace() 
31dc0 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65  routine guarante
31dd0 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
31de0 20 74 77 6f 20 70 72 6f 70 65 72 74 69 65 73 0a   two properties.
31df0 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74      ** if it ret
31e00 75 72 6e 73 20 73 75 63 63 65 73 73 20 2a 2f 0a  urns success */.
31e10 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20      assert( idx 
31e20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20  >= end+2 );.    
31e30 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c  assert( idx+sz <
31e40 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
31e50 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
31e60 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
31e70 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  l++;.    pPage->
31e80 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32  nFree -= (u16)(2
31e90 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63   + sz);.    memc
31ea0 70 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 70  py(&data[idx], p
31eb0 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 69  Cell, sz);.    i
31ec0 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
31ed0 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74     put4byte(&dat
31ee0 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b  a[idx], iChild);
31ef0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 6d 6f  .    }.    memmo
31f00 76 65 28 26 64 61 74 61 5b 69 6e 73 2b 32 5d 2c  ve(&data[ins+2],
31f10 20 26 64 61 74 61 5b 69 6e 73 5d 2c 20 65 6e 64   &data[ins], end
31f20 2d 69 6e 73 29 3b 0a 20 20 20 20 70 75 74 32 62  -ins);.    put2b
31f30 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20  yte(&data[ins], 
31f40 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79  idx);.    put2by
31f50 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e  te(&data[pPage->
31f60 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50  hdrOffset+3], pP
31f70 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66  age->nCell);.#if
31f80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31f90 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
31fa0 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
31fb0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
31fc0 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
31fd0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f  may contain a po
31fe0 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72  inter to an over
31ff0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f  flow page. If so
32000 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
32010 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
32020 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
32030 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
32040 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a  r map..      */.
32050 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f        ptrmapPutO
32060 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
32070 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d  ell, pRC);.    }
32080 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
32090 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c  *.** Array apCel
320a0 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69  l[] contains poi
320b0 6e 74 65 72 73 20 74 6f 20 6e 43 65 6c 6c 20 62  nters to nCell b
320c0 2d 74 72 65 65 20 70 61 67 65 20 63 65 6c 6c 73  -tree page cells
320d0 2e 20 54 68 65 20 0a 2a 2a 20 73 7a 43 65 6c 6c  . The .** szCell
320e0 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
320f0 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79  s the size in by
32100 74 65 73 20 6f 66 20 65 61 63 68 20 63 65 6c 6c  tes of each cell
32110 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  . This function.
32120 2a 2a 20 72 65 70 6c 61 63 65 73 20 74 68 65 20  ** replaces the 
32130 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
32140 20 6f 66 20 70 61 67 65 20 70 50 67 20 77 69 74   of page pPg wit
32150 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  h the contents o
32160 66 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 61 72  f the cell.** ar
32170 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20  ray..**.** Some 
32180 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  of the cells in 
32190 61 70 43 65 6c 6c 5b 5d 20 6d 61 79 20 63 75 72  apCell[] may cur
321a0 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64  rently be stored
321b0 20 69 6e 20 70 50 67 2e 20 54 68 69 73 0a 2a 2a   in pPg. This.**
321c0 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
321d0 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20  around problems 
321e0 63 61 75 73 65 64 20 62 79 20 74 68 69 73 20 62  caused by this b
321f0 79 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 20  y making a copy 
32200 6f 66 20 61 6e 79 20 0a 2a 2a 20 73 75 63 68 20  of any .** such 
32210 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 6f 76 65  cells before ove
32220 72 77 72 69 74 69 6e 67 20 74 68 65 20 70 61 67  rwriting the pag
32230 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68  e data..**.** Th
32240 65 20 4d 65 6d 50 61 67 65 2e 6e 46 72 65 65 20  e MemPage.nFree 
32250 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64  field is invalid
32260 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
32270 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 74 68 65  ction. It is the
32280 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c   .** responsibil
32290 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
322a0 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f 72 72  r to set it corr
322b0 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ectly..*/.static
322c0 20 76 6f 69 64 20 72 65 62 75 69 6c 64 50 61 67   void rebuildPag
322d0 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e(.  MemPage *pP
322e0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
322f0 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68 69       /* Edit thi
32300 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  s page */.  int 
32310 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  nCell,          
32320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
32330 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63  inal number of c
32340 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a  ells on page */.
32350 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20    u8 **apCell,  
32360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32370 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
32380 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  lls */.  u16 *sz
32390 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20  Cell            
323a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
323b0 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73 20  y of cell sizes 
323c0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  */.){.  const in
323d0 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72  t hdr = pPg->hdr
323e0 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
323f0 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65   /* Offset of he
32400 61 64 65 72 20 6f 6e 20 70 50 67 20 2a 2f 0a 20  ader on pPg */. 
32410 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
32420 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 20  a = pPg->aData; 
32430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
32440 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72  nter to data for
32450 20 70 50 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   pPg */.  const 
32460 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  int usableSize =
32470 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   pPg->pBt->usabl
32480 65 53 69 7a 65 3b 0a 20 20 75 38 20 2a 20 63 6f  eSize;.  u8 * co
32490 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74  nst pEnd = &aDat
324a0 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  a[usableSize];. 
324b0 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70 43   int i;.  u8 *pC
324c0 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61 43  ellptr = pPg->aC
324d0 65 6c 6c 49 64 78 3b 0a 20 20 75 38 20 2a 70 54  ellIdx;.  u8 *pT
324e0 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
324f0 72 54 65 6d 70 53 70 61 63 65 28 70 50 67 2d 3e  rTempSpace(pPg->
32500 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
32510 75 38 20 2a 70 44 61 74 61 3b 0a 0a 20 20 69 20  u8 *pData;..  i 
32520 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
32530 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d  a[hdr+5]);.  mem
32540 63 70 79 28 26 70 54 6d 70 5b 69 5d 2c 20 26 61  cpy(&pTmp[i], &a
32550 44 61 74 61 5b 69 5d 2c 20 75 73 61 62 6c 65 53  Data[i], usableS
32560 69 7a 65 20 2d 20 69 29 3b 0a 0a 20 20 70 44 61  ize - i);..  pDa
32570 74 61 20 3d 20 70 45 6e 64 3b 0a 20 20 66 6f 72  ta = pEnd;.  for
32580 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
32590 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
325a0 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a  ll = apCell[i];.
325b0 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 61 44      if( pCell>aD
325c0 61 74 61 20 26 26 20 70 43 65 6c 6c 3c 70 45 6e  ata && pCell<pEn
325d0 64 20 29 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c  d ){.      pCell
325e0 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c 6c 20 2d   = &pTmp[pCell -
325f0 20 61 44 61 74 61 5d 3b 0a 20 20 20 20 7d 0a 20   aData];.    }. 
32600 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 43 65     pData -= szCe
32610 6c 6c 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  ll[i];.    memcp
32620 79 28 70 44 61 74 61 2c 20 70 43 65 6c 6c 2c 20  y(pData, pCell, 
32630 73 7a 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20  szCell[i]);.    
32640 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74  put2byte(pCellpt
32650 72 2c 20 28 70 44 61 74 61 20 2d 20 61 44 61 74  r, (pData - aDat
32660 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74  a));.    pCellpt
32670 72 20 2b 3d 20 32 3b 0a 20 20 20 20 61 73 73 65  r += 2;.    asse
32680 72 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d 63  rt( szCell[i]==c
32690 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 67 2c 20  ellSizePtr(pPg, 
326a0 70 43 65 6c 6c 29 20 29 3b 0a 20 20 7d 0a 0a 20  pCell) );.  }.. 
326b0 20 2f 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72   /* The pPg->nFr
326c0 65 65 20 66 69 65 6c 64 20 69 73 20 6e 6f 77 20  ee field is now 
326d0 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e  set incorrectly.
326e0 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
326f0 20 66 69 78 20 69 74 2e 20 2a 2f 0a 20 20 70 50   fix it. */.  pP
32700 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c  g->nCell = nCell
32710 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c  ;.  pPg->nOverfl
32720 6f 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62  ow = 0;..  put2b
32730 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 31  yte(&aData[hdr+1
32740 5d 2c 20 30 29 3b 0a 20 20 70 75 74 32 62 79 74  ], 0);.  put2byt
32750 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c  e(&aData[hdr+3],
32760 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20   pPg->nCell);.  
32770 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
32780 68 64 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20  hdr+5], pData - 
32790 61 44 61 74 61 29 3b 0a 20 20 61 44 61 74 61 5b  aData);.  aData[
327a0 68 64 72 2b 37 5d 20 3d 20 30 78 30 30 3b 0a 7d  hdr+7] = 0x00;.}
327b0 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70  ../*.** Array ap
327c0 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  Cell[] contains 
327d0 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74  nCell pointers t
327e0 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20  o b-tree cells. 
327f0 41 72 72 61 79 20 73 7a 43 65 6c 6c 0a 2a 2a 20  Array szCell.** 
32800 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a  contains the siz
32810 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61  e in bytes of ea
32820 63 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68  ch such cell. Th
32830 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
32840 6d 70 74 73 20 74 6f 20 0a 2a 2a 20 61 64 64 20  mpts to .** add 
32850 74 68 65 20 63 65 6c 6c 73 20 73 74 6f 72 65 64  the cells stored
32860 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 74 6f   in the array to
32870 20 70 61 67 65 20 70 50 67 2e 20 49 66 20 69 74   page pPg. If it
32880 20 63 61 6e 6e 6f 74 20 28 62 65 63 61 75 73 65   cannot (because
32890 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 65   .** the page ne
328a0 65 64 73 20 74 6f 20 62 65 20 64 65 66 72 61 67  eds to be defrag
328b0 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 20 74 68  mented before th
328c0 65 20 63 65 6c 6c 73 20 77 69 6c 6c 20 66 69 74  e cells will fit
328d0 29 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69  ), non-zero.** i
328e0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
328f0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 65  rwise, if the ce
32900 6c 6c 73 20 61 72 65 20 61 64 64 65 64 20 73 75  lls are added su
32910 63 63 65 73 73 66 75 6c 6c 79 2c 20 7a 65 72 6f  ccessfully, zero
32920 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
32930 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
32940 70 43 65 6c 6c 70 74 72 20 70 6f 69 6e 74 73 20  pCellptr points 
32950 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
32960 72 79 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70  ry in the cell-p
32970 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 2a 2a 20  ointer array.** 
32980 28 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50  (part of page pP
32990 67 29 20 74 6f 20 70 6f 70 75 6c 61 74 65 2e 20  g) to populate. 
329a0 41 66 74 65 72 20 63 65 6c 6c 20 61 70 43 65 6c  After cell apCel
329b0 6c 5b 30 5d 20 69 73 20 77 72 69 74 74 65 6e 20  l[0] is written 
329c0 74 6f 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 62  to the.** page b
329d0 6f 64 79 2c 20 61 20 31 36 2d 62 69 74 20 6f 66  ody, a 16-bit of
329e0 66 73 65 74 20 69 73 20 77 72 69 74 74 65 6e 20  fset is written 
329f0 74 6f 20 70 43 65 6c 6c 70 74 72 2e 20 41 6e 64  to pCellptr. And
32a00 20 73 6f 20 6f 6e 2c 20 66 6f 72 20 65 61 63 68   so on, for each
32a10 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 74 68 65 20  .** cell in the 
32a20 61 72 72 61 79 2e 20 49 74 20 69 73 20 74 68 65  array. It is the
32a30 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
32a40 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
32a50 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61 74 20   ensure.** that 
32a60 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76  it is safe to ov
32a70 65 72 77 72 69 74 65 20 74 68 69 73 20 70 61 72  erwrite this par
32a80 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 70 6f  t of the cell-po
32a90 69 6e 74 65 72 20 61 72 72 61 79 2e 0a 2a 2a 0a  inter array..**.
32aa0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
32ab0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
32ac0 20 2a 70 70 44 61 74 61 20 70 6f 69 6e 74 73 20   *ppData points 
32ad0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
32ae0 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20  the .** content 
32af0 61 72 65 61 20 6f 6e 20 70 61 67 65 20 70 50 67  area on page pPg
32b00 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66  . If the size of
32b10 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65   the content are
32b20 61 20 69 73 20 65 78 74 65 6e 64 65 64 2c 0a 2a  a is extended,.*
32b30 2a 20 2a 70 70 44 61 74 61 20 69 73 20 75 70 64  * *ppData is upd
32b40 61 74 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  ated to point to
32b50 20 74 68 65 20 6e 65 77 20 73 74 61 72 74 20 6f   the new start o
32b60 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 72  f the content ar
32b70 65 61 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74  ea.** before ret
32b80 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46 69  urning..**.** Fi
32b90 6e 61 6c 6c 79 2c 20 61 72 67 75 6d 65 6e 74 20  nally, argument 
32ba0 70 42 65 67 69 6e 20 70 6f 69 6e 74 73 20 74 6f  pBegin points to
32bb0 20 74 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69   the byte immedi
32bc0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
32bd0 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
32be0 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  e space required
32bf0 20 62 79 20 74 68 69 73 20 70 61 67 65 20 66 6f   by this page fo
32c00 72 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  r the cell-point
32c10 65 72 20 61 72 65 61 20 28 66 6f 72 0a 2a 2a 20  er area (for.** 
32c20 61 6c 6c 20 63 65 6c 6c 73 20 2d 20 6e 6f 74 20  all cells - not 
32c30 6a 75 73 74 20 74 68 6f 73 65 20 69 6e 73 65 72  just those inser
32c40 74 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ted by the curre
32c50 6e 74 20 63 61 6c 6c 29 2e 20 49 66 20 74 68 65  nt call). If the
32c60 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 61 72 65 61   content.** area
32c70 20 6d 75 73 74 20 62 65 20 65 78 74 65 6e 64 65   must be extende
32c80 64 20 74 6f 20 62 65 66 6f 72 65 20 74 68 69 73  d to before this
32c90 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20   point in order 
32ca0 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 61 6c  to accomodate al
32cb0 6c 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 61 70  l.** cells in ap
32cc0 43 65 6c 6c 5b 5d 2c 20 74 68 65 6e 20 74 68 65  Cell[], then the
32cd0 20 63 65 6c 6c 73 20 64 6f 20 6e 6f 74 20 66 69   cells do not fi
32ce0 74 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69  t and non-zero i
32cf0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
32d00 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e  tatic int pageIn
32d10 73 65 72 74 41 72 72 61 79 28 0a 20 20 4d 65 6d  sertArray(.  Mem
32d20 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20  Page *pPg,      
32d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32d40 50 61 67 65 20 74 6f 20 61 64 64 20 63 65 6c 6c  Page to add cell
32d50 73 20 74 6f 20 2a 2f 0a 20 20 75 38 20 2a 70 42  s to */.  u8 *pB
32d60 65 67 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  egin,           
32d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
32d80 20 6f 66 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72   of cell-pointer
32d90 20 61 72 72 61 79 20 2a 2f 0a 20 20 75 38 20 2a   array */.  u8 *
32da0 2a 70 70 44 61 74 61 2c 20 20 20 20 20 20 20 20  *ppData,        
32db0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
32dc0 4e 2f 4f 55 54 3a 20 50 61 67 65 20 63 6f 6e 74  N/OUT: Page cont
32dd0 65 6e 74 20 2d 61 72 65 61 20 70 6f 69 6e 74 65  ent -area pointe
32de0 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  r */.  u8 *pCell
32df0 70 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ptr,            
32e00 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
32e10 72 20 74 6f 20 63 65 6c 6c 2d 70 6f 69 6e 74 65  r to cell-pointe
32e20 72 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  r area */.  int 
32e30 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  nCell,          
32e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
32e50 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74  umber of cells t
32e60 6f 20 61 64 64 20 74 6f 20 70 50 67 20 2a 2f 0a  o add to pPg */.
32e70 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20    u8 **apCell,  
32e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e90 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
32ea0 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  lls */.  u16 *sz
32eb0 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20  Cell            
32ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
32ed0 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73 20  y of cell sizes 
32ee0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
32ef0 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70 50 67   u8 *aData = pPg
32f00 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 70  ->aData;.  u8 *p
32f10 44 61 74 61 20 3d 20 2a 70 70 44 61 74 61 3b 0a  Data = *ppData;.
32f20 20 20 63 6f 6e 73 74 20 69 6e 74 20 62 46 72 65    const int bFre
32f30 65 6c 69 73 74 20 3d 20 61 44 61 74 61 5b 31 5d  elist = aData[1]
32f40 20 7c 7c 20 61 44 61 74 61 5b 32 5d 3b 0a 20 20   || aData[2];.  
32f50 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
32f60 44 42 20 7c 7c 20 70 50 67 2d 3e 68 64 72 4f 66  DB || pPg->hdrOf
32f70 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a  fset==0 );    /*
32f80 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e   Never called on
32f90 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 66 6f 72   page 1 */.  for
32fa0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
32fb0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20  ++){.    int sz 
32fc0 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  = szCell[i];.   
32fd0 20 75 38 20 2a 70 53 6c 6f 74 3b 0a 20 20 20 20   u8 *pSlot;.    
32fe0 69 66 28 20 62 46 72 65 65 6c 69 73 74 3d 3d 30  if( bFreelist==0
32ff0 20 7c 7c 20 28 70 53 6c 6f 74 20 3d 20 70 61 67   || (pSlot = pag
33000 65 46 69 6e 64 53 6c 6f 74 28 70 50 67 2c 20 73  eFindSlot(pPg, s
33010 7a 2c 20 30 2c 20 30 29 29 3d 3d 30 20 29 7b 0a  z, 0, 0))==0 ){.
33020 20 20 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73        pData -= s
33030 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61  z;.      if( pDa
33040 74 61 3c 70 42 65 67 69 6e 20 29 20 72 65 74 75  ta<pBegin ) retu
33050 72 6e 20 31 3b 0a 20 20 20 20 20 20 70 53 6c 6f  rn 1;.      pSlo
33060 74 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d  t = pData;.    }
33070 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 53 6c 6f  .    memcpy(pSlo
33080 74 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a  t, apCell[i], sz
33090 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
330a0 70 43 65 6c 6c 70 74 72 2c 20 28 70 53 6c 6f 74  pCellptr, (pSlot
330b0 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20   - aData));.    
330c0 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20  pCellptr += 2;. 
330d0 20 7d 0a 20 20 2a 70 70 44 61 74 61 20 3d 20 70   }.  *ppData = p
330e0 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 30  Data;.  return 0
330f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79  ;.}../*.** Array
33100 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69   apCell[] contai
33110 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72  ns nCell pointer
33120 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c  s to b-tree cell
33130 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c 20  s. Array szCell 
33140 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  .** contains the
33150 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
33160 66 20 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c  f each such cell
33170 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
33180 61 64 64 73 20 74 68 65 0a 2a 2a 20 73 70 61 63  adds the.** spac
33190 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
331a0 68 20 65 61 63 68 20 63 65 6c 6c 20 69 6e 20 74  h each cell in t
331b0 68 65 20 61 72 72 61 79 20 74 68 61 74 20 69 73  he array that is
331c0 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
331d0 64 20 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  d .** within the
331e0 20 62 6f 64 79 20 6f 66 20 70 50 67 20 74 6f 20   body of pPg to 
331f0 74 68 65 20 70 50 67 20 66 72 65 65 2d 6c 69 73  the pPg free-lis
33200 74 2e 20 54 68 65 20 63 65 6c 6c 2d 70 6f 69 6e  t. The cell-poin
33210 74 65 72 73 20 61 6e 64 20 6f 74 68 65 72 0a 2a  ters and other.*
33220 2a 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  * fields of the 
33230 70 61 67 65 20 61 72 65 20 6e 6f 74 20 75 70 64  page are not upd
33240 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ated..**.** This
33250 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
33260 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
33270 65 72 20 6f 66 20 63 65 6c 6c 73 20 61 64 64 65  er of cells adde
33280 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69  d to the free-li
33290 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
332a0 74 20 70 61 67 65 46 72 65 65 41 72 72 61 79 28  t pageFreeArray(
332b0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  .  MemPage *pPg,
332c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
332d0 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 65 64     /* Page to ed
332e0 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  it */.  int nCel
332f0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
33300 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73          /* Cells
33310 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
33320 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20  u8 **apCell,    
33330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33340 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c  /* Array of cell
33350 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65  s */.  u16 *szCe
33360 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ll              
33370 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
33380 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f  of cell sizes */
33390 0a 29 7b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  .){.  u8 * const
333a0 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
333b0 61 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73  ata;.  u8 * cons
333c0 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74 61 5b  t pEnd = &aData[
333d0 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  pPg->pBt->usable
333e0 53 69 7a 65 5d 3b 0a 20 20 75 38 20 2a 20 63 6f  Size];.  u8 * co
333f0 6e 73 74 20 70 53 74 61 72 74 20 3d 20 26 61 44  nst pStart = &aD
33400 61 74 61 5b 70 50 67 2d 3e 68 64 72 4f 66 66 73  ata[pPg->hdrOffs
33410 65 74 20 2b 20 38 20 2b 20 70 50 67 2d 3e 63 68  et + 8 + pPg->ch
33420 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 69  ildPtrSize];.  i
33430 6e 74 20 6e 52 65 74 20 3d 20 30 3b 0a 20 20 69  nt nRet = 0;.  i
33440 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70 46 72 65  nt i;.  u8 *pFre
33450 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 7a 46  e = 0;.  int szF
33460 72 65 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  ree = 0;..  for(
33470 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
33480 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
33490 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20  l = apCell[i];. 
334a0 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 53     if( pCell>=pS
334b0 74 61 72 74 20 26 26 20 70 43 65 6c 6c 3c 70 45  tart && pCell<pE
334c0 6e 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  nd ){.      int 
334d0 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a  sz = szCell[i];.
334e0 20 20 20 20 20 20 69 66 28 20 70 46 72 65 65 21        if( pFree!
334f0 3d 28 70 43 65 6c 6c 20 2b 20 73 7a 29 20 29 7b  =(pCell + sz) ){
33500 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72  .        if( pFr
33510 65 65 20 29 20 66 72 65 65 53 70 61 63 65 28 70  ee ) freeSpace(p
33520 50 67 2c 20 70 46 72 65 65 20 2d 20 61 44 61 74  Pg, pFree - aDat
33530 61 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20 20 20  a, szFree);.    
33540 20 20 20 20 70 46 72 65 65 20 3d 20 70 43 65 6c      pFree = pCel
33550 6c 3b 0a 20 20 20 20 20 20 20 20 73 7a 46 72 65  l;.        szFre
33560 65 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20  e = sz;.        
33570 69 66 28 20 70 46 72 65 65 2b 73 7a 3e 70 45 6e  if( pFree+sz>pEn
33580 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  d ) return 0;.  
33590 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
335a0 20 20 20 70 46 72 65 65 20 3d 20 70 43 65 6c 6c     pFree = pCell
335b0 3b 0a 20 20 20 20 20 20 20 20 73 7a 46 72 65 65  ;.        szFree
335c0 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a   += sz;.      }.
335d0 20 20 20 20 20 20 6e 52 65 74 2b 2b 3b 0a 20 20        nRet++;.  
335e0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 46    }.  }.  if( pF
335f0 72 65 65 20 29 20 66 72 65 65 53 70 61 63 65 28  ree ) freeSpace(
33600 70 50 67 2c 20 70 46 72 65 65 20 2d 20 61 44 61  pPg, pFree - aDa
33610 74 61 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20 72  ta, szFree);.  r
33620 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f  eturn nRet;.}../
33630 2a 0a 2a 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46  *.** The pPg->nF
33640 72 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76  ree field is inv
33650 61 6c 69 64 20 77 68 65 6e 20 74 68 69 73 20 66  alid when this f
33660 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
33670 20 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 72 65   It is the.** re
33680 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
33690 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65  the caller to se
336a0 74 20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a  t it correctly..
336b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
336c0 64 69 74 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  ditPage(.  MemPa
336d0 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20  ge *pPg,        
336e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64             /* Ed
336f0 69 74 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  it this page */.
33700 20 20 69 6e 74 20 69 4f 6c 64 2c 20 20 20 20 20    int iOld,     
33710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33720 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
33730 72 73 74 20 63 65 6c 6c 20 63 75 72 72 65 6e 74  rst cell current
33740 6c 79 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20  ly on page */.  
33750 69 6e 74 20 69 4e 65 77 2c 20 20 20 20 20 20 20  int iNew,       
33760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33770 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 77 20  /* Index of new 
33780 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 20 70 61  first cell on pa
33790 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  ge */.  int nNew
337a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
337b0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c          /* Final
337c0 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
337d0 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38   on page */.  u8
337e0 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20   **apCell,      
337f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33800 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20   Array of cells 
33810 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
33820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33830 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
33840 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29   cell sizes */.)
33850 7b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61  {.  u8 * const a
33860 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74  Data = pPg->aDat
33870 61 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  a;.  const int h
33880 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66  dr = pPg->hdrOff
33890 73 65 74 3b 0a 20 20 75 38 20 2a 70 42 65 67 69  set;.  u8 *pBegi
338a0 6e 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49  n = &pPg->aCellI
338b0 64 78 5b 6e 4e 65 77 20 2a 20 32 5d 3b 0a 20 20  dx[nNew * 2];.  
338c0 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 50 67 2d  int nCell = pPg-
338d0 3e 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 2f 2a  >nCell;       /*
338e0 20 43 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e   Cells stored on
338f0 20 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 70 44   pPg */.  u8 *pD
33900 61 74 61 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c  ata;.  u8 *pCell
33910 70 74 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ptr;.  int i;.  
33920 69 6e 74 20 69 4f 6c 64 45 6e 64 20 3d 20 69 4f  int iOldEnd = iO
33930 6c 64 20 2b 20 70 50 67 2d 3e 6e 43 65 6c 6c 20  ld + pPg->nCell 
33940 2b 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77  + pPg->nOverflow
33950 3b 0a 20 20 69 6e 74 20 69 4e 65 77 45 6e 64 20  ;.  int iNewEnd 
33960 3d 20 69 4e 65 77 20 2b 20 6e 4e 65 77 3b 0a 0a  = iNew + nNew;..
33970 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
33980 42 55 47 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d  BUG.  u8 *pTmp =
33990 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
339a0 70 53 70 61 63 65 28 70 50 67 2d 3e 70 42 74 2d  pSpace(pPg->pBt-
339b0 3e 70 50 61 67 65 72 29 3b 0a 20 20 6d 65 6d 63  >pPager);.  memc
339c0 70 79 28 70 54 6d 70 2c 20 61 44 61 74 61 2c 20  py(pTmp, aData, 
339d0 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  pPg->pBt->usable
339e0 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Size);.#endif.. 
339f0 20 2f 2a 20 52 65 6d 6f 76 65 20 63 65 6c 6c 73   /* Remove cells
33a00 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
33a10 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 70  and end of the p
33a20 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 69 4f 6c  age */.  if( iOl
33a30 64 3c 69 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e  d<iNew ){.    in
33a40 74 20 6e 53 68 69 66 74 20 3d 20 70 61 67 65 46  t nShift = pageF
33a50 72 65 65 41 72 72 61 79 28 0a 20 20 20 20 20 20  reeArray(.      
33a60 20 20 70 50 67 2c 20 69 4e 65 77 2d 69 4f 6c 64    pPg, iNew-iOld
33a70 2c 20 26 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2c  , &apCell[iOld],
33a80 20 26 73 7a 43 65 6c 6c 5b 69 4f 6c 64 5d 0a 20   &szCell[iOld]. 
33a90 20 20 20 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76     );.    memmov
33aa0 65 28 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 2c  e(pPg->aCellIdx,
33ab0 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b   &pPg->aCellIdx[
33ac0 6e 53 68 69 66 74 2a 32 5d 2c 20 6e 43 65 6c 6c  nShift*2], nCell
33ad0 2a 32 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d  *2);.    nCell -
33ae0 3d 20 6e 53 68 69 66 74 3b 0a 20 20 7d 0a 20 20  = nShift;.  }.  
33af0 69 66 28 20 69 4e 65 77 45 6e 64 20 3c 20 69 4f  if( iNewEnd < iO
33b00 6c 64 45 6e 64 20 29 7b 0a 20 20 20 20 6e 43 65  ldEnd ){.    nCe
33b10 6c 6c 20 2d 3d 20 70 61 67 65 46 72 65 65 41 72  ll -= pageFreeAr
33b20 72 61 79 28 0a 20 20 20 20 20 20 20 20 70 50 67  ray(.        pPg
33b30 2c 20 69 4f 6c 64 45 6e 64 2d 69 4e 65 77 45 6e  , iOldEnd-iNewEn
33b40 64 2c 20 26 61 70 43 65 6c 6c 5b 69 4e 65 77 45  d, &apCell[iNewE
33b50 6e 64 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e 65  nd], &szCell[iNe
33b60 77 45 6e 64 5d 0a 20 20 20 20 29 3b 0a 20 20 7d  wEnd].    );.  }
33b70 0a 0a 20 20 70 44 61 74 61 20 3d 20 26 61 44 61  ..  pData = &aDa
33b80 74 61 5b 67 65 74 32 62 79 74 65 28 26 61 44 61  ta[get2byte(&aDa
33b90 74 61 5b 68 64 72 2b 35 5d 29 5d 3b 0a 20 20 69  ta[hdr+5])];.  i
33ba0 66 28 20 70 44 61 74 61 3c 70 42 65 67 69 6e 20  f( pData<pBegin 
33bb0 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f  ) goto editpage_
33bc0 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  fail;..  /* Add 
33bd0 63 65 6c 6c 73 20 74 6f 20 74 68 65 20 73 74 61  cells to the sta
33be0 72 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  rt of the page *
33bf0 2f 0a 20 20 69 66 28 20 69 4e 65 77 3c 69 4f 6c  /.  if( iNew<iOl
33c00 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 64  d ){.    int nAd
33c10 64 20 3d 20 69 4f 6c 64 2d 69 4e 65 77 3b 0a 20  d = iOld-iNew;. 
33c20 20 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 70 50     pCellptr = pP
33c30 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 20  g->aCellIdx;.   
33c40 20 6d 65 6d 6d 6f 76 65 28 26 70 43 65 6c 6c 70   memmove(&pCellp
33c50 74 72 5b 6e 41 64 64 2a 32 5d 2c 20 70 43 65 6c  tr[nAdd*2], pCel
33c60 6c 70 74 72 2c 20 6e 43 65 6c 6c 2a 32 29 3b 0a  lptr, nCell*2);.
33c70 20 20 20 20 69 66 28 20 70 61 67 65 49 6e 73 65      if( pageInse
33c80 72 74 41 72 72 61 79 28 0a 20 20 20 20 20 20 20  rtArray(.       
33c90 20 20 20 70 50 67 2c 20 70 42 65 67 69 6e 2c 20     pPg, pBegin, 
33ca0 26 70 44 61 74 61 2c 20 70 43 65 6c 6c 70 74 72  &pData, pCellptr
33cb0 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 41 64 64  ,.          nAdd
33cc0 2c 20 26 61 70 43 65 6c 6c 5b 69 4e 65 77 5d 2c  , &apCell[iNew],
33cd0 20 26 73 7a 43 65 6c 6c 5b 69 4e 65 77 5d 0a 20   &szCell[iNew]. 
33ce0 20 20 20 29 20 29 20 67 6f 74 6f 20 65 64 69 74     ) ) goto edit
33cf0 70 61 67 65 5f 66 61 69 6c 3b 0a 20 20 20 20 6e  page_fail;.    n
33d00 43 65 6c 6c 20 2b 3d 20 6e 41 64 64 3b 0a 20 20  Cell += nAdd;.  
33d10 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6e 79 20  }..  /* Add any 
33d20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2a  overflow cells *
33d30 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
33d40 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 69  Pg->nOverflow; i
33d50 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 65  ++){.    int iCe
33d60 6c 6c 20 3d 20 28 69 4f 6c 64 20 2b 20 70 50 67  ll = (iOld + pPg
33d70 2d 3e 61 69 4f 76 66 6c 5b 69 5d 29 20 2d 20 69  ->aiOvfl[i]) - i
33d80 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 43 65  New;.    if( iCe
33d90 6c 6c 3e 3d 30 20 26 26 20 69 43 65 6c 6c 3c 6e  ll>=0 && iCell<n
33da0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 75 38 20  New ){.      u8 
33db0 2a 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 67  *pCellptr = &pPg
33dc0 2d 3e 61 43 65 6c 6c 49 64 78 5b 69 43 65 6c 6c  ->aCellIdx[iCell
33dd0 20 2a 20 32 5d 3b 0a 20 20 20 20 20 20 6d 65 6d   * 2];.      mem
33de0 6d 6f 76 65 28 26 70 43 65 6c 6c 70 74 72 5b 32  move(&pCellptr[2
33df0 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20 28 6e 43  ], pCellptr, (nC
33e00 65 6c 6c 20 2d 20 69 43 65 6c 6c 29 20 2a 20 32  ell - iCell) * 2
33e10 29 3b 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  );.      nCell++
33e20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 61 67 65  ;.      if( page
33e30 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20 20  InsertArray(.   
33e40 20 20 20 20 20 20 20 20 20 70 50 67 2c 20 70 42           pPg, pB
33e50 65 67 69 6e 2c 20 26 70 44 61 74 61 2c 20 70 43  egin, &pData, pC
33e60 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20 20 20  ellptr,.        
33e70 20 20 20 20 31 2c 20 26 61 70 43 65 6c 6c 5b 69      1, &apCell[i
33e80 43 65 6c 6c 20 2b 20 69 4e 65 77 5d 2c 20 26 73  Cell + iNew], &s
33e90 7a 43 65 6c 6c 5b 69 43 65 6c 6c 20 2b 20 69 4e  zCell[iCell + iN
33ea0 65 77 5d 0a 20 20 20 20 20 20 29 20 29 20 67 6f  ew].      ) ) go
33eb0 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c  to editpage_fail
33ec0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
33ed0 2a 20 41 70 70 65 6e 64 20 63 65 6c 6c 73 20 74  * Append cells t
33ee0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
33ef0 20 70 61 67 65 20 2a 2f 0a 20 20 70 43 65 6c 6c   page */.  pCell
33f00 70 74 72 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c  ptr = &pPg->aCel
33f10 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  lIdx[nCell*2];. 
33f20 20 69 66 28 20 70 61 67 65 49 6e 73 65 72 74 41   if( pageInsertA
33f30 72 72 61 79 28 0a 20 20 20 20 20 20 20 20 70 50  rray(.        pP
33f40 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74  g, pBegin, &pDat
33f50 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20  a, pCellptr,.   
33f60 20 20 20 20 20 6e 4e 65 77 2d 6e 43 65 6c 6c 2c       nNew-nCell,
33f70 20 26 61 70 43 65 6c 6c 5b 69 4e 65 77 2b 6e 43   &apCell[iNew+nC
33f80 65 6c 6c 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e  ell], &szCell[iN
33f90 65 77 2b 6e 43 65 6c 6c 5d 0a 20 20 29 20 29 20  ew+nCell].  ) ) 
33fa0 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61  goto editpage_fa
33fb0 69 6c 3b 0a 0a 20 20 70 50 67 2d 3e 6e 43 65 6c  il;..  pPg->nCel
33fc0 6c 20 3d 20 6e 4e 65 77 3b 0a 20 20 70 50 67 2d  l = nNew;.  pPg-
33fd0 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
33fe0 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61  .  put2byte(&aDa
33ff0 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e  ta[hdr+3], pPg->
34000 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79  nCell);.  put2by
34010 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d  te(&aData[hdr+5]
34020 2c 20 70 44 61 74 61 20 2d 20 61 44 61 74 61 29  , pData - aData)
34030 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
34040 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30  _DEBUG.  for(i=0
34050 3b 20 69 3c 6e 4e 65 77 20 26 26 20 21 43 4f 52  ; i<nNew && !COR
34060 52 55 50 54 5f 44 42 3b 20 69 2b 2b 29 7b 0a 20  RUPT_DB; i++){. 
34070 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61     u8 *pCell = a
34080 70 43 65 6c 6c 5b 69 2b 69 4e 65 77 5d 3b 0a 20  pCell[i+iNew];. 
34090 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 67 65     int iOff = ge
340a0 74 32 62 79 74 65 28 26 70 50 67 2d 3e 61 43 65  t2byte(&pPg->aCe
340b0 6c 6c 49 64 78 5b 69 2a 32 5d 29 3b 0a 20 20 20  llIdx[i*2]);.   
340c0 20 69 66 28 20 70 43 65 6c 6c 3e 3d 61 44 61 74   if( pCell>=aDat
340d0 61 20 26 26 20 70 43 65 6c 6c 3c 26 61 44 61 74  a && pCell<&aDat
340e0 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  a[pPg->pBt->usab
340f0 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20  leSize] ){.     
34100 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70   pCell = &pTmp[p
34110 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20  Cell - aData];. 
34120 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
34130 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 43 65 6c 6c   0==memcmp(pCell
34140 2c 20 26 61 44 61 74 61 5b 69 4f 66 66 5d 2c 20  , &aData[iOff], 
34150 73 7a 43 65 6c 6c 5b 69 2b 69 4e 65 77 5d 29 20  szCell[i+iNew]) 
34160 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
34170 20 72 65 74 75 72 6e 3b 0a 20 65 64 69 74 70 61   return;. editpa
34180 67 65 5f 66 61 69 6c 3a 0a 20 20 2f 2a 20 55 6e  ge_fail:.  /* Un
34190 61 62 6c 65 20 74 6f 20 65 64 69 74 20 74 68 69  able to edit thi
341a0 73 20 70 61 67 65 2e 20 52 65 62 75 69 6c 64 20  s page. Rebuild 
341b0 69 74 20 66 72 6f 6d 20 73 63 72 61 74 63 68 20  it from scratch 
341c0 69 6e 73 74 65 61 64 2e 20 2a 2f 0a 20 20 72 65  instead. */.  re
341d0 62 75 69 6c 64 50 61 67 65 28 70 50 67 2c 20 6e  buildPage(pPg, n
341e0 4e 65 77 2c 20 26 61 70 43 65 6c 6c 5b 69 4e 65  New, &apCell[iNe
341f0 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e 65 77  w], &szCell[iNew
34200 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ]);.}../*.** The
34210 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d   following param
34220 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20  eters determine 
34230 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e  how many adjacen
34240 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f  t pages get invo
34250 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c  lved.** in a bal
34260 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
34270 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d  .  NN is the num
34280 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
34290 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a   on either side.
342a0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  ** of the page t
342b0 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20  hat participate 
342c0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
342d0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20   operation.  NB 
342e0 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20  is the.** total 
342f0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
34300 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
34310 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
34320 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a  target page and.
34330 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20  ** NN neighbors 
34340 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a  on either side..
34350 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75  **.** The minimu
34360 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73  m value of NN is
34370 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20   1 (of course). 
34380 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61   Increasing NN a
34390 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20  bove 1.** (to 2 
343a0 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f  or 3) gives a mo
343b0 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74  dest improvement
343c0 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44   in SELECT and D
343d0 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  ELETE performanc
343e0 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65  e.** in exchange
343f0 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65   for a larger de
34400 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53  gradation in INS
34410 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70  ERT and UPDATE p
34420 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54  erformance..** T
34430 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61  he value of NN a
34440 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74  ppears to give t
34450 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20  he best results 
34460 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66  overall..*/.#def
34470 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20  ine NN 1        
34480 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
34490 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
344a0 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
344b0 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  age */.#define N
344c0 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20  B (NN*2+1)      
344d0 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69  /* Total pages i
344e0 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62  nvolved in the b
344f0 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e  alance */...#ifn
34500 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
34510 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a  QUICKBALANCE./*.
34520 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20  ** This version 
34530 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e  of balance() han
34540 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  dles the common 
34550 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
34560 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72  re.** a new entr
34570 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72  y is being inser
34580 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65  ted on the extre
34590 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20  me right-end of 
345a0 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20  the.** tree, in 
345b0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65  other words, whe
345c0 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  n the new entry 
345d0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
345e0 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79  largest.** entry
345f0 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
34600 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74  .** Instead of t
34610 72 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65  rying to balance
34620 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73   the 3 right-mos
34630 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75  t leaf pages, ju
34640 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20  st add.** a new 
34650 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68  page to the righ
34660 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20  t-hand side and 
34670 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20  put the one new 
34680 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74  entry in.** that
34690 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61   page.  This lea
346a0 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69  ves the right si
346b0 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73  de of the tree s
346c0 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c  omewhat.** unbal
346d0 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73  anced.  But odds
346e0 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c   are that we wil
346f0 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e  l be inserting n
34700 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74  ew entries.** at
34710 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66   the end soon af
34720 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20  terwards so the 
34730 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67  nearly empty pag
34740 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a  e will quickly.*
34750 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61  * fill up.  On a
34760 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50  verage..**.** pP
34770 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20  age is the leaf 
34780 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68  page which is th
34790 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67  e right-most pag
347a0 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  e in the tree..*
347b0 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73  * pParent is its
347c0 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20   parent.  pPage 
347d0 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67  must have a sing
347e0 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72  le overflow entr
347f0 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c  y.** which is al
34800 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  so the right-mos
34810 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70  t entry on the p
34820 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  age..**.** The p
34830 53 70 61 63 65 20 62 75 66 66 65 72 20 69 73 20  Space buffer is 
34840 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20  used to store a 
34850 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f  temporary copy o
34860 66 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a  f the divider.**
34870 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20   cell that will 
34880 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
34890 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61   pParent. Such a
348a0 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
348b0 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61  f a 4.** byte pa
348c0 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77  ge number follow
348d0 65 64 20 62 79 20 61 20 76 61 72 69 61 62 6c 65  ed by a variable
348e0 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e   length integer.
348f0 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
34900 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62  ds, at most 13 b
34910 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20  ytes. Hence the 
34920 70 53 70 61 63 65 20 62 75 66 66 65 72 20 6d 75  pSpace buffer mu
34930 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73  st be at.** leas
34940 74 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69  t 13 bytes in si
34950 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
34960 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  t balance_quick(
34970 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
34980 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  , MemPage *pPage
34990 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20  , u8 *pSpace){. 
349a0 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74   BtShared *const
349b0 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
349c0 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20  t;    /* B-Tree 
349d0 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65  Database */.  Me
349e0 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20  mPage *pNew;    
349f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a00 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f     /* Newly allo
34a10 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  cated page */.  
34a20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
34a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a40 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
34a50 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ode */.  Pgno pg
34a60 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  noNew;          
34a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34a80 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
34a90 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72  pNew */..  asser
34aa0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
34ab0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
34ac0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
34ad0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
34ae0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
34af0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
34b00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
34b10 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  ge->nOverflow==1
34b20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 65   );..  /* This e
34b30 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 69  rror condition i
34b40 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69  s now caught pri
34b50 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74  or to reaching t
34b60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
34b70 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
34b80 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll==0 ) return S
34b90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
34ba0 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  PT;..  /* Alloca
34bb0 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54  te a new page. T
34bc0 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65  his page will be
34bd0 63 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73  come the right-s
34be0 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20  ibling of .  ** 
34bf0 70 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20  pPage. Make the 
34c00 70 61 72 65 6e 74 20 70 61 67 65 20 77 72 69 74  parent page writ
34c10 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68  able, so that th
34c20 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  e new divider ce
34c30 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69  ll.  ** may be i
34c40 6e 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68  nserted. If both
34c50 20 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e   these operation
34c60 73 20 61 72 65 20 73 75 63 63 65 73 73 66 75 6c  s are successful
34c70 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a  , proceed..  */.
34c80 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
34c90 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
34ca0 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30  New, &pgnoNew, 0
34cb0 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  , 0);..  if( rc=
34cc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20  =SQLITE_OK ){.. 
34cd0 20 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70     u8 *pOut = &p
34ce0 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38  Space[4];.    u8
34cf0 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d   *pCell = pPage-
34d00 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20  >apOvfl[0];.    
34d10 75 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c  u16 szCell = cel
34d20 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
34d30 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a  pCell);.    u8 *
34d40 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65  pStop;..    asse
34d50 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
34d60 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77  Iswriteable(pNew
34d70 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
34d80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
34d90 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f  >aData[0]==(PTF_
34da0 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44  INTKEY|PTF_LEAFD
34db0 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b  ATA|PTF_LEAF) );
34dc0 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
34dd0 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ew, PTF_INTKEY|P
34de0 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
34df0 4c 45 41 46 29 3b 0a 20 20 20 20 72 65 62 75 69  LEAF);.    rebui
34e00 6c 64 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20  ldPage(pNew, 1, 
34e10 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29  &pCell, &szCell)
34e20 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 46 72 65  ;.    pNew->nFre
34e30 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
34e40 69 7a 65 20 2d 20 70 4e 65 77 2d 3e 63 65 6c 6c  ize - pNew->cell
34e50 4f 66 66 73 65 74 20 2d 20 32 20 2d 20 73 7a 43  Offset - 2 - szC
34e60 65 6c 6c 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ell;..    /* If 
34e70 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
34e80 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
34e90 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
34ea0 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77  ter map.    ** w
34eb0 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ith entries for 
34ec0 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e  the new page, an
34ed0 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72  d any pointer fr
34ee0 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  om the .    ** c
34ef0 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ell on the page 
34f00 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
34f10 61 67 65 2e 20 49 66 20 65 69 74 68 65 72 20 6f  age. If either o
34f20 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f  f these.    ** o
34f30 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c  perations fails,
34f40 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
34f50 20 69 73 20 73 65 74 2c 20 62 75 74 20 74 68 65   is set, but the
34f60 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a   contents.    **
34f70 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   of the parent p
34f80 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20 6d 61  age are still ma
34f90 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74 68 68  nipulated by thh
34fa0 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20   code below..   
34fb0 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c 20   ** That is Ok, 
34fc0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  at this point th
34fd0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73  e parent page is
34fe0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20   guaranteed to. 
34ff0 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20     ** be marked 
35000 61 73 20 64 69 72 74 79 2e 20 52 65 74 75 72 6e  as dirty. Return
35010 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
35020 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61 0a 20  e will cause a. 
35030 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20     ** rollback, 
35040 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e  undoing any chan
35050 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20  ges made to the 
35060 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
35070 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
35080 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
35090 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
350a0 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50   pgnoNew, PTRMAP
350b0 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d  _BTREE, pParent-
350c0 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
350d0 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e     if( szCell>pN
350e0 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a  ew->minLocal ){.
350f0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
35100 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 70  tOvflPtr(pNew, p
35110 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20  Cell, &rc);.    
35120 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
35130 20 2f 2a 20 43 72 65 61 74 65 20 61 20 64 69 76   /* Create a div
35140 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73  ider cell to ins
35150 65 72 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ert into pParent
35160 2e 20 54 68 65 20 64 69 76 69 64 65 72 20 63 65  . The divider ce
35170 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  ll.    ** consis
35180 74 73 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70  ts of a 4-byte p
35190 61 67 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20  age number (the 
351a0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70  page number of p
351b0 50 61 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a  Page) and.    **
351c0 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
351d0 74 68 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68  th key value (wh
351e0 69 63 68 20 6d 75 73 74 20 62 65 20 74 68 65 20  ich must be the 
351f0 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68  same value as th
35200 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74  e.    ** largest
35210 20 6b 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a   key on pPage)..
35220 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f      **.    ** To
35230 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73   find the larges
35240 74 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70  t key value on p
35250 50 61 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64  Page, first find
35260 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
35270 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
35280 70 50 61 67 65 2e 20 54 68 65 20 66 69 72 73 74  pPage. The first
35290 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74   two fields of t
352a0 68 69 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65  his cell are the
352b0 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d   .    ** record-
352c0 6c 65 6e 67 74 68 20 28 61 20 76 61 72 69 61 62  length (a variab
352d0 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
352e0 72 20 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74  r at most 32-bit
352f0 73 20 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a  s in size).    *
35300 2a 20 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61  * and the key va
35310 6c 75 65 20 28 61 20 76 61 72 69 61 62 6c 65 20  lue (a variable 
35320 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20  length integer, 
35330 6d 61 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c  may have any val
35340 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ue)..    ** The 
35350 66 69 72 73 74 20 6f 66 20 74 68 65 20 77 68 69  first of the whi
35360 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65  le(...) loops be
35370 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74  low skips over t
35380 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68  he record-length
35390 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54  .    ** field. T
353a0 68 65 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28  he second while(
353b0 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73  ...) loop copies
353c0 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66   the key value f
353d0 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  rom the.    ** c
353e0 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74  ell on pPage int
353f0 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  o the pSpace buf
35400 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  fer..    */.    
35410 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
35420 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e  (pPage, pPage->n
35430 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74  Cell-1);.    pSt
35440 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a  op = &pCell[9];.
35450 20 20 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43      while( (*(pC
35460 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20  ell++)&0x80) && 
35470 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20  pCell<pStop );. 
35480 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c     pStop = &pCel
35490 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[9];.    while(
354a0 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a   ((*(pOut++) = *
354b0 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29  (pCell++))&0x80)
354c0 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20   && pCell<pStop 
354d0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  );..    /* Inser
354e0 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  t the new divide
354f0 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72  r cell into pPar
35500 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65  ent. */.    inse
35510 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
35520 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20  pParent->nCell, 
35530 70 53 70 61 63 65 2c 20 28 69 6e 74 29 28 70 4f  pSpace, (int)(pO
35540 75 74 2d 70 53 70 61 63 65 29 2c 0a 20 20 20 20  ut-pSpace),.    
35550 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 50             0, pP
35560 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  age->pgno, &rc);
35570 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
35580 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69   right-child poi
35590 6e 74 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20  nter of pParent 
355a0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
355b0 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  new page. */.   
355c0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65   put4byte(&pPare
355d0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
355e0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
355f0 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20   pgnoNew);.  .  
35600 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
35610 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
35620 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20  e new page. */. 
35630 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
35640 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  New);.  }..  ret
35650 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
35660 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
35670 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a  QUICKBALANCE */.
35680 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69  .#if 0./*.** Thi
35690 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
356a0 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 61  not contribute a
356b0 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 6f  nything to the o
356c0 70 65 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69  peration of SQLi
356d0 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d  te..** it is som
356e0 65 74 69 6d 65 73 20 61 63 74 69 76 61 74 65 64  etimes activated
356f0 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 77 68 69   temporarily whi
35700 6c 65 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64  le debugging cod
35710 65 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a  e responsible .*
35720 2a 20 66 6f 72 20 73 65 74 74 69 6e 67 20 70 6f  * for setting po
35730 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
35740 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
35750 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65   ptrmapCheckPage
35760 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50 61  s(MemPage **apPa
35770 67 65 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a  ge, int nPage){.
35780 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f    int i, j;.  fo
35790 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20  r(i=0; i<nPage; 
357a0 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  i++){.    Pgno n
357b0 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20 20 20 20  ;.    u8 e;.    
357c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
357d0 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20   apPage[i];.    
357e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
357f0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20  pPage->pBt;.    
35800 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
35810 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f  sInit );..    fo
35820 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e  r(j=0; j<pPage->
35830 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nCell; j++){.   
35840 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
35850 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20  ;.      u8 *z;. 
35860 20 20 20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66      .      z = f
35870 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a  indCell(pPage, j
35880 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61  );.      btreePa
35890 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
358a0 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  , z, &info);.   
358b0 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
358c0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
358d0 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
358e0 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f  4byte(&z[info.iO
358f0 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
35900 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
35910 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b  , ovfl, &e, &n);
35920 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
35930 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
35940 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  && e==PTRMAP_OVE
35950 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20 20  RFLOW1 );.      
35960 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  }.      if( !pPa
35970 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
35980 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d      Pgno child =
35990 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a 20 20   get4byte(z);.  
359a0 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
359b0 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20  pBt, child, &e, 
359c0 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  &n);.        ass
359d0 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70  ert( n==pPage->p
359e0 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50  gno && e==PTRMAP
359f0 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20  _BTREE );.      
35a00 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
35a10 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
35a20 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
35a30 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
35a40 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
35a50 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
35a60 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
35a70 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20  pBt, child, &e, 
35a80 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  &n);.      asser
35a90 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
35aa0 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42  o && e==PTRMAP_B
35ab0 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20  TREE );.    }.  
35ac0 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
35ad0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
35ae0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
35af0 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20  sed to copy the 
35b00 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
35b10 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72  b-tree node stor
35b20 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70  ed .** on page p
35b30 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f  From to page pTo
35b40 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20  . If page pFrom 
35b50 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70  was not a leaf p
35b60 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  age, then.** the
35b70 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
35b80 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 63 68  ries for each ch
35b90 69 6c 64 20 70 61 67 65 20 61 72 65 20 75 70 64  ild page are upd
35ba0 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ated so that the
35bb0 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20  .** parent page 
35bc0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f  stored in the po
35bd0 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61 67  inter map is pag
35be0 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20  e pTo. If pFrom 
35bf0 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79  contained.** any
35c00 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72   cells with over
35c10 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
35c20 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72  rs, then the cor
35c30 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74  responding point
35c40 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
35c50 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74  s are also updat
35c60 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  ed so that the p
35c70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 70 61  arent page is pa
35c80 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  ge pTo..**.** If
35c90 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e   pFrom is curren
35ca0 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79  tly carrying any
35cb0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
35cc0 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a  (entries in the.
35cd0 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 70 4f 76 66  ** MemPage.apOvf
35ce0 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79  l[] array), they
35cf0 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20   are not copied 
35d00 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42  to pTo. .**.** B
35d10 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
35d20 20 70 61 67 65 20 70 54 6f 20 69 73 20 72 65 69   page pTo is rei
35d30 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67  nitialized using
35d40 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
35d50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66  ..**.** The perf
35d60 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68 69 73 20  ormance of this 
35d70 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20  function is not 
35d80 63 72 69 74 69 63 61 6c 2e 20 49 74 20 69 73 20  critical. It is 
35d90 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 0a 2a 2a  only used by .**
35da0 20 74 68 65 20 62 61 6c 61 6e 63 65 5f 73 68 61   the balance_sha
35db0 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20 62 61 6c  llower() and bal
35dc0 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 70 72  ance_deeper() pr
35dd0 6f 63 65 64 75 72 65 73 2c 20 6e 65 69 74 68 65  ocedures, neithe
35de0 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61 72  r of.** which ar
35df0 65 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75  e called often u
35e00 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63  nder normal circ
35e10 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74  umstances..*/.st
35e20 61 74 69 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f  atic void copyNo
35e30 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67  deContent(MemPag
35e40 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67  e *pFrom, MemPag
35e50 65 20 2a 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43  e *pTo, int *pRC
35e60 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d  ){.  if( (*pRC)=
35e70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35e80 20 20 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e    BtShared * con
35e90 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e  st pBt = pFrom->
35ea0 70 42 74 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f  pBt;.    u8 * co
35eb0 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f  nst aFrom = pFro
35ec0 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 75 38  m->aData;.    u8
35ed0 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70   * const aTo = p
35ee0 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69  To->aData;.    i
35ef0 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64  nt const iFromHd
35f00 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66  r = pFrom->hdrOf
35f10 66 73 65 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f  fset;.    int co
35f20 6e 73 74 20 69 54 6f 48 64 72 20 3d 20 28 28 70  nst iToHdr = ((p
35f30 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31  To->pgno==1) ? 1
35f40 30 30 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74  00 : 0);.    int
35f50 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 69 44 61   rc;.    int iDa
35f60 74 61 3b 0a 20 20 0a 20 20 0a 20 20 20 20 61 73  ta;.  .  .    as
35f70 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49  sert( pFrom->isI
35f80 6e 69 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nit );.    asser
35f90 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e  t( pFrom->nFree>
35fa0 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20 20 20 61  =iToHdr );.    a
35fb0 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28  ssert( get2byte(
35fc0 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b  &aFrom[iFromHdr+
35fd0 35 5d 29 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  5]) <= (int)pBt-
35fe0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
35ff0 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68   .    /* Copy th
36000 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f  e b-tree node co
36010 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20  ntent from page 
36020 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54  pFrom to page pT
36030 6f 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20  o. */.    iData 
36040 3d 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f  = get2byte(&aFro
36050 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a  m[iFromHdr+5]);.
36060 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b      memcpy(&aTo[
36070 69 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69  iData], &aFrom[i
36080 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62  Data], pBt->usab
36090 6c 65 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20  leSize-iData);. 
360a0 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69     memcpy(&aTo[i
360b0 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69  ToHdr], &aFrom[i
360c0 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d  FromHdr], pFrom-
360d0 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
360e0 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pFrom->nCell);. 
360f0 20 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69   .    /* Reiniti
36100 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73  alize page pTo s
36110 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  o that the conte
36120 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  nts of the MemPa
36130 67 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  ge structure.   
36140 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65   ** match the ne
36150 77 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74  w data. The init
36160 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54  ialization of pT
36170 6f 20 63 61 6e 20 61 63 74 75 61 6c 6c 79 20 66  o can actually f
36180 61 69 6c 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a  ail under.    **
36190 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20   fairly obscure 
361a0 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 65  circumstances, e
361b0 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
361c0 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 69 74 69   a copy of initi
361d0 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70  alized .    ** p
361e0 61 67 65 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a  age pFrom..    *
361f0 2f 0a 20 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69  /.    pTo->isIni
36200 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  t = 0;.    rc = 
36210 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 54  btreeInitPage(pT
36220 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  o);.    if( rc!=
36230 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36240 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
36250 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
36260 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
36270 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
36280 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
36290 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
362a0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20  er-map entries. 
362b0 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d     ** for any b-
362c0 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77  tree or overflow
362d0 20 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20   pages that pTo 
362e0 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  now contains the
362f0 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20   pointers to..  
36300 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41    */.    if( ISA
36310 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
36320 20 20 20 2a 70 52 43 20 3d 20 73 65 74 43 68 69     *pRC = setChi
36330 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a  ldPtrmaps(pTo);.
36340 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
36350 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
36360 72 65 64 69 73 74 72 69 62 75 74 65 73 20 63 65  redistributes ce
36370 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50 61 72 65  lls on the iPare
36380 6e 74 49 64 78 27 74 68 20 63 68 69 6c 64 20 6f  ntIdx'th child o
36390 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65  f pParent.** (he
363a0 72 65 61 66 74 65 72 20 22 74 68 65 20 70 61 67  reafter "the pag
363b0 65 22 29 20 61 6e 64 20 75 70 20 74 6f 20 32 20  e") and up to 2 
363c0 73 69 62 6c 69 6e 67 73 20 73 6f 20 74 68 61 74  siblings so that
363d0 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20   all pages have 
363e0 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d  about the.** sam
363f0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65  e amount of free
36400 20 73 70 61 63 65 2e 20 55 73 75 61 6c 6c 79 20   space. Usually 
36410 61 20 73 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67  a single sibling
36420 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
36430 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 61  of the.** page a
36440 72 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 62  re used in the b
36450 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68  alancing, though
36460 20 62 6f 74 68 20 73 69 62 6c 69 6e 67 73 20 6d   both siblings m
36470 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f  ight come from o
36480 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66 20 74 68  ne.** side if th
36490 65 20 70 61 67 65 20 69 73 20 74 68 65 20 66 69  e page is the fi
364a0 72 73 74 20 6f 72 20 6c 61 73 74 20 63 68 69 6c  rst or last chil
364b0 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e  d of its parent.
364c0 20 49 66 20 74 68 65 20 70 61 67 65 20 0a 2a 2a   If the page .**
364d0 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20   has fewer than 
364e0 32 20 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65  2 siblings (some
364f0 74 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20  thing which can 
36500 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74  only happen if t
36510 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 20  he page.** is a 
36520 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 63  root page or a c
36530 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20 70  hild of a root p
36540 61 67 65 29 20 74 68 65 6e 20 61 6c 6c 20 61 76  age) then all av
36550 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73  ailable siblings
36560 0a 2a 2a 20 70 61 72 74 69 63 69 70 61 74 65 20  .** participate 
36570 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
36580 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ..**.** The numb
36590 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f  er of siblings o
365a0 66 20 74 68 65 20 70 61 67 65 20 6d 69 67 68 74  f the page might
365b0 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72   be increased or
365c0 20 64 65 63 72 65 61 73 65 64 20 62 79 20 0a 2a   decreased by .*
365d0 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20  * one or two in 
365e0 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65  an effort to kee
365f0 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66  p pages nearly f
36600 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72  ull but not over
36610 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f   full. .**.** No
36620 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69  te that when thi
36630 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
36640 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65  led, some of the
36650 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
36660 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20  ge.** might not 
36670 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72  actually be stor
36680 65 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44  ed in MemPage.aD
36690 61 74 61 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20  ata[]. This can 
366a0 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65  happen.** if the
366b0 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c   page is overful
366c0 6c 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  l. This routine 
366d0 65 6e 73 75 72 65 73 20 74 68 61 74 20 61 6c 6c  ensures that all
366e0 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64   cells allocated
366f0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
36700 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
36710 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67   fit into MemPag
36720 65 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f 72 65  e.aData[] before
36730 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
36740 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20  * In the course 
36750 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65  of balancing the
36760 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69   page and its si
36770 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61  blings, cells ma
36780 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64  y be.** inserted
36790 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64   into or removed
367a0 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
367b0 20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 2e   page (pParent).
367c0 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79   Doing so.** may
367d0 20 63 61 75 73 65 20 74 68 65 20 70 61 72 65 6e   cause the paren
367e0 74 20 70 61 67 65 20 74 6f 20 62 65 63 6f 6d 65  t page to become
367f0 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64   overfull or und
36800 65 72 66 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a  erfull. If this.
36810 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69  ** happens, it i
36820 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
36830 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
36840 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  er to invoke the
36850 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61   correct.** bala
36860 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f  ncing routine to
36870 20 66 69 78 20 74 68 69 73 20 70 72 6f 62 6c 65   fix this proble
36880 6d 20 28 73 65 65 20 74 68 65 20 62 61 6c 61 6e  m (see the balan
36890 63 65 28 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a  ce() routine). .
368a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  **.** If this ro
368b0 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20  utine fails for 
368c0 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d  any reason, it m
368d0 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64  ight leave the d
368e0 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20  atabase.** in a 
368f0 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e  corrupted state.
36900 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
36910 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64  ine fails, the d
36920 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a  atabase should.*
36930 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  * be rolled back
36940 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72  ..**.** The thir
36950 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
36960 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76  is function, aOv
36970 66 6c 53 70 61 63 65 2c 20 69 73 20 61 20 70 6f  flSpace, is a po
36980 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75  inter to a.** bu
36990 66 66 65 72 20 62 69 67 20 65 6e 6f 75 67 68 20  ffer big enough 
369a0 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65  to hold one page
369b0 2e 20 49 66 20 77 68 69 6c 65 20 69 6e 73 65 72  . If while inser
369c0 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ting cells into 
369d0 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61  the parent.** pa
369e0 67 65 20 28 70 50 61 72 65 6e 74 29 20 74 68 65  ge (pParent) the
369f0 20 70 61 72 65 6e 74 20 70 61 67 65 20 62 65 63   parent page bec
36a00 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74  omes overfull, t
36a10 68 69 73 20 62 75 66 66 65 72 20 69 73 0a 2a 2a  his buffer is.**
36a20 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
36a30 68 65 20 70 61 72 65 6e 74 27 73 20 6f 76 65 72  he parent's over
36a40 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63 61  flow cells. Beca
36a50 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  use this functio
36a60 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d  n inserts.** a m
36a70 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64  aximum of four d
36a80 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
36a90 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
36aa0 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  e, and the maxim
36ab0 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20  um.** size of a 
36ac0 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69 74 68  cell stored with
36ad0 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e  in an internal n
36ae0 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 6c 65  ode is always le
36af0 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f  ss than 1/4.** o
36b00 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c  f the page-size,
36b10 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b   the aOvflSpace[
36b20 5d 20 62 75 66 66 65 72 20 69 73 20 67 75 61 72  ] buffer is guar
36b30 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72  anteed to be lar
36b40 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72  ge.** enough for
36b50 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65   all overflow ce
36b60 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f  lls..**.** If aO
36b70 76 66 6c 53 70 61 63 65 20 69 73 20 73 65 74 20  vflSpace is set 
36b80 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  to a null pointe
36b90 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
36ba0 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
36bb0 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 23 69  ITE_NOMEM..*/.#i
36bc0 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56  f defined(_MSC_V
36bd0 45 52 29 20 26 26 20 5f 4d 53 43 5f 56 45 52 20  ER) && _MSC_VER 
36be0 3e 3d 20 31 37 30 30 20 26 26 20 64 65 66 69 6e  >= 1700 && defin
36bf0 65 64 28 5f 4d 5f 41 52 4d 29 0a 23 70 72 61 67  ed(_M_ARM).#prag
36c00 6d 61 20 6f 70 74 69 6d 69 7a 65 28 22 22 2c 20  ma optimize("", 
36c10 6f 66 66 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  off).#endif.stat
36c20 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e  ic int balance_n
36c30 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67  onroot(.  MemPag
36c40 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20  e *pParent,     
36c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
36c60 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69 62 6c  ent page of sibl
36c70 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c 61 6e  ings being balan
36c80 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ced */.  int iPa
36c90 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20 20 20  rentIdx,        
36ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
36cb0 78 20 6f 66 20 22 74 68 65 20 70 61 67 65 22 20  x of "the page" 
36cc0 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
36cd0 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20  u8 *aOvflSpace, 
36ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36cf0 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74  /* page-size byt
36d00 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
36d10 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20  parent ovfl */. 
36d20 20 69 6e 74 20 69 73 52 6f 6f 74 2c 20 20 20 20   int isRoot,    
36d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d40 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72   /* True if pPar
36d50 65 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d 70 61  ent is a root-pa
36d60 67 65 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 6c  ge */.  int bBul
36d70 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k               
36d80 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
36d90 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  if this call is 
36da0 70 61 72 74 20 6f 66 20 61 20 62 75 6c 6b 20 6c  part of a bulk l
36db0 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  oad */.){.  BtSh
36dc0 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
36dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
36de0 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a  whole database *
36df0 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20  /.  int nCell = 
36e00 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
36e10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
36e20 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
36e30 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c  */.  int nMaxCel
36e40 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ls = 0;         
36e50 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
36e60 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73  ize of apCell, s
36e70 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f  zCell, aFrom. */
36e80 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b  .  int nNew = 0;
36e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ea0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
36eb0 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  es in apNew[] */
36ec0 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20  .  int nOld;    
36ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ee0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
36ef0 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f  es in apOld[] */
36f00 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20  .  int i, j, k; 
36f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
36f30 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b   */.  int nxDiv;
36f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f50 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64     /* Next divid
36f60 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65  er slot in pPare
36f70 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
36f80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
36f90 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
36fa0 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
36fb0 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66 43 6f   */.  u16 leafCo
36fc0 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  rrection;       
36fd0 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65     /* 4 if pPage
36fe0 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
36ff0 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  f not */.  int l
37000 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20  eafData;        
37010 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
37020 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
37030 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41  af of a LEAFDATA
37040 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75   tree */.  int u
37050 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20  sableSpace;     
37060 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
37070 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64   in pPage beyond
37080 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
37090 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20   int pageFlags; 
370a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
370b0 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d   Value of pPage-
370c0 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69  >aData[0] */.  i
370d0 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20  nt subtotal;    
370e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
370f0 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73  ubtotal of bytes
37100 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65   in cells on one
37110 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
37120 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20  Space1 = 0;     
37130 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
37140 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
37150 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69  aSpace1[] */.  i
37160 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20 3d 20  nt iOvflSpace = 
37170 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  0;          /* F
37180 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65  irst unused byte
37190 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d   of aOvflSpace[]
371a0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61   */.  int szScra
371b0 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  tch;            
371c0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63     /* Size of sc
371d0 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71  ratch memory req
371e0 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50  uested */.  MemP
371f0 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20  age *apOld[NB]; 
37200 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67           /* pPag
37210 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20  e and up to two 
37220 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65  siblings */.  Me
37230 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b  mPage *apNew[NB+
37240 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50  2];        /* pP
37250 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42  age and up to NB
37260 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20   siblings after 
37270 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75  balancing */.  u
37280 38 20 2a 70 52 69 67 68 74 3b 20 20 20 20 20 20  8 *pRight;      
37290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
372a0 6f 63 61 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e  ocation in paren
372b0 74 20 6f 66 20 72 69 67 68 74 2d 73 69 62 6c 69  t of right-sibli
372c0 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ng pointer */.  
372d0 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b  u8 *apDiv[NB-1];
372e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
372f0 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  Divider cells in
37300 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e   pParent */.  in
37310 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20  t cntNew[NB+2]; 
37320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
37330 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f  dex in aCell[] o
37340 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74  f cell after i-t
37350 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  h page */.  int 
37360 63 6e 74 4f 6c 64 5b 4e 42 2b 32 5d 3b 20 20 20  cntOld[NB+2];   
37370 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20           /* Old 
37380 69 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d  index in aCell[]
37390 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67 65   after i-th page
373a0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b   */.  int szNew[
373b0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
373c0 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73     /* Combined s
373d0 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61  ize of cells pla
373e0 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20  ce on i-th page 
373f0 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
37400 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
37410 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62    /* All cells b
37420 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f  egin balanced */
37430 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
37440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37450 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
37460 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
37470 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Cell[] */.  u8 *
37480 61 53 70 61 63 65 31 3b 20 20 20 20 20 20 20 20  aSpace1;        
37490 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
374a0 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20  e for copies of 
374b0 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a  dividers cells *
374c0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
374d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
374e0 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20   /* Temp var to 
374f0 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d  store a page num
37500 62 65 72 20 69 6e 20 2a 2f 0a 20 20 75 38 20 61  ber in */.  u8 a
37510 62 44 6f 6e 65 5b 4e 42 2b 32 5d 3b 20 20 20 20  bDone[NB+2];    
37520 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
37530 20 61 66 74 65 72 20 69 27 74 68 20 6e 65 77 20   after i'th new 
37540 70 61 67 65 20 69 73 20 70 6f 70 75 6c 61 74 65  page is populate
37550 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 61 50 67 6e  d */.  Pgno aPgn
37560 6f 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  o[NB+2];        
37570 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
37580 65 72 73 20 6f 66 20 6e 65 77 20 70 61 67 65 73  ers of new pages
37590 20 62 65 66 6f 72 65 20 73 68 75 66 66 6c 69 6e   before shufflin
375a0 67 20 2a 2f 0a 20 20 75 31 36 20 61 50 67 46 6c  g */.  u16 aPgFl
375b0 61 67 73 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  ags[NB+2];      
375c0 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 65      /* flags fie
375d0 6c 64 20 6f 66 20 6e 65 77 20 70 61 67 65 73 20  ld of new pages 
375e0 62 65 66 6f 72 65 20 73 68 75 66 66 6c 69 6e 67  before shuffling
375f0 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74 28 61 62   */..  memset(ab
37600 44 6f 6e 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Done, 0, sizeof(
37610 61 62 44 6f 6e 65 29 29 3b 0a 20 20 70 42 74 20  abDone));.  pBt 
37620 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a  = pParent->pBt;.
37630 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
37640 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
37650 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
37660 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
37670 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
37680 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
37690 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52 41 43  );..#if 0.  TRAC
376a0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67  E(("BALANCE: beg
376b0 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64  in page %d child
376c0 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   of %d\n", pPage
376d0 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d  ->pgno, pParent-
376e0 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a  >pgno));.#endif.
376f0 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
37700 69 6e 74 20 70 50 61 72 65 6e 74 20 6d 61 79 20  int pParent may 
37710 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
37720 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20   overflow cell. 
37730 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 69 73  And if.  ** this
37740 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69   overflow cell i
37750 73 20 70 72 65 73 65 6e 74 2c 20 69 74 20 6d 75  s present, it mu
37760 73 74 20 62 65 20 74 68 65 20 63 65 6c 6c 20 77  st be the cell w
37770 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ith .  ** index 
37780 69 50 61 72 65 6e 74 49 64 78 2e 20 54 68 69 73  iParentIdx. This
37790 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20   scenario comes 
377a0 61 62 6f 75 74 20 77 68 65 6e 20 74 68 69 73 20  about when this 
377b0 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
377c0 20 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63   called (indirec
377d0 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69 74 65  tly) from sqlite
377e0 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 2e 0a  3BtreeDelete()..
377f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
37800 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
37810 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d  w==0 || pParent-
37820 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b  >nOverflow==1 );
37830 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
37840 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  nt->nOverflow==0
37850 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 69 4f   || pParent->aiO
37860 76 66 6c 5b 30 5d 3d 3d 69 50 61 72 65 6e 74 49  vfl[0]==iParentI
37870 64 78 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f  dx );..  if( !aO
37880 76 66 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20  vflSpace ){.    
37890 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
378a0 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  MEM;.  }..  /* F
378b0 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20  ind the sibling 
378c0 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65  pages to balance
378d0 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68  . Also locate th
378e0 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  e cells in pPare
378f0 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69  nt .  ** that di
37900 76 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67  vide the sibling
37910 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73  s. An attempt is
37920 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e   made to find NN
37930 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20   siblings on .  
37940 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  ** either side o
37950 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69  f pPage. More si
37960 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e  blings are taken
37970 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20   from one side, 
37980 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69  however, .  ** i
37990 66 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65  f there are fewe
379a0 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e  r than NN siblin
379b0 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20  gs on the other 
379c0 73 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74  side. If pParent
379d0 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20  .  ** has NB or 
379e0 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74  fewer children t
379f0 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  hen all children
37a00 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20   of pParent are 
37a10 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20  taken.  .  **.  
37a20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73  ** This loop als
37a30 6f 20 64 72 6f 70 73 20 74 68 65 20 64 69 76 69  o drops the divi
37a40 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74  der cells from t
37a50 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
37a60 54 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74  This.  ** way, t
37a70 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
37a80 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
37a90 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65  s not have to de
37aa0 61 6c 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a  al with any.  **
37ab0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
37ac0 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  in the parent pa
37ad0 67 65 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79  ge, since if any
37ae0 20 65 78 69 73 74 65 64 20 74 68 65 79 20 77 69   existed they wi
37af0 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72  ll.  ** have alr
37b00 65 61 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65  eady been remove
37b10 64 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50  d..  */.  i = pP
37b20 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
37b30 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   + pParent->nCel
37b40 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a  l;.  if( i<2 ){.
37b50 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20      nxDiv = 0;. 
37b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
37b70 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20 7c 7c 20  rt( bBulk==0 || 
37b80 62 42 75 6c 6b 3d 3d 31 20 29 3b 0a 20 20 20 20  bBulk==1 );.    
37b90 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d  if( iParentIdx==
37ba0 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
37bb0 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69       .      nxDi
37bc0 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  v = 0;.    }else
37bd0 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d   if( iParentIdx=
37be0 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69  =i ){.      nxDi
37bf0 76 20 3d 20 69 2d 32 2b 62 42 75 6c 6b 3b 0a 20  v = i-2+bBulk;. 
37c00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37c10 61 73 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30  assert( bBulk==0
37c20 20 29 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 20   );.      nxDiv 
37c30 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a  = iParentIdx-1;.
37c40 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 2d      }.    i = 2-
37c50 62 42 75 6c 6b 3b 0a 20 20 7d 0a 20 20 6e 4f 6c  bBulk;.  }.  nOl
37c60 64 20 3d 20 69 2b 31 3b 0a 20 20 69 66 28 20 28  d = i+1;.  if( (
37c70 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
37c80 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61  >nOverflow)==pPa
37c90 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
37ca0 20 20 20 70 52 69 67 68 74 20 3d 20 26 70 50 61     pRight = &pPa
37cb0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
37cc0 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
37cd0 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
37ce0 70 52 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c  pRight = findCel
37cf0 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44  l(pParent, i+nxD
37d00 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
37d10 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67  rflow);.  }.  pg
37d20 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 52  no = get4byte(pR
37d30 69 67 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20  ight);.  while( 
37d40 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65  1 ){.    rc = ge
37d50 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
37d60 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69  , pgno, &apOld[i
37d70 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  ], 0);.    if( r
37d80 63 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  c ){.      memse
37d90 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31  t(apOld, 0, (i+1
37da0 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  )*sizeof(MemPage
37db0 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  *));.      goto 
37dc0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
37dd0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 43  .    }.    nMaxC
37de0 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b  ells += 1+apOld[
37df0 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b  i]->nCell+apOld[
37e00 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  i]->nOverflow;. 
37e10 20 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20     if( (i--)==0 
37e20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66  ) break;..    if
37e30 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65  ( i+nxDiv==pPare
37e40 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20 26 26  nt->aiOvfl[0] &&
37e50 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
37e60 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 61 70 44  low ){.      apD
37e70 69 76 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d  iv[i] = pParent-
37e80 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20  >apOvfl[0];.    
37e90 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
37ea0 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  e(apDiv[i]);.   
37eb0 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65     szNew[i] = ce
37ec0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
37ed0 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  t, apDiv[i]);.  
37ee0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76      pParent->nOv
37ef0 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
37f00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44  }else{.      apD
37f10 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  iv[i] = findCell
37f20 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69  (pParent, i+nxDi
37f30 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
37f40 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e  flow);.      pgn
37f50 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44  o = get4byte(apD
37f60 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a  iv[i]);.      sz
37f70 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a  New[i] = cellSiz
37f80 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70  ePtr(pParent, ap
37f90 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20  Div[i]);..      
37fa0 2f 2a 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c  /* Drop the cell
37fb0 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
37fc0 20 70 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20   page. apDiv[i] 
37fd0 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a  still points to.
37fe0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c        ** the cel
37ff0 6c 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 72  l within the par
38000 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  ent, even though
38010 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f   it has been dro
38020 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54  pped..      ** T
38030 68 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61  his is safe beca
38040 75 73 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63  use dropping a c
38050 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69  ell only overwri
38060 74 65 73 20 74 68 65 20 66 69 72 73 74 0a 20 20  tes the first.  
38070 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65      ** four byte
38080 73 20 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69  s of it, and thi
38090 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
380a0 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 66 69 72  not need the fir
380b0 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72  st.      ** four
380c0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 64 69   bytes of the di
380d0 76 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74  vider cell. So t
380e0 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61  he pointer is sa
380f0 66 65 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20  fe to use.      
38100 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20  ** later on.  . 
38110 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
38120 20 42 75 74 20 6e 6f 74 20 69 66 20 77 65 20 61   But not if we a
38130 72 65 20 69 6e 20 73 65 63 75 72 65 2d 64 65 6c  re in secure-del
38140 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20 73 65 63  ete mode. In sec
38150 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2c  ure-delete mode,
38160 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72  .      ** the dr
38170 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65  opCell() routine
38180 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20   will overwrite 
38190 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20  the entire cell 
381a0 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20  with zeroes..   
381b0 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
381c0 73 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20  se, temporarily 
381d0 63 6f 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e  copy the cell in
381e0 74 6f 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63  to the aOvflSpac
381f0 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66  e[].      ** buf
38200 66 65 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20  fer. It will be 
38210 63 6f 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e  copied out again
38220 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20   as soon as the 
38230 61 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a  aSpace[] buffer.
38240 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f        ** is allo
38250 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  cated.  */.     
38260 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
38270 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
38280 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20  DELETE ){.      
38290 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 20    int iOff;..   
382a0 20 20 20 20 20 69 4f 66 66 20 3d 20 53 51 4c 49       iOff = SQLI
382b0 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 61 70  TE_PTR_TO_INT(ap
382c0 44 69 76 5b 69 5d 29 20 2d 20 53 51 4c 49 54 45  Div[i]) - SQLITE
382d0 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 50 61 72  _PTR_TO_INT(pPar
382e0 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  ent->aData);.   
382f0 20 20 20 20 20 69 66 28 20 28 69 4f 66 66 2b 73       if( (iOff+s
38300 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e 74 29 70 42  zNew[i])>(int)pB
38310 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
38320 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
38330 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
38340 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  KPT;.          m
38350 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20  emset(apOld, 0, 
38360 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d  (i+1)*sizeof(Mem
38370 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 20  Page*));.       
38380 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
38390 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
383a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
383b0 20 20 6d 65 6d 63 70 79 28 26 61 4f 76 66 6c 53    memcpy(&aOvflS
383c0 70 61 63 65 5b 69 4f 66 66 5d 2c 20 61 70 44 69  pace[iOff], apDi
383d0 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b  v[i], szNew[i]);
383e0 0a 20 20 20 20 20 20 20 20 20 20 61 70 44 69 76  .          apDiv
383f0 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53 70 61 63  [i] = &aOvflSpac
38400 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61 72 65  e[apDiv[i]-pPare
38410 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20 20 20 20  nt->aData];.    
38420 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
38430 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
38440 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50  rent, i+nxDiv-pP
38450 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
38460 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63 29  , szNew[i], &rc)