/ Hex Artifact Content
Login

Artifact 11cf36074a9829bad4506e8486bfd2431168bb54:


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 20 26  F_Incrblob)!=0 &
40a0: 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20  & (isClearTable 
40b0: 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  || p->info.nKey=
40c0: 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20  =iRow) ){.      
40d0: 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
40e0: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
40f0: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20  }.  }.}..#else. 
4100: 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f   /* Stub functio
4110: 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20  n when INCRBLOB 
4120: 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20  is omitted */.  
4130: 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61  #define invalida
4140: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
4150: 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20  s(x,y,z).#endif 
4160: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
4170: 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a  NCRBLOB */../*.*
4180: 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f  * Set bit pgno o
4190: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  f the BtShared.p
41a0: 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65  HasContent bitve
41b0: 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  c. This is calle
41c0: 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67  d .** when a pag
41d0: 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c  e that previousl
41e0: 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61  y contained data
41f0: 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d   becomes a free-
4200: 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61  list leaf .** pa
4210: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74  ge..**.** The Bt
4220: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4230: 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73  nt bitvec exists
4240: 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
4250: 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75  an obscure.** bu
4260: 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20  g caused by the 
4270: 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74  interaction of t
4280: 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74  wo useful IO opt
4290: 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f  imizations surro
42a0: 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c  unding.** free-l
42b0: 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a  ist leaf pages:.
42c0: 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20  **.**   1) When 
42d0: 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65  all data is dele
42e0: 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20  ted from a page 
42f0: 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63  and the page bec
4300: 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66  omes.**      a f
4310: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4320: 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20  ge, the page is 
4330: 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  not written to t
4340: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
4350: 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73      (as free-lis
4360: 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e  t leaf pages con
4370: 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66  tain no meaningf
4380: 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69  ul data). Someti
4390: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68  mes.**      such
43a0: 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65   a page is not e
43b0: 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28  ven journalled (
43c0: 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
43d0: 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20  e modified,.**  
43e0: 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a      why bother j
43f0: 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e  ournalling it?).
4400: 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e  .**.**   2) When
4410: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4420: 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64  f page is reused
4430: 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73  , its content is
4440: 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20   not read.**    
4450: 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62    from the datab
4460: 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74  ase or written t
4470: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
4480: 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69  le (why should i
4490: 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66  t.**      be, if
44a0: 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c   it is not at al
44b0: 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a  l meaningful?)..
44c0: 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c  **.** By themsel
44d0: 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d  ves, these optim
44e0: 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69  izations work fi
44f0: 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61  ne and provide a
4500: 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72   handy.** perfor
4510: 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62  mance boost to b
4520: 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e  ulk delete or in
4530: 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e  sert operations.
4540: 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20   However, if.** 
4550: 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20  a page is moved 
4560: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
4570: 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64   and then reused
4580: 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
4590: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  .** transaction,
45a0: 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73   a problem comes
45b0: 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65   up. If the page
45c0: 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c   is not journall
45d0: 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73  ed when.** it is
45e0: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72   moved to the fr
45f0: 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69  ee-list and it i
4600: 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e  s also not journ
4610: 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a  alled when it.**
4620: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
4630: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
4640: 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65   and reused, the
4650: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  n the original d
4660: 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f  ata.** may be lo
4670: 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74  st. In the event
4680: 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20   of a rollback, 
4690: 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f  it may not be po
46a0: 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73  ssible.** to res
46b0: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
46c0: 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
46d0: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  l configuration.
46e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74  .**.** The solut
46f0: 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61  ion is the BtSha
4700: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4710: 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72  bitvec. Whenever
4720: 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d   a page is .** m
4730: 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61  oved to become a
4740: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4750: 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73  page, the corres
4760: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a  ponding bit is.*
4770: 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74  * set in the bit
4780: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
4790: 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74  leaf page is ext
47a0: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
47b0: 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70  free-list,.** op
47c0: 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f  timization 2 abo
47d0: 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66  ve is omitted if
47e0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
47f0: 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64  ng bit is alread
4800: 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68  y.** set in BtSh
4810: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4820: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
4830: 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65  f the bitvec are
4840: 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74   cleared.** at t
4850: 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
4860: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
4870: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
4880: 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74  SetHasContent(Bt
4890: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
48a0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72  o pgno){.  int r
48b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
48c0: 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43   if( !pBt->pHasC
48d0: 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73  ontent ){.    as
48e0: 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d  sert( pgno<=pBt-
48f0: 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42  >nPage );.    pB
4900: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d  t->pHasContent =
4910: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
4920: 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29  eate(pBt->nPage)
4930: 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e  ;.    if( !pBt->
4940: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
4950: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4960: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
4970: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
4980: 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73  TE_OK && pgno<=s
4990: 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65  qlite3BitvecSize
49a0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
49b0: 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  t) ){.    rc = s
49c0: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
49d0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
49e0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
49f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4a00: 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53  ** Query the BtS
4a10: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4a20: 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t vector..**.** 
4a30: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
4a40: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66   called when a f
4a50: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4a60: 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ge is removed fr
4a70: 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c  om the.** free-l
4a80: 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49  ist for reuse. I
4a90: 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  t returns false 
4aa0: 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  if it is safe to
4ab0: 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a   retrieve the.**
4ac0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
4ad0: 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
4ae0: 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
4af0: 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20   flag set. True 
4b00: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
4b10: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
4b20: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
4b30: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
4b40: 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20  pgno){.  Bitvec 
4b50: 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f  *p = pBt->pHasCo
4b60: 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20  ntent;.  return 
4b70: 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69  (p && (pgno>sqli
4b80: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29  te3BitvecSize(p)
4b90: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
4ba0: 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29  cTest(p, pgno)))
4bb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
4bc0: 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42   (destroy) the B
4bd0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4be0: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
4bf0: 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e   should be.** in
4c00: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e  voked at the con
4c10: 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20  clusion of each 
4c20: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
4c30: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
4c40: 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43  d btreeClearHasC
4c50: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
4c60: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
4c70: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42  BitvecDestroy(pB
4c80: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b  t->pHasContent);
4c90: 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  .  pBt->pHasCont
4ca0: 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
4cb0: 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66  * Release all of
4cc0: 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70 61   the apPage[] pa
4cd0: 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f 72  ges for a cursor
4ce0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4cf0: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
4d00: 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43 75  CursorPages(BtCu
4d10: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
4d20: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
4d30: 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
4d40: 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
4d50: 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
4d60: 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43 75  age[i]);.    pCu
4d70: 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30  r->apPage[i] = 0
4d80: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 50  ;.  }.  pCur->iP
4d90: 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a  age = -1;.}.../*
4da0: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72  .** Save the cur
4db0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
4dc0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69  tion in the vari
4dd0: 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e  ables BtCursor.n
4de0: 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75  Key .** and BtCu
4df0: 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63  rsor.pKey. The c
4e00: 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73  ursor's state is
4e10: 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52   set to CURSOR_R
4e20: 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a  EQUIRESEEK..**.*
4e30: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
4e40: 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  t ensure that th
4e50: 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69  e cursor is vali
4e60: 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43  d (has eState==C
4e70: 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20  URSOR_VALID).** 
4e80: 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
4e90: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
4ea0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
4eb0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
4ec0: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
4ed0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
4ee0: 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
4ef0: 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
4f00: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
4f10: 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  0==pCur->pKey );
4f20: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
4f30: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
4f40: 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ) );..  rc = sql
4f50: 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
4f60: 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b  (pCur, &pCur->nK
4f70: 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
4f80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
4f90: 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63 61   /* KeySize() ca
4fa0: 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20  nnot fail */..  
4fb0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
4fc0: 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74   intKey table, t
4fd0: 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61  hen the above ca
4fe0: 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69  ll to BtreeKeySi
4ff0: 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73  ze().  ** stores
5000: 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79   the integer key
5010: 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20   in pCur->nKey. 
5020: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69  In this case thi
5030: 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20  s value is.  ** 
5040: 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75  all that is requ
5050: 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ired. Otherwise,
5060: 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20   if pCur is not 
5070: 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65  open on an intKe
5080: 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68  y.  ** table, th
5090: 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20  en malloc space 
50a0: 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  for and store th
50b0: 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74  e pCur->nKey byt
50c0: 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20  es of key .  ** 
50d0: 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  data..  */.  if(
50e0: 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65   0==pCur->apPage
50f0: 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  [0]->intKey ){. 
5100: 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20     void *pKey = 
5110: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70  sqlite3Malloc( p
5120: 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20  Cur->nKey );.   
5130: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
5140: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5150: 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
5160: 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79   (int)pCur->nKey
5170: 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69  , pKey);.      i
5180: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5190: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
51a0: 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20  ->pKey = pKey;. 
51b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
51c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
51d0: 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a  (pKey);.      }.
51e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
51f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
5200: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
5210: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61  assert( !pCur->a
5220: 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
5230: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
5240: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
5250: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62  LITE_OK ){.    b
5260: 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75  treeReleaseAllCu
5270: 72 73 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b  rsorPages(pCur);
5280: 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
5290: 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49  e = CURSOR_REQUI
52a0: 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69  RESEEK;.  }..  i
52b0: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
52c0: 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20  wCache(pCur);.  
52d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
52e0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
52f0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
5300: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
5310: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
5320: 73 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e  st(BtCursor*,Pgn
5330: 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f  o,BtCursor*);../
5340: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f  *.** Save the po
5350: 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63  sitions of all c
5360: 75 72 73 6f 72 73 20 28 65 78 63 65 70 74 20 70  ursors (except p
5370: 45 78 63 65 70 74 29 20 74 68 61 74 20 61 72 65  Except) that are
5380: 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20   open on.** the 
5390: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
53a0: 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61  page iRoot.  "Sa
53b0: 76 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ving the cursor 
53c0: 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20  position" means 
53d0: 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61  that.** the loca
53e0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65  tion in the btre
53f0: 65 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20  e is remembered 
5400: 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68  in such a way th
5410: 61 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20  at it can be.** 
5420: 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68  moved back to th
5430: 65 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65  e same spot afte
5440: 72 20 74 68 65 20 62 74 72 65 65 20 68 61 73 20  r the btree has 
5450: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
5460: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
5470: 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62  is called just b
5480: 65 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78  efore cursor pEx
5490: 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20  cept is used to 
54a0: 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61  modify the.** ta
54b0: 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ble, for example
54c0: 20 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28   in BtreeDelete(
54d0: 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74  ) or BtreeInsert
54e0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  ()..**.** Implem
54f0: 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  entation note:  
5500: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72  This routine mer
5510: 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ely checks to se
5520: 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73  e if any cursors
5530: 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73  .** need to be s
5540: 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20  aved.  It calls 
5550: 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f  out to saveCurso
5560: 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68  rsOnList() in th
5570: 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65  e (unusual).** e
5580: 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72  vent that cursor
5590: 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f  s are in need to
55a0: 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f   being saved..*/
55b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
55c0: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
55d0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
55e0: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
55f0: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
5600: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
5610: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5620: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
5630: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
5640: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
5650: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
5660: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
5670: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
5680: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
5690: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
56a0: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
56b0: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
56c0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
56d0: 74 75 72 6e 20 70 20 3f 20 73 61 76 65 43 75 72  turn p ? saveCur
56e0: 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52  sorsOnList(p, iR
56f0: 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 20 3a 20  oot, pExcept) : 
5700: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5710: 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75   This helper rou
5720: 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43  tine to saveAllC
5730: 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20  ursors does the 
5740: 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73  actual work of s
5750: 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72  aving.** the cur
5760: 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e  sors if and when
5770: 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75   a cursor is fou
5780: 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79  nd that actually
5790: 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67   requires saving
57a0: 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20  ..** The common 
57b0: 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20  case is that no 
57c0: 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20  cursors need to 
57d0: 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69  be saved, so thi
57e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20  s routine is.** 
57f0: 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20  broken out from 
5800: 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76  its caller to av
5810: 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20  oid unnecessary 
5820: 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f  stack pointer mo
5830: 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  vement..*/.stati
5840: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49  c int SQLITE_NOI
5850: 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72  NLINE saveCursor
5860: 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72  sOnList(.  BtCur
5870: 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20  sor *p,         
5880: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63    /* The first c
5890: 75 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73  ursor that needs
58a0: 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e   saving */.  Pgn
58b0: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
58c0: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65      /* Only save
58d0: 20 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69   cursor with thi
58e0: 73 20 69 52 6f 6f 74 2e 20 20 53 61 76 65 20 61  s iRoot.  Save a
58f0: 6c 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20  ll if zero */.  
5900: 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70  BtCursor *pExcep
5910: 74 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  t      /* Do not
5920: 20 73 61 76 65 20 74 68 69 73 20 63 75 72 73 6f   save this curso
5930: 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20  r */.){.  do{.  
5940: 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74    if( p!=pExcept
5950: 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c   && (0==iRoot ||
5960: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52   p->pgnoRoot==iR
5970: 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66  oot) ){.      if
5980: 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  ( p->eState==CUR
5990: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
59a0: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
59b0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
59c0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
59d0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
59e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
59f0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
5a00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5a10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
5a20: 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  p->iPage>0 );.  
5a30: 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65 61        btreeRelea
5a40: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
5a50: 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (p);.      }.   
5a60: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
5a70: 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70  ext;.  }while( p
5a80: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
5a90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
5aa0: 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65   Clear the curre
5ab0: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
5ac0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
5ad0: 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
5ae0: 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
5af0: 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
5b00: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5b10: 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74  pCur) );.  sqlit
5b20: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
5b30: 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65  ey);.  pCur->pKe
5b40: 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65  y = 0;.  pCur->e
5b50: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
5b60: 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  NVALID;.}../*.**
5b70: 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e   In this version
5b80: 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c   of BtreeMoveto,
5b90: 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65   pKey is a packe
5ba0: 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a  d index record.*
5bb0: 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e  * such as is gen
5bc0: 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  erated by the OP
5bd0: 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
5be0: 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a  de.  Unpack the.
5bf0: 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68  ** record and th
5c00: 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76  en call BtreeMov
5c10: 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f  etoUnpacked() to
5c20: 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f   do the work..*/
5c30: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
5c40: 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72  eMoveto(.  BtCur
5c50: 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f  sor *pCur,     /
5c60: 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e  * Cursor open on
5c70: 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65   the btree to be
5c80: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63   searched */.  c
5c90: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
5ca0: 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79     /* Packed key
5cb0: 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73   if the btree is
5cc0: 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   an index */.  i
5cd0: 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  64 nKey,        
5ce0: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65     /* Integer ke
5cf0: 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53  y for tables.  S
5d00: 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20  ize of pKey for 
5d10: 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74  indices */.  int
5d20: 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20   bias,          
5d30: 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20   /* Bias search 
5d40: 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
5d50: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
5d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
5d70: 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
5d80: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
5d90: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
5da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
5db0: 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70  us code */.  Unp
5dc0: 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
5dd0: 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63  xKey;   /* Unpac
5de0: 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
5df0: 0a 20 20 63 68 61 72 20 61 53 70 61 63 65 5b 32  .  char aSpace[2
5e00: 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  00];          /*
5e10: 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20   Temp space for 
5e20: 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f  pIdxKey - to avo
5e30: 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20  id a malloc */. 
5e40: 20 63 68 61 72 20 2a 70 46 72 65 65 20 3d 20 30   char *pFree = 0
5e50: 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  ;..  if( pKey ){
5e60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65  .    assert( nKe
5e70: 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65  y==(i64)(int)nKe
5e80: 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  y );.    pIdxKey
5e90: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c   = sqlite3VdbeAl
5ea0: 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
5eb0: 64 28 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  d(.        pCur-
5ec0: 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70 61 63  >pKeyInfo, aSpac
5ed0: 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65  e, sizeof(aSpace
5ee0: 29 2c 20 26 70 46 72 65 65 0a 20 20 20 20 29 3b  ), &pFree.    );
5ef0: 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79  .    if( pIdxKey
5f00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
5f10: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73  ITE_NOMEM;.    s
5f20: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
5f30: 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65  Unpack(pCur->pKe
5f40: 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79  yInfo, (int)nKey
5f50: 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  , pKey, pIdxKey)
5f60: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65  ;.    if( pIdxKe
5f70: 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a  y->nField==0 ){.
5f80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
5f90: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ree(pCur->pKeyIn
5fa0: 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a  fo->db, pFree);.
5fb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
5fc0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
5fd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
5fe0: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30  .    pIdxKey = 0
5ff0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
6000: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
6010: 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49  npacked(pCur, pI
6020: 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61  dxKey, nKey, bia
6030: 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20  s, pRes);.  if( 
6040: 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  pFree ){.    sql
6050: 69 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d  ite3DbFree(pCur-
6060: 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70  >pKeyInfo->db, p
6070: 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Free);.  }.  ret
6080: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6090: 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
60a0: 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74  sor to the posit
60b0: 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f  ion it was in (o
60c0: 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73  r as close to as
60d0: 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68   possible).** wh
60e0: 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  en saveCursorPos
60f0: 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c  ition() was call
6100: 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ed. Note that th
6110: 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20  is call deletes 
6120: 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f  the .** saved po
6130: 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72  sition info stor
6140: 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72  ed by saveCursor
6150: 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74  Position(), so t
6160: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61  here can be.** a
6170: 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63  t most one effec
6180: 74 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73  tive restoreCurs
6190: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c  orPosition() cal
61a0: 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a  l after each .**
61b0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
61c0: 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ion()..*/.static
61d0: 20 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72   int btreeRestor
61e0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
61f0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
6200: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
6210: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
6220: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
6230: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
6240: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
6250: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
6260: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
6270: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
6280: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
6290: 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
62a0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
62b0: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
62c0: 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76  .  rc = btreeMov
62d0: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
62e0: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
62f0: 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70  , 0, &pCur->skip
6300: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
6310: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6320: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6330: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
6340: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
6350: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
6360: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6370: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
6380: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
6390: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66  NVALID );.    if
63a0: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
63b0: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
63c0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
63d0: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
63e0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
63f0: 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  IPNEXT;.    }.  
6400: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6410: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
6420: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6430: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
6440: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
6450: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
6460: 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43     btreeRestoreC
6470: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
6480: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
6490: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
64a0: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
64b0: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
64c0: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
64d0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68   the position wh
64e0: 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61  ere.** it was la
64f0: 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61  st placed, or ha
6500: 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74  s been invalidat
6510: 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  ed for any other
6520: 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73   reason..** Curs
6530: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
6540: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
6550: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69  re pointing at i
6560: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a  s deleted out.**
6570: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
6580: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
6590: 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73  Cursor might als
65a0: 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65  o move if a btre
65b0: 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63  e.** is rebalanc
65c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  ed..**.** Callin
65d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  g this routine w
65e0: 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f  ith a NULL curso
65f0: 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  r pointer return
6600: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55  s false..**.** U
6610: 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  se the separate 
6620: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
6630: 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74  orRestore() rout
6640: 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ine to restore a
6650: 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20   cursor.** back 
6660: 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  to where it ough
6670: 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20  t to be if this 
6680: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
6690: 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
66a0: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
66b0: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
66c0: 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
66d0: 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e  n pCur && pCur->
66e0: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
66f0: 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ALID;.}../*.** T
6700: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74  his routine rest
6710: 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20 62 61  ores a cursor ba
6720: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
6730: 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65  al position afte
6740: 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e  r it.** has been
6750: 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f   moved by some o
6760: 75 74 73 69 64 65 20 61 63 74 69 76 69 74 79 20  utside activity 
6770: 28 73 75 63 68 20 61 73 20 61 20 62 74 72 65 65  (such as a btree
6780: 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a   rebalance or.**
6790: 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65   a row having be
67a0: 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
67b0: 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
67c0: 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f  rsor).  .**.** O
67d0: 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a  n success, the *
67e0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61  pDifferentRow pa
67f0: 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65  rameter is false
6800: 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
6810: 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69  s left.** pointi
6820: 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20 74 68  ng at exactly th
6830: 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44  e same row.  *pD
6840: 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68  ifferntRow is th
6850: 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72  e row the cursor
6860: 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67  .** was pointing
6870: 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c   to has been del
6880: 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68  eted, forcing th
6890: 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
68a0: 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61  t to some.** nea
68b0: 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54  rby row..**.** T
68c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
68d0: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
68e0: 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74  d for a cursor t
68f0: 68 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65  hat just returne
6900: 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73  d.** TRUE from s
6910: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
6920: 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a  rHasMoved()..*/.
6930: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
6940: 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74  CursorRestore(Bt
6950: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
6960: 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  t *pDifferentRow
6970: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
6980: 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
6990: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
69a0: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
69b0: 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20  R_VALID );.  rc 
69c0: 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
69d0: 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
69e0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
69f0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
6a00: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
6a10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
6a20: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
6a30: 5f 56 41 4c 49 44 20 7c 7c 20 4e 45 56 45 52 28  _VALID || NEVER(
6a40: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d  pCur->skipNext!=
6a50: 30 29 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66  0) ){.    *pDiff
6a60: 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20  erentRow = 1;.  
6a70: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 44 69 66  }else{.    *pDif
6a80: 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20  ferentRow = 0;. 
6a90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
6aa0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
6ab0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
6ac0: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47  TOVACUUM./*.** G
6ad0: 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62  iven a page numb
6ae0: 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20  er of a regular 
6af0: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72  database page, r
6b00: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a  eturn the page.*
6b10: 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
6b20: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
6b30: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
6b40: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
6b50: 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20  e.** input page 
6b60: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  number..**.** Re
6b70: 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61  turn 0 (not a va
6b80: 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67  lid page) for pg
6b90: 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72  no==1 since ther
6ba0: 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74  e is.** no point
6bb0: 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65  er map associate
6bc0: 64 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20  d with page 1.  
6bd0: 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68  The integrity_ch
6be0: 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71  eck logic.** req
6bf0: 75 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61  uires that ptrma
6c00: 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e  pPageno(*,1)!=1.
6c10: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
6c20: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53  ptrmapPageno(BtS
6c30: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
6c40: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50   pgno){.  int nP
6c50: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
6c60: 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20    Pgno iPtrMap, 
6c70: 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ret;.  assert( s
6c80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6c90: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
6ca0: 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20  .  if( pgno<2 ) 
6cb0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67  return 0;.  nPag
6cc0: 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28  esPerMapPage = (
6cd0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
6ce0: 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20  5)+1;.  iPtrMap 
6cf0: 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65  = (pgno-2)/nPage
6d00: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72  sPerMapPage;.  r
6d10: 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50  et = (iPtrMap*nP
6d20: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20  agesPerMapPage) 
6d30: 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d  + 2; .  if( ret=
6d40: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
6d50: 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  GE(pBt) ){.    r
6d60: 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  et++;.  }.  retu
6d70: 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
6d80: 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   Write an entry 
6d90: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
6da0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
6db0: 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73   routine updates
6dc0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
6dd0: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
6de0: 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20  number 'key'.** 
6df0: 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20  so that it maps 
6e00: 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20  to type 'eType' 
6e10: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
6e20: 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a  number 'pgno'..*
6e30: 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20  *.** If *pRC is 
6e40: 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65  initially non-ze
6e50: 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f  ro (non-SQLITE_O
6e60: 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  K) then this rou
6e70: 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  tine is.** a no-
6e80: 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  op.  If an error
6e90: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70   occurs, the app
6ea0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
6eb0: 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ode is written.*
6ec0: 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a  * into *pRC..*/.
6ed0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d  static void ptrm
6ee0: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
6ef0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
6f00: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
6f10: 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b  rent, int *pRC){
6f20: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
6f30: 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  ge;  /* The poin
6f40: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
6f50: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6f60: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
6f70: 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20  er map data */. 
6f80: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
6f90: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6fa0: 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  r map page numbe
6fb0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  r */.  int offse
6fc0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  t;       /* Offs
6fd0: 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  et in pointer ma
6fe0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
6ff0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rc;           /*
7000: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
7010: 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
7020: 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
7030: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
7040: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7050: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
7060: 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61  ) );.  /* The ma
7070: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67  ster-journal pag
7080: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65  e number must ne
7090: 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61  ver be used as a
70a0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
70b0: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  e */.  assert( 0
70c0: 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ==PTRMAP_ISPAGE(
70d0: 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  pBt, PENDING_BYT
70e0: 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a  E_PAGE(pBt)) );.
70f0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
7100: 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
7110: 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20  if( key==0 ){.  
7120: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
7130: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7140: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
7150: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
7160: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
7170: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
7180: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
7190: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
71a0: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
71b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
71c0: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
71d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
71e0: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
71f0: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
7200: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
7210: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
7220: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
7230: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7240: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
7250: 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  it;.  }.  assert
7260: 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74  ( offset <= (int
7270: 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
7280: 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20  -5 );.  pPtrmap 
7290: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
72a0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
72b0: 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  age);..  if( eTy
72c0: 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73  pe!=pPtrmap[offs
72d0: 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28  et] || get4byte(
72e0: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
72f0: 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20  1])!=parent ){. 
7300: 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41     TRACE(("PTRMA
7310: 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25  P_UPDATE: %d->(%
7320: 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65  d,%d)\n", key, e
7330: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a  Type, parent));.
7340: 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73      *pRC= rc = s
7350: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
7360: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
7370: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7380: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
7390: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
73a0: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
73b0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
73c0: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
73d0: 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70     }.  }..ptrmap
73e0: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
73f0: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
7400: 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
7410: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
7420: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7430: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
7440: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
7450: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
7460: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
7470: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
7480: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
7490: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
74a0: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
74b0: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
74c0: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
74d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
74e0: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
74f0: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
7500: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
7510: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
7520: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
7530: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
7540: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
7550: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
7560: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
7570: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
7580: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
7590: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
75a0: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
75b0: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
75c0: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
75d0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
75e0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
75f0: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
7600: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
7610: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
7620: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
7630: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
7640: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7650: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
7660: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
7670: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
7680: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
7690: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
76a0: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
76b0: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
76c0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc!=0 ){.    r
76d0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
76e0: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
76f0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
7700: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
7710: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
7720: 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d  _PTROFFSET(iPtrm
7730: 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20  ap, key);.  if( 
7740: 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20  offset<0 ){.    
7750: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
7760: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
7770: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
7780: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
7790: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
77a0: 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73   <= (int)pBt->us
77b0: 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20  ableSize-5 );.  
77c0: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
77d0: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
77e0: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
77f0: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
7800: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
7810: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
7820: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
7830: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
7840: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
7850: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
7860: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
7870: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7880: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7890: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a  _OK;.}..#else /*
78a0: 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49   if defined SQLI
78b0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
78c0: 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  UM */.  #define 
78d0: 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c  ptrmapPut(w,x,y,
78e0: 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20  z,rc).  #define 
78f0: 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c  ptrmapGet(w,x,y,
7900: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  z) SQLITE_OK.  #
7910: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
7920: 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63  OvflPtr(x, y, rc
7930: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
7940: 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61  Given a btree pa
7950: 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e  ge and a cell in
7960: 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65  dex (0 means the
7970: 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a   first cell on.*
7980: 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65  * the page, 1 me
7990: 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  ans the second c
79a0: 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ell, and so fort
79b0: 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  h) return a poin
79c0: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65  ter.** to the ce
79d0: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ll content..**.*
79e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
79f0: 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61  orks only for pa
7a00: 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ges that do not 
7a10: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
7a20: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69   cells..*/.#defi
7a30: 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29  ne findCell(P,I)
7a40: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
7a50: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
7a60: 65 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50  e & get2byte(&(P
7a70: 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49  )->aCellIdx[2*(I
7a80: 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69  )]))).#define fi
7a90: 6e 64 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49  ndCellv2(D,M,O,I
7aa0: 29 20 28 44 2b 28 4d 26 67 65 74 32 62 79 74 65  ) (D+(M&get2byte
7ab0: 28 44 2b 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a  (D+(O+2*(I))))).
7ac0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d  ../*.** This a m
7ad0: 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73  ore complex vers
7ae0: 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28  ion of findCell(
7af0: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
7b00: 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64  .** pages that d
7b10: 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  o contain overfl
7b20: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ow cells..*/.sta
7b30: 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72  tic u8 *findOver
7b40: 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65  flowCell(MemPage
7b50: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
7b60: 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ll){.  int i;.  
7b70: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7b80: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
7b90: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
7ba0: 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e  .  for(i=pPage->
7bb0: 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d  nOverflow-1; i>=
7bc0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
7bd0: 20 6b 3b 0a 20 20 20 20 6b 20 3d 20 70 50 61 67   k;.    k = pPag
7be0: 65 2d 3e 61 69 4f 76 66 6c 5b 69 5d 3b 0a 20 20  e->aiOvfl[i];.  
7bf0: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
7c00: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
7c10: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
7c20: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 61 70  return pPage->ap
7c30: 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d  Ovfl[i];.      }
7c40: 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a  .      iCell--;.
7c50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7c60: 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  rn findCell(pPag
7c70: 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a  e, iCell);.}../*
7c80: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
7c90: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
7ca0: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
7cb0: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
7cc0: 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65  e.  There.** are
7cd0: 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66   two versions of
7ce0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
7cf0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
7d00: 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65  ) takes a .** ce
7d10: 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65 20  ll index as the 
7d20: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
7d30: 61 6e 64 20 62 74 72 65 65 50 61 72 73 65 43 65  and btreeParseCe
7d40: 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65  llPtr() .** take
7d50: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
7d60: 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63  he body of the c
7d70: 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e  ell as its secon
7d80: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
7d90: 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 66 69  * Within this fi
7da0: 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43 65 6c  le, the parseCel
7db0: 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62 65  l() macro can be
7dc0: 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20   called instead 
7dd0: 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  of.** btreeParse
7de0: 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67  CellPtr(). Using
7df0: 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c   some compilers,
7e00: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61   this will be fa
7e10: 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ster..*/.static 
7e20: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
7e30: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
7e40: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
7e50: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
7e60: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
7e70: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
7e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
7e90: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
7ea0: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
7eb0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
7ec0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
7ed0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
7ee0: 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  /.){.  u8 *pIter
7ef0: 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d   = &pCell[pPage-
7f00: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
7f10: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
7f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7f30: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
7f40: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
7f50: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7f60: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
7f70: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
7f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
7f90: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
7fa0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
7fb0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
7fc0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28  ntKey ){.    if(
7fd0: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
7fe0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
7ff0: 20 70 49 74 65 72 3d 3d 70 43 65 6c 6c 20 29 3b   pIter==pCell );
8000: 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20  .      pIter += 
8010: 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  getVarint32(pIte
8020: 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  r, nPayload);.  
8030: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
8040: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
8050: 20 7d 0a 20 20 20 20 70 49 74 65 72 20 2b 3d 20   }.    pIter += 
8060: 67 65 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c  getVarint(pIter,
8070: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
8080: 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Key);.  }else{. 
8090: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
80a0: 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e  arint32(pIter, n
80b0: 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49  Payload);.    pI
80c0: 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79  nfo->nKey = nPay
80d0: 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66  load;.  }.  pInf
80e0: 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50  o->nPayload = nP
80f0: 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d  ayload;.  pInfo-
8100: 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65  >pPayload = pIte
8110: 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  r;.  testcase( n
8120: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
8130: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
8140: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
8150: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
8160: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61  l+1 );.  if( nPa
8170: 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
8180: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a  xLocal ){.    /*
8190: 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61   This is the (ea
81a0: 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  sy) common case 
81b0: 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65  where the entire
81c0: 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20   payload fits.  
81d0: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61    ** on the loca
81e0: 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72  l page.  No over
81f0: 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64  flow is required
8200: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
8210: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79  fo->nSize = nPay
8220: 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49 74  load + (u16)(pIt
8230: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20  er - pCell);.   
8240: 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a   if( pInfo->nSiz
8250: 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69  e<4 ) pInfo->nSi
8260: 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66  ze = 4;.    pInf
8270: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
8280: 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70  )nPayload;.    p
8290: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
82a0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
82b0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
82c0: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
82d0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
82e0: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
82f0: 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f  e have.    ** to
8300: 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68   decide how much
8310: 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
8320: 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74  y and how much t
8330: 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20  o spill onto.   
8340: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
8350: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
8360: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
8370: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
8380: 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61  nused.    ** spa
8390: 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce on overflow p
83a0: 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69  ages while keepi
83b0: 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ng the amount of
83c0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20   local storage. 
83d0: 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e     ** in between
83e0: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
83f0: 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20  xLocal..    **. 
8400: 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20     ** Warning:  
8410: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79  changing the way
8420: 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   overflow payloa
8430: 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  d is distributed
8440: 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77   in any.    ** w
8450: 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  ay will result i
8460: 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
8470: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20  e file format.. 
8480: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69     */.    int mi
8490: 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69  nLocal;  /* Mini
84a0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
84b0: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
84c0: 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61  ly */.    int ma
84d0: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
84e0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
84f0: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
8500: 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75  ly */.    int su
8510: 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72  rplus;   /* Over
8520: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61  flow payload ava
8530: 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c  ilable for local
8540: 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20   storage */..   
8550: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
8560: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
8570: 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67   maxLocal = pPag
8580: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20  e->maxLocal;.   
8590: 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f   surplus = minLo
85a0: 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20  cal + (nPayload 
85b0: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61  - minLocal)%(pPa
85c0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
85d0: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
85e0: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
85f0: 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20  =maxLocal );.   
8600: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
8610: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  us==maxLocal+1 )
8620: 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c 75  ;.    if( surplu
8630: 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b  s <= maxLocal ){
8640: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
8650: 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70  ocal = (u16)surp
8660: 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  lus;.    }else{.
8670: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f        pInfo->nLo
8680: 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f  cal = (u16)minLo
8690: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  cal;.    }.    p
86a0: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
86b0: 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e  = (u16)(&pInfo->
86c0: 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e  pPayload[pInfo->
86d0: 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29  nLocal] - pCell)
86e0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  ;.    pInfo->nSi
86f0: 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  ze = pInfo->iOve
8700: 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d  rflow + 4;.  }.}
8710: 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65 43 65  .#define parseCe
8720: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c  ll(pPage, iCell,
8730: 20 70 49 6e 66 6f 29 20 5c 0a 20 20 62 74 72 65   pInfo) \.  btre
8740: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70  eParseCellPtr((p
8750: 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28  Page), findCell(
8760: 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29  (pPage), (iCell)
8770: 29 2c 20 28 70 49 6e 66 6f 29 29 0a 73 74 61 74  ), (pInfo)).stat
8780: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
8790: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
87a0: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
87b0: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
87c0: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
87d0: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
87e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
87f0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
8800: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
8810: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
8820: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
8830: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
8840: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61  cture */.){.  pa
8850: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  rseCell(pPage, i
8860: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a  Cell, pInfo);.}.
8870: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
8880: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
8890: 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20  of bytes that a 
88a0: 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68  Cell needs in th
88b0: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61  e cell.** data a
88c0: 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65  rea of the btree
88d0: 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75  -page.  The retu
88e0: 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64  rn number includ
88f0: 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  es the cell.** d
8900: 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74  ata header and t
8910: 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64  he local payload
8920: 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76  , but not any ov
8930: 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a  erflow page or.*
8940: 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64  * the space used
8950: 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   by the cell poi
8960: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
8970: 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  u16 cellSizePtr(
8980: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8990: 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38  u8 *pCell){.  u8
89a0: 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65 6c 6c   *pIter = &pCell
89b0: 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  [pPage->childPtr
89c0: 53 69 7a 65 5d 3b 0a 20 20 75 38 20 2a 70 45 6e  Size];.  u8 *pEn
89d0: 64 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a  d;.  u32 nSize;.
89e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
89f0: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
8a00: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
8a10: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
8a20: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
8a30: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
8a40: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
8a50: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
8a60: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
8a70: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
8a80: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
8a90: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
8aa0: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
8ab0: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
8ac0: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
8ad0: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
8ae0: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
8af0: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
8b00: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
8b10: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62 74   debuginfo;.  bt
8b20: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
8b30: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
8b40: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
8b50: 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  f..  if( pPage->
8b60: 69 6e 74 4b 65 79 3d 3d 30 20 7c 7c 20 70 50 61  intKey==0 || pPa
8b70: 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
8b80: 20 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65     nSize = *pIte
8b90: 72 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  r;.    if( nSize
8ba0: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20  >=0x80 ){.      
8bb0: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d  pEnd = &pIter[9]
8bc0: 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 26 3d  ;.      nSize &=
8bd0: 20 30 78 37 66 3b 0a 20 20 20 20 20 20 64 6f 7b   0x7f;.      do{
8be0: 0a 20 20 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  .        nSize =
8bf0: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
8c00: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
8c10: 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 2a  .      }while( *
8c20: 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26  (pIter)>=0x80 &&
8c30: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
8c40: 20 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2b 2b     }.    pIter++
8c50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
8c60: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Size = 0;.  }.  
8c70: 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
8c80: 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65  y ){.    /* pIte
8c90: 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20  r now points at 
8ca0: 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67  the 64-bit integ
8cb0: 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20  er key value, a 
8cc0: 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
8cd0: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e  .    ** integer.
8ce0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
8cf0: 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72  lock moves pIter
8d00: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
8d10: 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20 20   first byte.    
8d20: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
8d30: 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  of the key value
8d40: 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20  . */.    pEnd = 
8d50: 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77  &pIter[9];.    w
8d60: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29  hile( (*pIter++)
8d70: 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  &0x80 && pIter<p
8d80: 45 6e 64 20 29 3b 0a 20 20 7d 0a 0a 20 20 74 65  End );.  }..  te
8d90: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
8da0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
8db0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53  ;.  testcase( nS
8dc0: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
8dd0: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
8de0: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
8df0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
8e00: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
8e10: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
8e20: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
8e30: 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e  l + (nSize - min
8e40: 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d  Local) % (pPage-
8e50: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
8e60: 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63   - 4);.    testc
8e70: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
8e80: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
8e90: 20 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 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  cal+1 );.    if(
8ec0: 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61   nSize>pPage->ma
8ed0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
8ee0: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
8ef0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a  ;.    }.    nSiz
8f00: 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e 53  e += 4;.  }.  nS
8f10: 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74  ize += (u32)(pIt
8f20: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20 20  er - pCell);..  
8f30: 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73  /* The minimum s
8f40: 69 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c 20  ize of any cell 
8f50: 69 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  is 4 bytes. */. 
8f60: 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a   if( nSize<4 ){.
8f70: 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20      nSize = 4;. 
8f80: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53   }..  assert( nS
8f90: 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e  ize==debuginfo.n
8fa0: 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Size || CORRUPT_
8fb0: 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  DB );.  return (
8fc0: 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69  u16)nSize;.}..#i
8fd0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8fe0: 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74  G./* This variat
8ff0: 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50  ion on cellSizeP
9000: 74 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73  tr() is used ins
9010: 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20  ide of assert() 
9020: 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e  statements.** on
9030: 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31  ly. */.static u1
9040: 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61  6 cellSize(MemPa
9050: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
9060: 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20  Cell){.  return 
9070: 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
9080: 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  e, findCell(pPag
9090: 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65  e, iCell));.}.#e
90a0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
90b0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
90c0: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  CUUM./*.** If th
90d0: 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61  e cell pCell, pa
90e0: 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  rt of page pPage
90f0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
9100: 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65  ter.** to an ove
9110: 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65  rflow page, inse
9120: 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  rt an entry into
9130: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
9140: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72  .** for the over
9150: 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  flow page..*/.st
9160: 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70  atic void ptrmap
9170: 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61  PutOvflPtr(MemPa
9180: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
9190: 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b  Cell, int *pRC){
91a0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
91b0: 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ;.  if( *pRC ) r
91c0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
91d0: 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62   pCell!=0 );.  b
91e0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
91f0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
9200: 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66  info);.  if( inf
9210: 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  o.iOverflow ){. 
9220: 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67     Pgno ovfl = g
9230: 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
9240: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
9250: 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
9260: 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c  Page->pBt, ovfl,
9270: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
9280: 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  1, pPage->pgno, 
9290: 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  pRC);.  }.}.#end
92a0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61  if.../*.** Defra
92b0: 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67  gment the page g
92c0: 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73  iven.  All Cells
92d0: 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68   are moved to th
92e0: 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20  e.** end of the 
92f0: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65  page and all fre
9300: 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65  e space is colle
9310: 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a  cted into one.**
9320: 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61   big FreeBlk tha
9330: 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  t occurs in betw
9340: 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20 61  een the header a
9350: 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  nd cell.** point
9360: 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68 65  er array and the
9370: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
9380: 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ea..*/.static in
9390: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
93a0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
93b0: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
93d0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
93e0: 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9400: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
9410: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
9420: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
9430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
9440: 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65  fset to the page
9450: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
9460: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
9470: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
9480: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
9490: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
94a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
94b0: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79  ber of usable by
94c0: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
94d0: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
94e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
94f0: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
9500: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
9510: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  y */.  int cbrk;
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9530: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
9540: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
9550: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  area */.  int nC
9560: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
9570: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9580: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
9590: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
95a0: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  d char *data;   
95b0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
95c0: 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  data */.  unsign
95d0: 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20  ed char *temp;  
95e0: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65       /* Temp are
95f0: 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65  a for cell conte
9600: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  nt */.  int iCel
9610: 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  lFirst;         
9620: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
9630: 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  wable cell index
9640: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
9650: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
9660: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
9670: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
9680: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
9690: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
96a0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
96b0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
96c0: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
96d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
96e0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
96f0: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
9700: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
9710: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
9720: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
9730: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9740: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
9750: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
9760: 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74  ;.  temp = sqlit
9770: 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
9780: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
9790: 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  ger);.  data = p
97a0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
97b0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
97c0: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
97d0: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
97e0: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
97f0: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
9800: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
9810: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
9820: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
9830: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
9840: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
9850: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32  e;.  cbrk = get2
9860: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
9870: 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65  ]);.  memcpy(&te
9880: 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b  mp[cbrk], &data[
9890: 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a  cbrk], usableSiz
98a0: 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72  e - cbrk);.  cbr
98b0: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
98c0: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
98d0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
98e0: 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ell;.  iCellLast
98f0: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
9900: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
9910: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
9920: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
9930: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
9940: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
9950: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
9960: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
9970: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
9980: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
9990: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
99a0: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
99b0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
99c0: 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64  llLast );.#if !d
99d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
99e0: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
99f0: 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a  LL_CHECK).    /*
9a00: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
9a10: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
9a20: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
9a30: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
9a40: 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45      ** if SQLITE
9a50: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
9a60: 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64  _CELL_CHECK is d
9a70: 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20  efined .    */. 
9a80: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
9a90: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
9aa0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
9ab0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9ac0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
9ad0: 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
9ae0: 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73  t( pc>=iCellFirs
9af0: 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61  t && pc<=iCellLa
9b00: 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  st );.    size =
9b10: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
9b20: 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a  ge, &temp[pc]);.
9b30: 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65      cbrk -= size
9b40: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
9b50: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
9b60: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29  SIZE_CELL_CHECK)
9b70: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43  .    if( cbrk<iC
9b80: 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ellFirst ){.    
9b90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9ba0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9bb0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
9bc0: 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73  ( cbrk<iCellFirs
9bd0: 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  t || pc+size>usa
9be0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
9bf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9c00: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9c10: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73   }.#endif.    as
9c20: 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c  sert( cbrk+size<
9c30: 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  =usableSize && c
9c40: 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20  brk>=iCellFirst 
9c50: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9c60: 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62   cbrk+size==usab
9c70: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65  leSize );.    te
9c80: 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d  stcase( pc+size=
9c90: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
9ca0: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
9cb0: 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  cbrk], &temp[pc]
9cc0: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
9cd0: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
9ce0: 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  k);.  }.  assert
9cf0: 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  ( cbrk>=iCellFir
9d00: 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  st );.  put2byte
9d10: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
9d20: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
9d30: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
9d40: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
9d50: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
9d60: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43   memset(&data[iC
9d70: 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62  ellFirst], 0, cb
9d80: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a  rk-iCellFirst);.
9d90: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9da0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
9db0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
9dc0: 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d  ) );.  if( cbrk-
9dd0: 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67  iCellFirst!=pPag
9de0: 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
9df0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9e00: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
9e10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9e20: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
9e30: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
9e40: 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20  s of space from 
9e50: 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65  within the B-Tre
9e60: 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a  e page passed.**
9e70: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
9e80: 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e  gument. Write in
9e90: 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64  to *pIdx the ind
9ea0: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
9eb0: 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65  Data[].** of the
9ec0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
9ed0: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20  llocated space. 
9ee0: 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51  Return either SQ
9ef0: 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e  LITE_OK or.** an
9f00: 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75   error code (usu
9f10: 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52  ally SQLITE_CORR
9f20: 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  UPT)..**.** The 
9f30: 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65  caller guarantee
9f40: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
9f50: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
9f60: 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
9f70: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69  allocation.  Thi
9f80: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
9f90: 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65  need to defragme
9fa0: 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  nt in order to b
9fb0: 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20  ring.** all the 
9fc0: 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20  space together, 
9fd0: 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72  however.  This r
9fe0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69  outine will avoi
9ff0: 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  d using.** the f
a000: 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70  irst two bytes p
a010: 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  ast the cell poi
a020: 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20  nter area since 
a030: 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a  presumably this.
a040: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ** allocation is
a050: 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f   being made in o
a060: 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61  rder to insert a
a070: 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65   new cell, so we
a080: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e   will.** also en
a090: 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e  d up needing a n
a0a0: 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  ew cell pointer.
a0b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
a0c0: 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d  llocateSpace(Mem
a0d0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
a0e0: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64   nByte, int *pId
a0f0: 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  x){.  const int 
a100: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
a110: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f  Offset;    /* Lo
a120: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
a130: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f  ge->hdrOffset */
a140: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
a150: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
a160: 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  a;      /* Local
a170: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
a180: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
a190: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  top;            
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1b0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
a1c0: 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  f cell content a
a1d0: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70  rea */.  int gap
a1e0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
a1f0: 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65  t byte of gap be
a200: 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74  tween cell point
a210: 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e  ers and cell con
a220: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tent */.  int rc
a230: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74  ;         /* Int
a240: 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65  eger return code
a250: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
a260: 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20  Size; /* Usable 
a270: 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65  size of the page
a280: 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28   */.  .  assert(
a290: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
a2a0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
a2b0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
a2c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
a2d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
a2e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
a2f0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
a300: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
a310: 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a   nByte>=0 );  /*
a320: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
a330: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
a340: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
a350: 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73  e>=nByte );.  as
a360: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
a370: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 75  erflow==0 );.  u
a380: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
a390: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a3a0: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42  ze;.  assert( nB
a3b0: 79 74 65 20 3c 20 75 73 61 62 6c 65 53 69 7a 65  yte < usableSize
a3c0: 2d 38 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  -8 );..  assert(
a3d0: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
a3e0: 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d  et == hdr + 12 -
a3f0: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29   4*pPage->leaf )
a400: 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d  ;.  gap = pPage-
a410: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
a420: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
a430: 61 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35  assert( gap<=655
a440: 33 36 20 29 3b 0a 20 20 74 6f 70 20 3d 20 67 65  36 );.  top = ge
a450: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
a460: 2b 35 5d 29 3b 0a 20 20 69 66 28 20 67 61 70 3e  +5]);.  if( gap>
a470: 74 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74  top ){.    if( t
a480: 6f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 74  op==0 ){.      t
a490: 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20  op = 65536;.    
a4a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
a4b0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
a4c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
a4d0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
a4e0: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
a4f0: 65 20 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e  e between gap an
a500: 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f  d top for one mo
a510: 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a  re cell pointer.
a520: 20 20 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79    ** array entry
a530: 20 6f 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20   offset, and if 
a540: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
a550: 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20  not empty, then 
a560: 73 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20  search the.  ** 
a570: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
a580: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
a590: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
a5a0: 61 74 69 73 66 79 20 74 68 65 20 72 65 71 75 65  atisfy the reque
a5b0: 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  st..  */.  testc
a5c0: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
a5d0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
a5e0: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
a5f0: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
a600: 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32  p );.  if( gap+2
a610: 3c 3d 74 6f 70 20 26 26 20 28 64 61 74 61 5b 68  <=top && (data[h
a620: 64 72 2b 31 5d 20 7c 7c 20 64 61 74 61 5b 68 64  dr+1] || data[hd
a630: 72 2b 32 5d 29 20 29 7b 0a 20 20 20 20 69 6e 74  r+2]) ){.    int
a640: 20 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66   pc, addr;.    f
a650: 6f 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28  or(addr=hdr+1; (
a660: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
a670: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61  ata[addr]))>0; a
a680: 64 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69  ddr=pc){.      i
a690: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
a6a0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
a6b0: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
a6c0: 20 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61        if( pc>usa
a6d0: 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c  bleSize-4 || pc<
a6e0: 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  addr+4 ){.      
a6f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a700: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a710: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65      }.      size
a720: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a730: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
a740: 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20  if( size>=nByte 
a750: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78  ){.        int x
a760: 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b   = size - nByte;
a770: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
a780: 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20  e( x==4 );.     
a790: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
a7a0: 33 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  3 );.        if(
a7b0: 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20   x<4 ){.        
a7c0: 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 37    if( data[hdr+7
a7d0: 5d 3e 3d 36 30 20 29 20 67 6f 74 6f 20 64 65 66  ]>=60 ) goto def
a7e0: 72 61 67 6d 65 6e 74 5f 70 61 67 65 3b 0a 20 20  ragment_page;.  
a7f0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
a800: 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20  e the slot from 
a810: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55  the free-list. U
a820: 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  pdate the number
a830: 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   of.          **
a840: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
a850: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
a860: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
a870: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64  memcpy(&data[add
a880: 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32  r], &data[pc], 2
a890: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61 74  );.          dat
a8a0: 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29  a[hdr+7] += (u8)
a8b0: 78 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  x;.        }else
a8c0: 20 69 66 28 20 73 69 7a 65 2b 70 63 20 3e 20 75   if( size+pc > u
a8d0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
a8e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
a8f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
a900: 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  T;.        }else
a910: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
a920: 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20  he slot remains 
a930: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
a940: 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a  . Reduce its siz
a950: 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20  e to account.   
a960: 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68         ** for th
a970: 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62  e portion used b
a980: 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61  y the new alloca
a990: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tion. */.       
a9a0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
a9b0: 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20  a[pc+2], x);.   
a9c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
a9d0: 70 49 64 78 20 3d 20 70 63 20 2b 20 78 3b 0a 20  pIdx = pc + x;. 
a9e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
a9f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
aa00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
aa10: 20 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75   The request cou
aa20: 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c  ld not be fulfil
aa30: 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65  led using a free
aa40: 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63  list slot.  Chec
aa50: 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66  k.  ** to see if
aa60: 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e   defragmentation
aa70: 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
aa80: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
aa90: 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70  gap+2+nByte==top
aaa0: 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b   );.  if( gap+2+
aab0: 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 64 65 66  nByte>top ){.def
aac0: 72 61 67 6d 65 6e 74 5f 70 61 67 65 3a 0a 20 20  ragment_page:.  
aad0: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
aae0: 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
aaf0: 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65     rc = defragme
ab00: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
ab10: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
ab20: 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d  rn rc;.    top =
ab30: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
ab40: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
ab50: 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b      assert( gap+
ab60: 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20  nByte<=top );.  
ab70: 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  }...  /* Allocat
ab80: 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68  e memory from th
ab90: 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e  e gap in between
aba0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
abb0: 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64  r array.  ** and
abc0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
abd0: 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74 72  t area.  The btr
abe0: 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c  eeInitPage() cal
abf0: 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20  l has already.  
ac00: 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65  ** validated the
ac10: 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65   freelist.  Give
ac20: 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c  n that the freel
ac30: 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68  ist is valid, th
ac40: 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
ac50: 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  ay that the allo
ac60: 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e  cation can exten
ac70: 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  d off the end of
ac80: 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20   the page..  ** 
ac90: 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c  The assert() bel
aca0: 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20  ow verifies the 
acb0: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
acc0: 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d  e..  */.  top -=
acd0: 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79   nByte;.  put2by
ace0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
acf0: 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28   top);.  assert(
ad00: 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69   top+nByte <= (i
ad10: 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
ad20: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a  sableSize );.  *
ad30: 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65  pIdx = top;.  re
ad40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ad50: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
ad60: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
ad70: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
ad80: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
ad90: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
ada0: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
adb0: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
adc0: 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a  >aData[iStart].*
add0: 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  * and the size o
ade0: 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69  f the block is i
adf0: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
ae00: 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62  * Adjacent freeb
ae10: 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73  locks are coales
ae20: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ced..**.** Note 
ae30: 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68  that even though
ae40: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c   the freeblock l
ae50: 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20  ist was checked 
ae60: 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  by btreeInitPage
ae70: 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74  (),.** that rout
ae80: 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74  ine will not det
ae90: 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77  ect overlap betw
aea0: 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65  een cells or fre
aeb0: 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a  eblocks.  Nor.**
aec0: 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20   does it detect 
aed0: 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f  cells or freeblo
aee0: 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63  cks that encrouc
aef0: 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72  h into the reser
af00: 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20  ved bytes.** at 
af10: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
af20: 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69  age.  So do addi
af30: 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  tional corruptio
af40: 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20  n checks inside 
af50: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
af60: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
af70: 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79  E_CORRUPT if any
af80: 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f   problems are fo
af90: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
afa0: 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d  nt freeSpace(Mem
afb0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36  Page *pPage, u16
afc0: 20 69 53 74 61 72 74 2c 20 75 31 36 20 69 53 69   iStart, u16 iSi
afd0: 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b  ze){.  u16 iPtr;
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b000: 41 64 64 72 65 73 73 20 6f 66 20 70 6f 69 6e 74  Address of point
b010: 65 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62  er to next freeb
b020: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46  lock */.  u16 iF
b030: 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20  reeBlk;         
b040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b050: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
b060: 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  e next freeblock
b070: 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20   */.  u8 hdr;   
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
b0a0: 61 67 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e  age header size.
b0b0: 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20    0 or 100 */.  
b0c0: 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20  u8 nFrag = 0;   
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0e0: 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69        /* Reducti
b0f0: 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74  on in fragmentat
b100: 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72  ion */.  u16 iOr
b110: 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20  igSize = iSize; 
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b130: 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
b140: 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75   of iSize */.  u
b150: 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65  32 iLast = pPage
b160: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
b170: 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20  e-4; /* Largest 
b180: 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f  possible freeblo
b190: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75  ck offset */.  u
b1a0: 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74  32 iEnd = iStart
b1b0: 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   + iSize;       
b1c0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
b1d0: 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61  te past the iSta
b1e0: 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75  rt buffer */.  u
b1f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
b200: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
b210: 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e  a;   /* Page con
b220: 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tent */..  asser
b230: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
b240: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
b250: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
b260: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
b270: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b280: 74 28 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65  t( iStart>=pPage
b290: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50  ->hdrOffset+6+pP
b2a0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
b2b0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  e );.  assert( i
b2c0: 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42  End <= pPage->pB
b2d0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
b2e0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b2f0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
b300: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
b310: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
b320: 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d  ize>=4 );   /* M
b330: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
b340: 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72   is 4 */.  asser
b350: 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61 73 74  t( iStart<=iLast
b360: 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77 72   );..  /* Overwr
b370: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
b380: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
b390: 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75  os when the secu
b3a0: 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20 6f  re_delete.  ** o
b3b0: 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
b3c0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
b3d0: 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
b3e0: 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
b3f0: 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  TE ){.    memset
b400: 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20  (&data[iStart], 
b410: 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  0, iSize);.  }..
b420: 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f 66    /* The list of
b430: 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74   freeblocks must
b440: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
b450: 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74 68   order.  Find th
b460: 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20  e .  ** spot on 
b470: 74 68 65 20 6c 69 73 74 20 77 68 65 72 65 20 69  the list where i
b480: 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 20  Start should be 
b490: 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20  inserted..  */. 
b4a0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
b4b0: 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72 20  rOffset;.  iPtr 
b4c0: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66 28  = hdr + 1;.  if(
b4d0: 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30   data[iPtr+1]==0
b4e0: 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d   && data[iPtr]==
b4f0: 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42 6c  0 ){.    iFreeBl
b500: 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74  k = 0;  /* Short
b510: 63 75 74 20 66 6f 72 20 74 68 65 20 63 61 73 65  cut for the case
b520: 20 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c 69   when the freeli
b530: 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20  st is empty */. 
b540: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
b550: 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20 67  e( (iFreeBlk = g
b560: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  et2byte(&data[iP
b570: 74 72 5d 29 29 3e 30 20 26 26 20 69 46 72 65 65  tr]))>0 && iFree
b580: 42 6c 6b 3c 69 53 74 61 72 74 20 29 7b 0a 20 20  Blk<iStart ){.  
b590: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
b5a0: 3c 69 50 74 72 2b 34 20 29 20 72 65 74 75 72 6e  <iPtr+4 ) return
b5b0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
b5c0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 50 74 72  BKPT;.      iPtr
b5d0: 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20   = iFreeBlk;.   
b5e0: 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65 65   }.    if( iFree
b5f0: 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65 74 75  Blk>iLast ) retu
b600: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b610: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65  T_BKPT;.    asse
b620: 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50 74  rt( iFreeBlk>iPt
b630: 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30  r || iFreeBlk==0
b640: 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74   );.  .    /* At
b650: 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20   this point:.   
b660: 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b 3a   **    iFreeBlk:
b670: 20 20 20 46 69 72 73 74 20 66 72 65 65 62 6c 6f     First freeblo
b680: 63 6b 20 61 66 74 65 72 20 69 53 74 61 72 74 2c  ck after iStart,
b690: 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65   or zero if none
b6a0: 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72 3a  .    **    iPtr:
b6b0: 20 20 20 20 20 20 20 54 68 65 20 61 64 64 72 65         The addre
b6c0: 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20  ss of a pointer 
b6d0: 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a  iFreeBlk.    **.
b6e0: 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
b6f0: 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20  see if iFreeBlk 
b700: 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73  should be coales
b710: 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ced onto the end
b720: 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20   of iStart..    
b730: 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65 65  */.    if( iFree
b740: 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69  Blk && iEnd+3>=i
b750: 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20  FreeBlk ){.     
b760: 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c   nFrag = iFreeBl
b770: 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20  k - iEnd;.      
b780: 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c  if( iEnd>iFreeBl
b790: 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  k ) return SQLIT
b7a0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b7b0: 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72        iEnd = iFr
b7c0: 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65  eeBlk + get2byte
b7d0: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b  (&data[iFreeBlk+
b7e0: 32 5d 29 3b 0a 20 20 20 20 20 20 69 53 69 7a 65  2]);.      iSize
b7f0: 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74   = iEnd - iStart
b800: 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b  ;.      iFreeBlk
b810: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b820: 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20  a[iFreeBlk]);.  
b830: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
b840: 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72   iPtr is another
b850: 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74   freeblock (that
b860: 20 69 73 2c 20 69 66 20 69 50 74 72 20 69 73 20   is, if iPtr is 
b870: 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69 73 74  not the freelist
b880: 20 70 6f 69 6e 74 65 72 0a 20 20 20 20 2a 2a 20   pointer.    ** 
b890: 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64  in the page head
b8a0: 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74  er) then check t
b8b0: 6f 20 73 65 65 20 69 66 20 69 53 74 61 72 74 20  o see if iStart 
b8c0: 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73  should be coales
b8d0: 63 65 64 20 0a 20 20 20 20 2a 2a 20 6f 6e 74 6f  ced .    ** onto
b8e0: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74 72   the end of iPtr
b8f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
b900: 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20   iPtr>hdr+1 ){. 
b910: 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e 64       int iPtrEnd
b920: 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62 79   = iPtr + get2by
b930: 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32 5d  te(&data[iPtr+2]
b940: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 74  );.      if( iPt
b950: 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20 29  rEnd+3>=iStart )
b960: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  {.        if( iP
b970: 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20 72  trEnd>iStart ) r
b980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b990: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
b9a0: 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74 61     nFrag += iSta
b9b0: 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20  rt - iPtrEnd;.  
b9c0: 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45        iSize = iE
b9d0: 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20 20  nd - iPtr;.     
b9e0: 20 20 20 69 53 74 61 72 74 20 3d 20 69 50 74 72     iStart = iPtr
b9f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ba00: 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e 64 61      if( nFrag>da
ba10: 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65 74 75  ta[hdr+7] ) retu
ba20: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
ba30: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64 61 74 61  T_BKPT;.    data
ba40: 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67  [hdr+7] -= nFrag
ba50: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 74 61  ;.  }.  if( iSta
ba60: 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  rt==get2byte(&da
ba70: 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20  ta[hdr+5]) ){.  
ba80: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66 72 65    /* The new fre
ba90: 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74 68 65  eblock is at the
baa0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
bab0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
bac0: 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a  rea,.    ** so j
bad0: 75 73 74 20 65 78 74 65 6e 64 20 74 68 65 20 63  ust extend the c
bae0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
baf0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 72 65   rather than cre
bb00: 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20  ate another.    
bb10: 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e 74 72  ** freelist entr
bb20: 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74  y */.    if( iPt
bb30: 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72  r!=hdr+1 ) retur
bb40: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bb50: 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75 74 32 62  _BKPT;.    put2b
bb60: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
bb70: 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20  , iFreeBlk);.   
bb80: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
bb90: 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20  hdr+5], iEnd);. 
bba0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
bbb0: 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 66 72  nsert the new fr
bbc0: 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65  eeblock into the
bbd0: 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20   freelist */.   
bbe0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
bbf0: 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a  iPtr], iStart);.
bc00: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
bc10: 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46 72 65  ta[iStart], iFre
bc20: 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62  eBlk);.    put2b
bc30: 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72 74  yte(&data[iStart
bc40: 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d  +2], iSize);.  }
bc50: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
bc60: 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20  += iOrigSize;.  
bc70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
bc80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
bc90: 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
bca0: 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
bcb0: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20   of the header) 
bcc0: 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e  for a page.** an
bcd0: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65  d initialize fie
bce0: 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  lds of the MemPa
bcf0: 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63  ge structure acc
bd00: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ordingly..**.** 
bd10: 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  Only the followi
bd20: 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
bd30: 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20  are supported.  
bd40: 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65  Anything differe
bd50: 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20  nt.** indicates 
bd60: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
bd70: 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  se files:.**.** 
bd80: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
bd90: 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  DATA.**         
bda0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50  PTF_ZERODATA | P
bdb0: 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20  TF_LEAF.**      
bdc0: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
bdd0: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20  | PTF_INTKEY.** 
bde0: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
bdf0: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
be00: 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a  Y | PTF_LEAF.*/.
be10: 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64  static int decod
be20: 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a  eFlags(MemPage *
be30: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42  pPage, int flagB
be40: 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  yte){.  BtShared
be50: 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20   *pBt;     /* A 
be60: 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70  copy of pPage->p
be70: 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  Bt */..  assert(
be80: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
be90: 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t==(pPage->pgno=
bea0: 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b  =1 ? 100 : 0) );
beb0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
bec0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
bed0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
bee0: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61   );.  pPage->lea
bef0: 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74  f = (u8)(flagByt
bf00: 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20  e>>3);  assert( 
bf10: 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33  PTF_LEAF == 1<<3
bf20: 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26   );.  flagByte &
bf30: 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70  = ~PTF_LEAF;.  p
bf40: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
bf50: 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e  ze = 4-4*pPage->
bf60: 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50  leaf;.  pBt = pP
bf70: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
bf80: 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
bf90: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
bfa0: 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50 61  TKEY) ){.    pPa
bfb0: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a  ge->intKey = 1;.
bfc0: 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61      pPage->hasDa
bfd0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66  ta = pPage->leaf
bfe0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
bff0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
c000: 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  Leaf;.    pPage-
c010: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
c020: 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73  >minLeaf;.  }els
c030: 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d  e if( flagByte==
c040: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a  PTF_ZERODATA ){.
c050: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
c060: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
c070: 2d 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a 20  ->hasData = 0;. 
c080: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
c090: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
c0a0: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
c0b0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
c0c0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  inLocal;.  }else
c0d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
c0e0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
c0f0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d  ;.  }.  pPage->m
c100: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
c110: 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
c120: 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20  yload;.  return 
c130: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
c140: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
c150: 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66  he auxiliary inf
c160: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64  ormation for a d
c170: 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  isk block..**.**
c180: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
c190: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  K on success.  I
c1a0: 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68  f we see that th
c1b0: 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e  e page does.** n
c1c0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c  ot contain a wel
c1d0: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
c1e0: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74  e page, then ret
c1f0: 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  urn .** SQLITE_C
c200: 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68  ORRUPT.  Note th
c210: 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  at a return of S
c220: 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f  QLITE_OK does no
c230: 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74  t.** guarantee t
c240: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
c250: 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74  well-formed.  It
c260: 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74   only shows that
c270: 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f  .** we failed to
c280: 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72   detect any corr
c290: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
c2a0: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50  c int btreeInitP
c2b0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
c2c0: 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge){..  assert( 
c2d0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
c2e0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c2f0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
c300: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
c310: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
c320: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74  age->pgno==sqlit
c330: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
c340: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
c350: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
c360: 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50  Page == sqlite3P
c370: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
c380: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
c390: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
c3a0: 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65  >aData == sqlite
c3b0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
c3c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
c3d0: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
c3e0: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31  isInit ){.    u1
c3f0: 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  6 pc;           
c400: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
c410: 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69   freeblock withi
c420: 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
c430: 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20   */.    u8 hdr; 
c440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
c450: 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e  fset to beginnin
c460: 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  g of page header
c470: 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61   */.    u8 *data
c480: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71  ;          /* Eq
c490: 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44  ual to pPage->aD
c4a0: 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61  ata */.    BtSha
c4b0: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
c4c0: 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72   /* The main btr
c4d0: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
c4e0: 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69      int usableSi
c4f0: 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74  ze;    /* Amount
c500: 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65   of usable space
c510: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
c520: 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66  .    u16 cellOff
c530: 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65  set;    /* Offse
c540: 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20  t from start of 
c550: 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65  page to first ce
c560: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
c570: 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
c580: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c590: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f  f unused bytes o
c5a0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
c5b0: 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
c5c0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
c5d0: 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  te of the cell c
c5e0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
c5f0: 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73     int iCellFirs
c600: 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61  t;    /* First a
c610: 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72  llowable cell or
c620: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
c630: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65  t */.    int iCe
c640: 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c  llLast;     /* L
c650: 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c  ast possible cel
c660: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
c670: 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42  ffset */..    pB
c680: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
c690: 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65  .    hdr = pPage
c6a0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
c6b0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
c6c0: 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64 65  Data;.    if( de
c6d0: 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
c6e0: 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65   data[hdr]) ) re
c6f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
c700: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  UPT_BKPT;.    as
c710: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
c720: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
c730: 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
c740: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   );.    pPage->m
c750: 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28  askPage = (u16)(
c760: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
c770: 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  1);.    pPage->n
c780: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
c790: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
c7a0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
c7b0: 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f      pPage->cellO
c7c0: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
c7d0: 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  et = hdr + 12 - 
c7e0: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
c7f0: 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45     pPage->aDataE
c800: 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c  nd = &data[usabl
c810: 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67  eSize];.    pPag
c820: 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64  e->aCellIdx = &d
c830: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b  ata[cellOffset];
c840: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
c850: 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
c860: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50  [hdr+5]);.    pP
c870: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74  age->nCell = get
c880: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
c890: 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  3]);.    if( pPa
c8a0: 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c  ge->nCell>MX_CEL
c8b0: 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  L(pBt) ){.      
c8c0: 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73  /* To many cells
c8d0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61   for a single pa
c8e0: 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75  ge.  The page mu
c8f0: 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f  st be corrupt */
c900: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
c910: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c920: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  T;.    }.    tes
c930: 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43  tcase( pPage->nC
c940: 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74  ell==MX_CELL(pBt
c950: 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d  ) );..    /* A m
c960: 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  alformed databas
c970: 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75  e page might cau
c980: 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70 61  se us to read pa
c990: 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a  st the end.    *
c9a0: 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70  * of page when p
c9b0: 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20  arsing a cell.  
c9c0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
c9d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
c9e0: 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b  ck of code check
c9f0: 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69  s early to see i
ca00: 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73  f a cell extends
ca10: 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
ca20: 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62   end of a page b
ca30: 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73  oundary and caus
ca40: 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  es SQLITE_CORRUP
ca50: 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  T to be .    ** 
ca60: 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64  returned if it d
ca70: 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oes..    */.    
ca80: 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
ca90: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
caa0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43  e->nCell;.    iC
cab0: 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
cac0: 53 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64 65  Size - 4;.#if de
cad0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
cae0: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
caf0: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20  L_CHECK).    {. 
cb00: 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
cb10: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
cb20: 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  into the cell po
cb30: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
cb40: 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20       int sz;    
cb50: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
cb60: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20  f a cell */..   
cb70: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
cb80: 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d  eaf ) iCellLast-
cb90: 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  -;.      for(i=0
cba0: 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
cbb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
cbc0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
cbd0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69  ata[cellOffset+i
cbe0: 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *2]);.        te
cbf0: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
cc00: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20  lFirst );.      
cc10: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
cc20: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
cc30: 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
cc40: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
cc50: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
cc60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
cc70: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
cc80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cc90: 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50    sz = cellSizeP
cca0: 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  tr(pPage, &data[
ccb0: 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  pc]);.        te
ccc0: 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75  stcase( pc+sz==u
ccd0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
cce0: 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75       if( pc+sz>u
ccf0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
cd00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
cd10: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
cd20: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
cd30: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
cd40: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
cd50: 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d  ellLast++;.    }
cd60: 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f    .#endif..    /
cd70: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
cd80: 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
cd90: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
cda0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
cdb0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
cdc0: 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b     nFree = data[
cdd0: 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20  hdr+7] + top;.  
cde0: 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b    while( pc>0 ){
cdf0: 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c  .      u16 next,
ce00: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28   size;.      if(
ce10: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
ce20: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
ce30: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61  {.        /* Sta
ce40: 72 74 20 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b  rt of free block
ce50: 20 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65   is off the page
ce60: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
ce70: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
ce80: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d  T_BKPT; .      }
ce90: 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
cea0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d  t2byte(&data[pc]
ceb0: 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20  );.      size = 
cec0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
ced0: 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  c+2]);.      if(
cee0: 20 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74   (next>0 && next
cef0: 3c 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20  <=pc+size+3) || 
cf00: 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69  pc+size>usableSi
cf10: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ze ){.        /*
cf20: 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73   Free blocks mus
cf30: 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e  t be in ascendin
cf40: 67 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65  g order. And the
cf50: 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20   last byte of.  
cf60: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65        ** the fre
cf70: 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65  e-block must lie
cf80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
cf90: 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
cfa0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
cfb0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
cfc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
cfd0: 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69  ree = nFree + si
cfe0: 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e  ze;.      pc = n
cff0: 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ext;.    }..    
d000: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
d010: 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73  , nFree contains
d020: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
d030: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
d040: 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  art.    ** of th
d050: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
d060: 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d  rea plus the num
d070: 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
d080: 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20  s within.    ** 
d090: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
d0a0: 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69   area. If this i
d0b0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
d0c0: 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20  he usable-size. 
d0d0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67     ** of the pag
d0e0: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  e, then the page
d0f0: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
d100: 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61  ed. This check a
d110: 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65  lso.    ** serve
d120: 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
d130: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
d140: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
d150: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20  cell-content.   
d160: 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64   ** area, accord
d170: 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20  ing to the page 
d180: 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74  header, lies wit
d190: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20  hin the page..  
d1a0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72    */.    if( nFr
d1b0: 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ee>usableSize ){
d1c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
d1d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d1e0: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  T; .    }.    pP
d1f0: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31  age->nFree = (u1
d200: 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c  6)(nFree - iCell
d210: 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67  First);.    pPag
d220: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
d230: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
d240: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
d250: 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67  Set up a raw pag
d260: 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f  e so that it loo
d270: 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61  ks like a databa
d280: 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a  se page holding.
d290: 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a  ** no entries..*
d2a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65  /.static void ze
d2b0: 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  roPage(MemPage *
d2c0: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73  pPage, int flags
d2d0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
d2e0: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
d2f0: 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61  ->aData;.  BtSha
d300: 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
d310: 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20  ->pBt;.  u8 hdr 
d320: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
d330: 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b  et;.  u16 first;
d340: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
d350: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
d360: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
d370: 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e)==pPage->pgno 
d380: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
d390: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
d3a0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
d3b0: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
d3c0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
d3d0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
d3e0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
d3f0: 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20  e) == data );.  
d400: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d410: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
d420: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d430: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
d440: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d450: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
d460: 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
d470: 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
d480: 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65  DELETE ){.    me
d490: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
d4a0: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
d4b0: 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a  ize - hdr);.  }.
d4c0: 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63    data[hdr] = (c
d4d0: 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72  har)flags;.  fir
d4e0: 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61  st = hdr + ((fla
d4f0: 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20  gs&PTF_LEAF)==0 
d500: 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d  ? 12 : 8);.  mem
d510: 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
d520: 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b  , 0, 4);.  data[
d530: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75  hdr+7] = 0;.  pu
d540: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
d550: 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  +5], pBt->usable
d560: 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Size);.  pPage->
d570: 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42  nFree = (u16)(pB
d580: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
d590: 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65  first);.  decode
d5a0: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61  Flags(pPage, fla
d5b0: 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  gs);.  pPage->ce
d5c0: 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74  llOffset = first
d5d0: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
d5e0: 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d  End = &data[pBt-
d5f0: 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  >usableSize];.  
d600: 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
d610: 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a  = &data[first];.
d620: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
d630: 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ow = 0;.  assert
d640: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
d650: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
d660: 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
d670: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
d680: 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
d690: 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
d6a0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
d6b0: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
d6c0: 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 1;.}.../*.**
d6d0: 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67   Convert a DbPag
d6e0: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
d6f0: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61  the pager into a
d700: 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79   MemPage used by
d710: 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61  .** the btree la
d720: 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  yer..*/.static M
d730: 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
d740: 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61  eFromDbPage(DbPa
d750: 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e  ge *pDbPage, Pgn
d760: 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64  o pgno, BtShared
d770: 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
d780: 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  e *pPage = (MemP
d790: 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65  age*)sqlite3Page
d7a0: 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
d7b0: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  e);.  pPage->aDa
d7c0: 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
d7d0: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
d7e0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50  );.  pPage->pDbP
d7f0: 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  age = pDbPage;. 
d800: 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42   pPage->pBt = pB
d810: 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  t;.  pPage->pgno
d820: 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65   = pgno;.  pPage
d830: 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50  ->hdrOffset = pP
d840: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
d850: 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e  00 : 0;.  return
d860: 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a   pPage; .}../*.*
d870: 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
d880: 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e  m the pager.  In
d890: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
d8a0: 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
d8b0: 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
d8c0: 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
d8d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
d8e0: 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73  oContent flag is
d8f0: 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74   set, it means t
d900: 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
d910: 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20  re about.** the 
d920: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
d930: 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
d940: 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20  .  So do not go 
d950: 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74  to the disk.** t
d960: 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74  o fetch the cont
d970: 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ent.  Just fill 
d980: 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  in the content w
d990: 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f  ith zeros for no
d9a0: 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20  w..** If in the 
d9b0: 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73  future we call s
d9c0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
d9d0: 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c  () on this page,
d9e0: 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77   that.** means w
d9f0: 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74  e have started t
da00: 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61  o be concerned a
da10: 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64  bout content and
da20: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61   the disk.** rea
da30: 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61  d should occur a
da40: 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f  t that point..*/
da50: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
da60: 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68  eGetPage(.  BtSh
da70: 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
da80: 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
da90: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
daa0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
dab0: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
dac0: 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
dad0: 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
dae0: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
daf0: 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
db00: 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  meter */.  int f
db10: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
db20: 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  /* PAGER_GET_NOC
db30: 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f  ONTENT or PAGER_
db40: 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a  GET_READONLY */.
db50: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
db60: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
db70: 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
db80: 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41  ==0 || flags==PA
db90: 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
dba0: 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45  T || flags==PAGE
dbb0: 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29  R_GET_READONLY )
dbc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
dbd0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
dbe0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
dbf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
dc00: 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
dc10: 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
dc20: 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
dc30: 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  flags);.  if( rc
dc40: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
dc50: 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50  *ppPage = btreeP
dc60: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
dc70: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
dc80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
dc90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
dca0: 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20  Retrieve a page 
dcb0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63  from the pager c
dcc0: 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71  ache. If the req
dcd0: 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
dce0: 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  ot.** already in
dcf0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
dd00: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e   return NULL. In
dd10: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
dd20: 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
dd30: 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
dd40: 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
dd50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
dd60: 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f  age *btreePageLo
dd70: 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70  okup(BtShared *p
dd80: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
dd90: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
dda0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
ddb0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
ddc0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
ddd0: 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74   pDbPage = sqlit
dde0: 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42  e3PagerLookup(pB
ddf0: 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  t->pPager, pgno)
de00: 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20  ;.  if( pDbPage 
de10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
de20: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
de30: 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
de40: 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74   pBt);.  }.  ret
de50: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
de60: 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
de70: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
de80: 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49  file in pages. I
de90: 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b  f there is any k
dea0: 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c  ind of.** error,
deb0: 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e   return ((unsign
dec0: 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73  ed int)-1)..*/.s
ded0: 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65  tatic Pgno btree
dee0: 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72  Pagecount(BtShar
def0: 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75  ed *pBt){.  retu
df00: 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d  rn pBt->nPage;.}
df10: 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65  .u32 sqlite3Btre
df20: 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20  eLastPage(Btree 
df30: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  *p){.  assert( s
df40: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
df50: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
df60: 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e  sert( ((p->pBt->
df70: 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30  nPage)&0x8000000
df80: 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
df90: 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
dfa0: 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  p->pBt);.}../*.*
dfb0: 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
dfc0: 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20  m the pager and 
dfd0: 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20  initialize it.  
dfe0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
dff0: 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e  just a.** conven
e000: 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72  ience wrapper ar
e010: 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61  ound separate ca
e020: 6c 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74 50  lls to btreeGetP
e030: 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74  age() and .** bt
e040: 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a  reeInitPage()..*
e050: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
e060: 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
e070: 65 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20  e value *ppPage 
e080: 69 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64  is set to is und
e090: 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61  efined. It.** ma
e0a0: 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67  y remain unchang
e0b0: 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65  ed, or it may be
e0c0: 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c   set to an inval
e0d0: 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  id value..*/.sta
e0e0: 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
e0f0: 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
e100: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
e110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e120: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
e130: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e160: 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74   the page to get
e170: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
e180: 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
e190: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
e1a0: 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  he page pointer 
e1b0: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52  here */.  int bR
e1c0: 65 61 64 6f 6e 6c 79 20 20 20 20 20 20 20 20 20  eadonly         
e1d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
e1e0: 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
e1f0: 6f 72 20 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  or 0 */.){.  int
e200: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
e210: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e220: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
e230: 0a 20 20 61 73 73 65 72 74 28 20 62 52 65 61 64  .  assert( bRead
e240: 6f 6e 6c 79 3d 3d 50 41 47 45 52 5f 47 45 54 5f  only==PAGER_GET_
e250: 52 45 41 44 4f 4e 4c 59 20 7c 7c 20 62 52 65 61  READONLY || bRea
e260: 64 6f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 69  donly==0 );..  i
e270: 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67  f( pgno>btreePag
e280: 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
e290: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
e2a0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
e2b0: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62  else{.    rc = b
e2c0: 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
e2d0: 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62   pgno, ppPage, b
e2e0: 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 69  Readonly);.    i
e2f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e300: 20 26 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69   && (*ppPage)->i
e310: 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  sInit==0 ){.    
e320: 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
e330: 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
e340: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
e350: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
e360: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
e370: 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
e380: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73      }.  }..  tes
e390: 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29  tcase( pgno==0 )
e3a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
e3b0: 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  !=0 || rc==SQLIT
e3c0: 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72  E_CORRUPT );.  r
e3d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
e3e0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
e3f0: 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
e400: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
e410: 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
e420: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  .** call to btre
e430: 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  eGetPage..*/.sta
e440: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
e450: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
e460: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
e470: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
e480: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
e490: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
e4a0: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61  ge->pBt );.    a
e4b0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44  ssert( pPage->pD
e4c0: 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20  bPage!=0 );.    
e4d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
e4e0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
e4f0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
e500: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
e510: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
e520: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
e530: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
e540: 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b  =pPage->aData );
e550: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
e560: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e570: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
e580: 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  x) );.    sqlite
e590: 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
e5a0: 6c 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ll(pPage->pDbPag
e5b0: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
e5c0: 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
e5d0: 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
e5e0: 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
e5f0: 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
e600: 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
e610: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
e620: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
e630: 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
e640: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
e650: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
e660: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
e670: 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
e680: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
e690: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
e6a0: 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
e6b0: 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
e6c0: 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
e6d0: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
e6e0: 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
e6f0: 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
e700: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
e710: 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62  id pageReinit(Db
e720: 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20  Page *pData){.  
e730: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
e740: 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
e750: 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
e760: 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29  rGetExtra(pData)
e770: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e780: 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
e790: 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b  ount(pData)>0 );
e7a0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
e7b0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Init ){.    asse
e7c0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
e7d0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
e7e0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
e7f0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
e800: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
e810: 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
e820: 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b  ount(pData)>1 ){
e830: 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20  .      /* pPage 
e840: 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62  might not be a b
e850: 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d  tree page;  it m
e860: 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66  ight be an overf
e870: 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a  low page.      *
e880: 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65  * or ptrmap page
e890: 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e   or a free page.
e8a0: 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73    In those cases
e8b0: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
e8c0: 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f        ** call to
e8d0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
e8e0: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74   will likely ret
e8f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e900: 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74  PT..      ** But
e910: 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65   no harm is done
e920: 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69   by this.  And i
e930: 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74  t is very import
e940: 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a  ant that.      *
e950: 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  * btreeInitPage(
e960: 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65  ) be called on e
e970: 76 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20  very btree page 
e980: 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20  so we make.     
e990: 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72   ** the call for
e9a0: 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
e9b0: 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65   comes in for re
e9c0: 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20  -initing. */.   
e9d0: 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65     btreeInitPage
e9e0: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
e9f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
ea00: 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
ea10: 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e  ler for a btree.
ea20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
ea30: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
ea40: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67  ndler(void *pArg
ea50: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
ea60: 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29  Bt = (BtShared*)
ea70: 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20  pArg;.  assert( 
ea80: 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73  pBt->db );.  ass
ea90: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
eaa0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d  ex_held(pBt->db-
eab0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
eac0: 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b  urn sqlite3Invok
ead0: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42  eBusyHandler(&pB
eae0: 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  t->db->busyHandl
eaf0: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  er);.}../*.** Op
eb00: 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
eb10: 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65  le..** .** zFile
eb20: 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
eb30: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
eb40: 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65   file.  If zFile
eb50: 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20  name is NULL.** 
eb60: 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  then an ephemera
eb70: 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  l database is cr
eb80: 65 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65  eated.  The ephe
eb90: 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d  meral database m
eba0: 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75  ight.** be exclu
ebb0: 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79  sively in memory
ebc0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73  , or it might us
ebd0: 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d  e a disk-based m
ebe0: 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20  emory cache..** 
ebf0: 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
ec00: 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
ec10: 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  se will be autom
ec20: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
ec30: 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65   .** when sqlite
ec40: 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
ec50: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
ec60: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
ec70: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
ec80: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
ec90: 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a  base is created.
eca0: 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d  ** that is autom
ecb0: 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79  atically destroy
ecc0: 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ed when it is cl
ecd0: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
ece0: 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65  "flags" paramete
ecf0: 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74  r is a bitmask t
ed00: 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  hat might contai
ed10: 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42  n bits like.** B
ed20: 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  TREE_OMIT_JOURNA
ed30: 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d  L and/or BTREE_M
ed40: 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  EMORY..**.** If 
ed50: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
ed60: 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
ed70: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
ed80: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
ed90: 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
eda0: 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
edb0: 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
edc0: 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
edd0: 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
ede0: 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
edf0: 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
ee00: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
ee10: 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
ee20: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
ee30: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
ee40: 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
ee50: 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
ee60: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
ee70: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
ee80: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
ee90: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
eea0: 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20  fs,      /* VFS 
eeb0: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
eec0: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73  b-tree */.  cons
eed0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
eee0: 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
eef0: 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
ef00: 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
ef10: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
ef20: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
ef30: 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
ef40: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
ef50: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
ef60: 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a  Btree,        /*
ef70: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
ef80: 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
ef90: 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tten here */.  i
efa0: 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
efb0: 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
efc0: 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  s */.  int vfsFl
efd0: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
efe0: 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
eff0: 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
f000: 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
f010: 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
f020: 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pBt = 0;        
f030: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
f040: 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
f050: 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
f060: 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
f070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
f080: 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  ndle to return *
f090: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
f0a0: 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30  x *mutexOpen = 0
f0b0: 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61  ;  /* Prevents a
f0c0: 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e   race condition.
f0d0: 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f   Ticket #3537 */
f0e0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
f0f0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
f100: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
f110: 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
f120: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73  ion */.  u8 nRes
f130: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
f140: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
f150: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  of unused space 
f160: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
f170: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
f180: 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20  zDbHeader[100]; 
f190: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61   /* Database hea
f1a0: 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  der content */..
f1b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65    /* True if ope
f1c0: 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ning an ephemera
f1d0: 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  l, temporary dat
f1e0: 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  abase */.  const
f1f0: 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20   int isTempDb = 
f200: 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
f210: 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b  zFilename[0]==0;
f220: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
f230: 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
f240: 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
f250: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
f260: 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
f270: 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
f280: 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ed database..  *
f290: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
f2a0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
f2b0: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
f2c0: 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63  b = 0;.#else.  c
f2d0: 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
f2e0: 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26   = (zFilename &&
f2f0: 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
f300: 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  e, ":memory:")==
f310: 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
f320: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73            || (is
f330: 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65  TempDb && sqlite
f340: 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62  3TempInMemory(db
f350: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
f360: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66            || (vf
f370: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
f380: 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b  OPEN_MEMORY)!=0;
f390: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
f3a0: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
f3b0: 73 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b  sert( pVfs!=0 );
f3c0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f3d0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
f3e0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
f3f0: 73 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66  sert( (flags&0xf
f400: 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f  f)==flags );   /
f410: 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38  * flags fit in 8
f420: 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   bits */..  /* O
f430: 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47  nly a BTREE_SING
f440: 4c 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  LE database can 
f450: 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  be BTREE_UNORDER
f460: 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ED */.  assert( 
f470: 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55  (flags & BTREE_U
f480: 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20  NORDERED)==0 || 
f490: 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53  (flags & BTREE_S
f4a0: 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20  INGLE)!=0 );..  
f4b0: 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c  /* A BTREE_SINGL
f4c0: 45 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  E database is al
f4d0: 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79  ways a temporary
f4e0: 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61   and/or ephemera
f4f0: 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  l */.  assert( (
f500: 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
f510: 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65  NGLE)==0 || isTe
f520: 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69  mpDb );..  if( i
f530: 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c  sMemdb ){.    fl
f540: 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d  ags |= BTREE_MEM
f550: 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  ORY;.  }.  if( (
f560: 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
f570: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21  E_OPEN_MAIN_DB)!
f580: 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c  =0 && (isMemdb |
f590: 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20  | isTempDb) ){. 
f5a0: 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76     vfsFlags = (v
f5b0: 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54  fsFlags & ~SQLIT
f5c0: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20  E_OPEN_MAIN_DB) 
f5d0: 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  | SQLITE_OPEN_TE
f5e0: 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d  MP_DB;.  }.  p =
f5f0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
f600: 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29  ro(sizeof(Btree)
f610: 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
f620: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f630: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d  _NOMEM;.  }.  p-
f640: 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
f650: 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d  _NONE;.  p->db =
f660: 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   db;.#ifndef SQL
f670: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
f680: 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e  CACHE.  p->lock.
f690: 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d  pBtree = p;.  p-
f6a0: 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31  >lock.iTable = 1
f6b0: 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ;.#endif..#if !d
f6c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f6d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
f6e0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
f6f0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
f700: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
f710: 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
f720: 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
f730: 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
f740: 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
f750: 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
f760: 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
f770: 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
f780: 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44  */.  if( isTempD
f790: 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  b==0 && (isMemdb
f7a0: 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73  ==0 || (vfsFlags
f7b0: 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  &SQLITE_OPEN_URI
f7c0: 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28  )!=0) ){.    if(
f7d0: 20 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49   vfsFlags & SQLI
f7e0: 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
f7f0: 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  CHE ){.      int
f800: 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   nFullPathname =
f810: 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
f820: 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20  e+1;.      char 
f830: 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d  *zFullPathname =
f840: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e   sqlite3Malloc(n
f850: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
f860: 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
f870: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
f880: 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a  *mutexShared; ).
f890: 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
f8a0: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  e = 1;.      if(
f8b0: 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   !zFullPathname 
f8c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
f8d0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
f8e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f8f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
f900: 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d  .      if( isMem
f910: 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  db ){.        me
f920: 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61  mcpy(zFullPathna
f930: 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73  me, zFilename, s
f940: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
f950: 46 69 6c 65 6e 61 6d 65 29 2b 31 29 3b 0a 20 20  Filename)+1);.  
f960: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f970: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
f980: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
f990: 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  fs, zFilename,. 
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9c0: 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c    nFullPathname,
f9d0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
f9e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
f9f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
fa00: 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
fa10: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
fa20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
fa30: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
fa40: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
fa50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20    }.      }.#if 
fa60: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
fa70: 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65  E.      mutexOpe
fa80: 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  n = sqlite3Mutex
fa90: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
faa0: 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b  EX_STATIC_OPEN);
fab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
fac0: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
fad0: 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74  Open);.      mut
fae0: 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
faf0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
fb00: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
fb10: 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
fb20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
fb30: 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
fb40: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66  ;.#endif.      f
fb50: 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74  or(pBt=GLOBAL(Bt
fb60: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
fb70: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
fb80: 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
fb90: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61  Next){.        a
fba0: 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
fbb0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
fbc0: 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
fbd0: 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
fbe0: 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
fbf0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29  pBt->pPager, 0))
fc00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fc10: 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
fc20: 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72  rVfs(pBt->pPager
fc30: 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20  )==pVfs ){.     
fc40: 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
fc50: 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d          for(iDb=
fc60: 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d  db->nDb-1; iDb>=
fc70: 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20  0; iDb--){.     
fc80: 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45         Btree *pE
fc90: 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44  xisting = db->aD
fca0: 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
fcb0: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69          if( pExi
fcc0: 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69  sting && pExisti
fcd0: 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a  ng->pBt==pBt ){.
fce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
fcf0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
fd00: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
fd20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
fd30: 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
fd50: 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
fd60: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
fd70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
fd80: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
fd90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fda0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
fdb0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
fdc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fdd0: 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
fde0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d  ;.          pBt-
fdf0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
fe00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
fe10: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
fe20: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
fe30: 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
fe40: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
fe50: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
fe60: 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  name);.    }.#if
fe70: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
fe80: 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
fe90: 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64   /* In debug mod
fea0: 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70  e, we mark all p
feb0: 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
fec0: 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a  ses as sharable.
fed0: 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68        ** even wh
fee0: 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e  en they are not.
fef0: 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73    This exercises
ff00: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64   the locking cod
ff10: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67  e and.      ** g
ff20: 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74  ives more opport
ff30: 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74  unity for assert
ff40: 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  s(sqlite3_mutex_
ff50: 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a  held()).      **
ff60: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66   statements to f
ff70: 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62  ind locking prob
ff80: 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lems..      */. 
ff90: 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
ffa0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
ffb0: 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
ffc0: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
ffd0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
ffe0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
fff0: 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
10000 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64   structures used
10010 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72   by the btree ar
10020 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  e.    ** the rig
10030 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69  ht size.  This i
10040 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e  s to guard again
10050 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  st size changes 
10060 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20  that result.    
10070 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
10080 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  g on a different
10090 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20   architecture.. 
100a0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
100b0 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38  ( sizeof(i64)==8
100c0 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d   || sizeof(i64)=
100d0 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
100e0 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38  ( sizeof(u64)==8
100f0 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d   || sizeof(u64)=
10100 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
10110 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34  ( sizeof(u32)==4
10120 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
10130 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29  sizeof(u16)==2 )
10140 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
10150 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b  zeof(Pgno)==4 );
10160 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71  .  .    pBt = sq
10170 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
10180 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b   sizeof(*pBt) );
10190 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20  .    if( pBt==0 
101a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
101b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
101c0 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
101d0 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
101e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
101f0 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42  erOpen(pVfs, &pB
10200 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65  t->pPager, zFile
10210 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10230 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67  EXTRA_SIZE, flag
10240 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67  s, vfsFlags, pag
10250 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66  eReinit);.    if
10260 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10270 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10280 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
10290 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64  t(pBt->pPager, d
102a0 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20  b->szMmap);.    
102b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
102c0 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
102d0 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69  r(pBt->pPager,si
102e0 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c  zeof(zDbHeader),
102f0 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20  zDbHeader);.    
10300 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
10310 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10320 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
10330 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
10340 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  pBt->openFlags =
10350 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20   (u8)flags;.    
10360 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  pBt->db = db;.  
10370 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
10380 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74  tBusyhandler(pBt
10390 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49  ->pPager, btreeI
103a0 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
103b0 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70  , pBt);.    p->p
103c0 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20  Bt = pBt;.  .   
103d0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
103e0 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  0;.    pBt->pPag
103f0 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  e1 = 0;.    if( 
10400 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
10410 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
10420 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  er) ) pBt->btsFl
10430 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
10440 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c  ONLY;.#ifdef SQL
10450 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
10460 45 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c  E.    pBt->btsFl
10470 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52  ags |= BTS_SECUR
10480 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66  E_DELETE;.#endif
10490 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
104a0 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b  ze = (zDbHeader[
104b0 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65  16]<<8) | (zDbHe
104c0 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20  ader[17]<<16);. 
104d0 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65     if( pBt->page
104e0 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d  Size<512 || pBt-
104f0 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  >pageSize>SQLITE
10500 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20  _MAX_PAGE_SIZE. 
10510 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74          || ((pBt
10520 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42  ->pageSize-1)&pB
10530 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20  t->pageSize)!=0 
10540 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ){.      pBt->pa
10550 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e  geSize = 0;.#ifn
10560 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10570 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
10580 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63   /* If the magic
10590 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22   name ":memory:"
105a0 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20   will create an 
105b0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
105c0 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  se, then.      *
105d0 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f  * leave the auto
105e0 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30  Vacuum mode at 0
105f0 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61   (do not auto-va
10600 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20  cuum), even if. 
10610 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44       ** SQLITE_D
10620 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
10630 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68  M is true. On th
10640 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
10650 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
10660 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68  _OMIT_MEMORYDB h
10670 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c  as been defined,
10680 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22   then ":memory:"
10690 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20   is just a.     
106a0 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65   ** regular file
106b0 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63  -name. In this c
106c0 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ase the auto-vac
106d0 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70  uum applies as p
106e0 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20  er normal..     
106f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46   */.      if( zF
10700 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65  ilename && !isMe
10710 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mdb ){.        p
10720 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
10730 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
10740 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20  _AUTOVACUUM ? 1 
10750 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42  : 0);.        pB
10760 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
10770 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
10780 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20  AUTOVACUUM==2 ? 
10790 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  1 : 0);.      }.
107a0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65  #endif.      nRe
107b0 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  serve = 0;.    }
107c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73  else{.      nRes
107d0 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72  erve = zDbHeader
107e0 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d  [20];.      pBt-
107f0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
10800 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
10810 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10820 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
10830 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
10840 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
10850 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
10860 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
10870 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
10880 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
10890 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
108a0 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
108b0 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  if.    }.    rc 
108c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
108d0 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
108e0 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
108f0 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29  eSize, nReserve)
10900 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
10910 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
10920 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ut;.    pBt->usa
10930 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
10940 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72  ageSize - nReser
10950 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ve;.    assert( 
10960 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  (pBt->pageSize &
10970 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d   7)==0 );  /* 8-
10980 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  byte alignment o
10990 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20  f pageSize */.  
109a0 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53   .#if !defined(S
109b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
109c0 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
109d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
109e0 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20  _DISKIO).    /* 
109f0 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68  Add the new BtSh
10a00 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74  ared object to t
10a10 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
10a20 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64  harable BtShared
10a30 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
10a40 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
10a50 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
10a60 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
10a70 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
10a80 29 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65  ).      pBt->nRe
10a90 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54  f = 1;.      MUT
10aa0 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53  EX_LOGIC( mutexS
10ab0 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
10ac0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
10ad0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
10ae0 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66  STER);).      if
10af0 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
10b00 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c  AFE && sqlite3Gl
10b10 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
10b20 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
10b30 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71   pBt->mutex = sq
10b40 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
10b50 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
10b60 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
10b70 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  pBt->mutex==0 ){
10b80 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
10b90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
10ba0 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c          db->mall
10bb0 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  ocFailed = 0;.  
10bc0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72          goto btr
10bd0 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
10be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10bf0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
10c00 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
10c10 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74  ared);.      pBt
10c20 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c  ->pNext = GLOBAL
10c30 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
10c40 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
10c50 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c  t);.      GLOBAL
10c60 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
10c70 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
10c80 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  t) = pBt;.      
10c90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10ca0 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
10cb0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
10cc0 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
10cd0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
10ce0 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
10cf0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
10d00 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
10d10 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
10d20 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
10d30 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
10d40 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
10d50 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
10d60 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
10d70 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
10d80 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
10d90 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
10da0 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
10db0 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
10dc0 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
10dd0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
10de0 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
10df0 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
10e00 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
10e10 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
10e20 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
10e30 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
10e40 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
10e50 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
10e60 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
10e70 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
10e80 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
10e90 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
10ea0 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29  >pBt<pSib->pBt )
10eb0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
10ec0 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
10ed0 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
10ee0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
10ef0 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
10f00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
10f10 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
10f20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70  pSib->pNext && p
10f30 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c  Sib->pNext->pBt<
10f40 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  p->pBt ){.      
10f50 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69        pSib = pSi
10f60 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
10f70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
10f80 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d  p->pNext = pSib-
10f90 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
10fa0 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69    p->pPrev = pSi
10fb0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
10fc0 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
10fd0 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
10fe0 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  t->pPrev = p;.  
10ff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11000 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20      pSib->pNext 
11010 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = p;.        }. 
11020 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11030 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11040 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65  #endif.  *ppBtre
11050 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70  e = p;..btree_op
11060 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  en_out:.  if( rc
11070 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11080 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42     if( pBt && pB
11090 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  t->pPager ){.   
110a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
110b0 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
110c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
110d0 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
110e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
110f0 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65  (p);.    *ppBtre
11100 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
11110 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d      /* If the B-
11120 54 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73  Tree was success
11130 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65  fully opened, se
11140 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  t the pager-cach
11150 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20  e size to the.  
11160 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c    ** default val
11170 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e  ue. Except, when
11180 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65   opening on an e
11190 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70  xisting shared p
111a0 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20  ager-cache,.    
111b0 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65  ** do not change
111c0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
111d0 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
111e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
111f0 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30  eeSchema(p, 0, 0
11200 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
11210 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
11220 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70  hesize(p->pBt->p
11230 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45  Pager, SQLITE_DE
11240 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
11250 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
11260 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a  f( mutexOpen ){.
11270 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
11280 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d  te3_mutex_held(m
11290 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20  utexOpen) );.   
112a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
112b0 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
112c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
112d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
112e0 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65  ment the BtShare
112f0 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20  d.nRef counter. 
11300 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
11310 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65   zero,.** remove
11320 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
11330 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
11340 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20   sharing list.  
11350 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
11360 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  f the BtShared.n
11370 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63  Ref counter reac
11380 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74  hes zero and ret
11390 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20  urn.** false if 
113a0 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69  it is still posi
113b0 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tive..*/.static 
113c0 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68  int removeFromSh
113d0 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72  aringList(BtShar
113e0 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65  ed *pBt){.#ifnde
113f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
11400 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54  ARED_CACHE.  MUT
11410 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
11420 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
11430 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ; ).  BtShared *
11440 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d  pList;.  int rem
11450 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73  oved = 0;..  ass
11460 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11470 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e  ex_notheld(pBt->
11480 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45  mutex) );.  MUTE
11490 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72  X_LOGIC( pMaster
114a0 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
114b0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
114c0 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
114d0 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ; ).  sqlite3_mu
114e0 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
114f0 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d  r);.  pBt->nRef-
11500 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52  -;.  if( pBt->nR
11510 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ef<=0 ){.    if(
11520 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
11530 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
11540 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29  acheList)==pBt )
11550 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  {.      GLOBAL(B
11560 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
11570 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
11580 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
11590 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
115a0 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pList = GLOBAL(B
115b0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
115c0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
115d0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41  ;.      while( A
115e0 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20  LWAYS(pList) && 
115f0 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42  pList->pNext!=pB
11600 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  t ){.        pLi
11610 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b  st=pList->pNext;
11620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11630 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  f( ALWAYS(pList)
11640 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
11650 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  t->pNext = pBt->
11660 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
11670 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c     }.    if( SQL
11680 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29  ITE_THREADSAFE )
11690 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
116a0 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e  mutex_free(pBt->
116b0 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20  mutex);.    }.  
116c0 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20    removed = 1;. 
116d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
116e0 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
116f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f  );.  return remo
11700 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  ved;.#else.  ret
11710 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 1;.#endif.}.
11720 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
11730 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
11740 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c  points to an all
11750 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d  ocation of .** M
11760 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
11770 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
11780 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54  c void allocateT
11790 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
117a0 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21  d *pBt){.  if( !
117b0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
117c0 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
117d0 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
117e0 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
117f0 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  ageSize );..    
11800 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73  /* One of the us
11810 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53  es of pBt->pTmpS
11820 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61  pace is to forma
11830 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20  t cells before. 
11840 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20     ** inserting 
11850 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66  them into a leaf
11860 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20   page (function 
11870 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49  fillInCell()). I
11880 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20  f.    ** a cell 
11890 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  is less than 4 b
118a0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74  ytes in size, it
118b0 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74   is rounded up t
118c0 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a  o 4 bytes.    **
118d0 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20   by the various 
118e0 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61  routines that ma
118f0 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20  nipulate binary 
11900 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20  cells. Which.   
11910 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61   ** can mean tha
11920 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  t fillInCell() o
11930 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  nly initializes 
11940 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33  the first 2 or 3
11950 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
11960 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20   pTmpSpace, but 
11970 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34  that the first 4
11980 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65   bytes are copie
11990 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74  d from.    ** it
119a0 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65   into a database
119b0 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e   page. This is n
119c0 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72  ot actually a pr
119d0 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20  oblem, but it.  
119e0 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20    ** does cause 
119f0 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  a valgrind error
11a00 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32   when the 1 or 2
11a10 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61   bytes of unitia
11a20 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61  lized .    ** da
11a30 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ta is passed to 
11a40 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74  system call writ
11a50 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64  e(). So to avoid
11a60 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20   this error,.   
11a70 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72   ** zero the fir
11a80 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65  st 4 bytes of te
11a90 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 20 20  mp space here.  
11aa0 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  */.    if( pBt->
11ab0 70 54 6d 70 53 70 61 63 65 20 29 20 6d 65 6d 73  pTmpSpace ) mems
11ac0 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  et(pBt->pTmpSpac
11ad0 65 2c 20 30 2c 20 34 29 3b 0a 20 20 7d 0a 7d 0a  e, 0, 4);.  }.}.
11ae0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
11af0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61  pBt->pTmpSpace a
11b00 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  llocation.*/.sta
11b10 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d  tic void freeTem
11b20 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
11b30 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
11b40 50 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70  PageFree( pBt->p
11b50 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74  TmpSpace);.  pBt
11b60 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b  ->pTmpSpace = 0;
11b70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
11b80 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  an open database
11b90 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20   and invalidate 
11ba0 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a  all cursors..*/.
11bb0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
11bc0 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b  Close(Btree *p){
11bd0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
11be0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43   = p->pBt;.  BtC
11bf0 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20  ursor *pCur;..  
11c00 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  /* Close all cur
11c10 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20  sors opened via 
11c20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f  this handle.  */
11c30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11c40 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
11c50 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
11c60 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
11c70 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20  er(p);.  pCur = 
11c80 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
11c90 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20  while( pCur ){. 
11ca0 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d     BtCursor *pTm
11cb0 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43  p = pCur;.    pC
11cc0 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  ur = pCur->pNext
11cd0 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e  ;.    if( pTmp->
11ce0 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20  pBtree==p ){.   
11cf0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
11d00 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29  loseCursor(pTmp)
11d10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11d20 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61  * Rollback any a
11d30 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
11d40 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68  n and free the h
11d50 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e  andle structure.
11d60 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74  .  ** The call t
11d70 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  o sqlite3BtreeRo
11d80 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61  llback() drops a
11d90 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68  ny table-locks h
11da0 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73  eld by.  ** this
11db0 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20   handle..  */.  
11dc0 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
11dd0 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f  back(p, SQLITE_O
11de0 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K);.  sqlite3Btr
11df0 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f  eeLeave(p);..  /
11e00 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
11e10 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
11e20 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
11e30 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
11e40 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
11e50 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
11e60 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
11e70 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
11e80 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
11e90 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
11ea0 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
11eb0 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
11ec0 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64  ==0 && p->locked
11ed0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d  ==0 );.  if( !p-
11ee0 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d  >sharable || rem
11ef0 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
11f00 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  st(pBt) ){.    /
11f10 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20  * The pBt is no 
11f20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68  longer on the sh
11f30 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77  aring list, so w
11f40 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20  e can access.   
11f50 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68   ** it without h
11f60 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68  aving to hold th
11f70 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a  e mutex..    **.
11f80 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74      ** Clean out
11f90 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
11fa0 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  BtShared object.
11fb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
11fc0 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
11fd0 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
11fe0 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
11ff0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
12000 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
12010 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
12020 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  a ){.      pBt->
12030 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d  xFreeSchema(pBt-
12040 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
12050 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
12060 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65  ee(0, pBt->pSche
12070 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ma);.    freeTem
12080 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
12090 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
120a0 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
120b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
120c0 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65  RED_CACHE.  asse
120d0 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
120e0 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  k==0 );.  assert
120f0 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  ( p->locked==0 )
12100 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
12110 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65   ) p->pPrev->pNe
12120 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
12130 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20   if( p->pNext ) 
12140 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
12150 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64  = p->pPrev;.#end
12160 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  if..  sqlite3_fr
12170 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
12180 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12190 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
121a0 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
121b0 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f  er of pages allo
121c0 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  wed in the cache
121d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ..**.** The maxi
121e0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  mum number of ca
121f0 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74  che pages is set
12200 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65   to the absolute
12210 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  .** value of mxP
12220 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20  age.  If mxPage 
12230 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
12240 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f   pager will.** o
12250 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e  perate asynchron
12260 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20  ously - it will 
12270 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66  not stop to do f
12280 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e  sync()s.** to in
12290 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69  sure data is wri
122a0 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b  tten to the disk
122b0 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a   surface before.
122c0 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20  ** continuing.  
122d0 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69  Transactions sti
122e0 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68  ll work if synch
122f0 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a  ronous is off,.*
12300 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
12310 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72  se cannot be cor
12320 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70  rupted if this p
12330 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65  rogram.** crashe
12340 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f  s.  But if the o
12350 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
12360 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65  crashes or there
12370 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74   is.** an abrupt
12380 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
12390 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  hen synchronous 
123a0 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61  is off, the data
123b0 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65  base.** could be
123c0 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
123d0 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72  nsistent and unr
123e0 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65  ecoverable state
123f0 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73  ..** Synchronous
12400 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
12410 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f  t so database co
12420 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  rruption is not.
12430 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f  ** normally a wo
12440 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rry..*/.int sqli
12450 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
12460 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
12470 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
12480 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
12490 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
124a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
124b0 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
124c0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
124d0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
124e0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
124f0 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
12500 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
12510 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12520 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
12530 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
12540 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
12550 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61  SIZE>0./*.** Cha
12560 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
12570 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
12580 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12590 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20   that may be.** 
125a0 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a  memory mapped..*
125b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
125c0 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42  eeSetMmapLimit(B
125d0 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  tree *p, sqlite3
125e0 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a  _int64 szMmap){.
125f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
12600 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
12610 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12620 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
12630 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
12640 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12650 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
12660 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e  tMmapLimit(pBt->
12670 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b  pPager, szMmap);
12680 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12690 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
126a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
126b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
126c0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
126d0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  */../*.** Change
126e0 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
126f0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
12700 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
12710 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
12720 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
12730 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
12740 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
12750 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
12760 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
12770 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
12780 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
12790 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
127a0 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
127b0 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
127c0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
127d0 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
127e0 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
127f0 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
12800 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
12810 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
12820 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
12830 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
12840 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
12850 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
12860 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
12870 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
12880 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
12890 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
128a0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
128b0 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
128c0 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67  treeSetPagerFlag
128d0 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  s(.  Btree *p,  
128e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
128f0 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20  he btree to set 
12900 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  the safety level
12910 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65   on */.  unsigne
12920 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 20  d pgFlags       
12930 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45 52  /* Various PAGER
12940 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  _* flags */.){. 
12950 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12960 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
12970 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12980 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
12990 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
129a0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
129b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
129c0 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65  Flags(pBt->pPage
129d0 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73  r, pgFlags);.  s
129e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
129f0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
12a00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
12a10 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
12a20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
12a30 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74  n btree is set t
12a40 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31  o safety level 1
12a50 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77  .  In other.** w
12a60 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
12a70 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f  E if no sync() o
12a80 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73  ccurs on the dis
12a90 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  k files..*/.int 
12aa0 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
12ab0 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a  Disabled(Btree *
12ac0 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
12ad0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
12ae0 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
12af0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
12b00 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
12b10 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65  x) );  .  sqlite
12b20 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12b30 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26    assert( pBt &&
12b40 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a   pBt->pPager );.
12b50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
12b60 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70  gerNosync(pBt->p
12b70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  Pager);.  sqlite
12b80 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12b90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12ba0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
12bb0 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
12bc0 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
12bd0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
12be0 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
12bf0 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67  * Or, if the pag
12c00 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61  e size has alrea
12c10 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72  dy been fixed, r
12c20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
12c30 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75  DONLY .** withou
12c40 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68  t changing anyth
12c50 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ing..**.** The p
12c60 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  age size must be
12c70 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65   a power of 2 be
12c80 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
12c90 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67  536.  If the pag
12ca0 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69  e.** size suppli
12cb0 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74  ed does not meet
12cc0 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
12cd0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73   then the page s
12ce0 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68  ize is not.** ch
12cf0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  anged..**.** Pag
12d00 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73  e sizes are cons
12d10 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20  trained to be a 
12d20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20  power of two so 
12d30 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a  that the region.
12d40 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
12d50 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  se file used for
12d60 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e   locking (beginn
12d70 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42  ing at PENDING_B
12d80 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73  YTE,.** the firs
12d90 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
12da0 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78  1GB boundary, 0x
12db0 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20  40000000) needs 
12dc0 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74  to occur.** at t
12dd0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
12de0 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
12df0 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65   parameter nRese
12e00 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  rve is less than
12e10 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
12e20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
12e30 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20  ed.** bytes per 
12e40 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63  page is left unc
12e50 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
12e60 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65   the iFix!=0 the
12e70 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49  n the BTS_PAGESI
12e80 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73  ZE_FIXED flag is
12e90 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65   set so that the
12ea0 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e   page size.** an
12eb0 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64  d autovacuum mod
12ec0 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
12ed0 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69  be changed..*/.i
12ee0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
12ef0 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
12f00 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
12f10 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c  e, int nReserve,
12f20 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e   int iFix){.  in
12f30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12f40 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
12f50 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
12f60 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
12f70 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  -1 && nReserve<=
12f80 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  255 );.  sqlite3
12f90 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
12fa0 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
12fb0 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
12fc0 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73  E_FIXED ){.    s
12fd0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12fe0 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
12ff0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
13000 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65  .  }.  if( nRese
13010 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65  rve<0 ){.    nRe
13020 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67  serve = pBt->pag
13030 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
13040 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61  bleSize;.  }.  a
13050 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
13060 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  =0 && nReserve<=
13070 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67  255 );.  if( pag
13080 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
13090 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
130a0 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a  AX_PAGE_SIZE &&.
130b0 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69          ((pageSi
130c0 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d  ze-1)&pageSize)=
130d0 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
130e0 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
130f0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
13100 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20  t( !pBt->pPage1 
13110 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  && !pBt->pCursor
13120 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   );.    pBt->pag
13130 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67  eSize = (u32)pag
13140 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54  eSize;.    freeT
13150 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
13160 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
13170 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
13180 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
13190 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
131a0 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d  Reserve);.  pBt-
131b0 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
131c0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75  t->pageSize - (u
131d0 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69  16)nReserve;.  i
131e0 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62  f( iFix ) pBt->b
131f0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
13200 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20  AGESIZE_FIXED;. 
13210 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
13220 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
13230 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
13240 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  urn the currentl
13250 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73  y defined page s
13260 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ize.*/.int sqlit
13270 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
13280 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ze(Btree *p){.  
13290 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
132a0 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20  ageSize;.}..#if 
132b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
132c0 41 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66  AS_CODEC) || def
132d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
132e0 47 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  G)./*.** This fu
132f0 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61  nction is simila
13300 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  r to sqlite3Btre
13310 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20 65  eGetReserve(), e
13320 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a  xcept that it.**
13330 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
13340 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61  led if it is gua
13350 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
13360 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
13370 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64   already.** held
13380 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
13390 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70  useful in one sp
133a0 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68  ecial case in th
133b0 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64  e backup API cod
133c0 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a  e where it is.**
133d0 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20   known that the 
133e0 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75  shared b-tree mu
133f0 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74  tex is held, but
13400 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68   the mutex on th
13410 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  e .** database h
13420 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20  andle that owns 
13430 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68  *p is not. In th
13440 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69 74  is case if sqlit
13450 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a  e3BtreeEnter().*
13460 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c  * were to be cal
13470 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f  led, it might co
13480 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20  llide with some 
13490 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20  other operation 
134a0 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
134b0 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f  se handle that o
134c0 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20  wns *p, causing 
134d0 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 69  undefined behavi
134e0 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
134f0 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
13500 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a  eNoMutex(Btree *
13510 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
13520 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
13530 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  (p->pBt->mutex) 
13540 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  );.  return p->p
13550 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
13560 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
13570 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  e;.}.#endif /* S
13580 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 20  QLITE_HAS_CODEC 
13590 7c 7c 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  || SQLITE_DEBUG 
135a0 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
135b0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
135c0 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
135d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
135e0 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a  MIT_VACUUM)./*.*
135f0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
13600 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
13610 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
13620 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74   of every page t
13630 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  hat.** are inten
13640 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73  tually left unus
13650 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
13660 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63   "reserved" spac
13670 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d  e that is.** som
13680 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65  etimes used by e
13690 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e  xtensions..*/.in
136a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
136b0 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  tReserve(Btree *
136c0 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  p){.  int n;.  s
136d0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
136e0 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42  (p);.  n = p->pB
136f0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
13700 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
13710 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13720 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
13730 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
13740 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  et the maximum p
13750 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  age count for a 
13760 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61  database if mxPa
13770 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a  ge is positive..
13780 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  ** No changes ar
13790 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65  e made if mxPage
137a0 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76   is 0 or negativ
137b0 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  e..** Regardless
137c0 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
137d0 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
137e0 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
137f0 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
13800 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61  qlite3BtreeMaxPa
13810 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70  geCount(Btree *p
13820 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
13830 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
13840 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
13850 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67    n = sqlite3Pag
13860 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70  erMaxPageCount(p
13870 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  ->pBt->pPager, m
13880 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
13890 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
138a0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
138b0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53  *.** Set the BTS
138c0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66  _SECURE_DELETE f
138d0 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69  lag if newFlag i
138e0 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65  s 0 or 1.  If ne
138f0 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20  wFlag is -1,.** 
13900 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61  then make no cha
13910 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65  nges.  Always re
13920 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
13930 66 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  f the BTS_SECURE
13940 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69  _DELETE.** setti
13950 6e 67 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ng after the cha
13960 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nge..*/.int sqli
13970 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
13980 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69  lete(Btree *p, i
13990 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69  nt newFlag){.  i
139a0 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt b;.  if( p==0
139b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
139c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
139d0 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c  (p);.  if( newFl
139e0 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ag>=0 ){.    p->
139f0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
13a00 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c   ~BTS_SECURE_DEL
13a10 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77  ETE;.    if( new
13a20 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62  Flag ) p->pBt->b
13a30 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53  tsFlags |= BTS_S
13a40 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
13a50 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74  } .  b = (p->pBt
13a60 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
13a70 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21  _SECURE_DELETE)!
13a80 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  =0;.  sqlite3Btr
13a90 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
13aa0 74 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66  turn b;.}.#endif
13ab0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
13ac0 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
13ad0 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69  RAGMAS) || !defi
13ae0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13af0 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a  VACUUM) */../*.*
13b00 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75  * Change the 'au
13b10 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
13b20 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  rty of the datab
13b30 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74  ase. If the 'aut
13b40 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61  oVacuum'.** para
13b50 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
13b60 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63  o, then auto-vac
13b70 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62  uum mode is enab
13b80 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74  led. If zero, it
13b90 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e  .** is disabled.
13ba0 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
13bb0 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d  ue for the auto-
13bc0 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20  vacuum property 
13bd0 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  is .** determine
13be0 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
13bf0 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
13c00 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74  UM macro..*/.int
13c10 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
13c20 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
13c30 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63   *p, int autoVac
13c40 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  uum){.#ifdef SQL
13c50 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
13c60 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  UUM.  return SQL
13c70 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65  ITE_READONLY;.#e
13c80 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a  lse.  BtShared *
13c90 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
13ca0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13cb0 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75  OK;.  u8 av = (u
13cc0 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20  8)autoVacuum;.. 
13cd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
13ce0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42  er(p);.  if( (pB
13cf0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
13d00 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
13d10 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30  )!=0 && (av ?1:0
13d20 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  )!=pBt->autoVacu
13d30 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
13d40 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
13d50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
13d60 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61  ->autoVacuum = a
13d70 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d  v ?1:0;.    pBt-
13d80 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76  >incrVacuum = av
13d90 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20  ==2 ?1:0;.  }.  
13da0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13db0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
13dc0 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  c;.#endif.}../*.
13dd0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
13de0 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f  lue of the 'auto
13df0 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
13e00 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75  y. If auto-vacuu
13e10 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64  m is .** enabled
13e20 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   1 is returned. 
13e30 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a  Otherwise 0..*/.
13e40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
13e50 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  GetAutoVacuum(Bt
13e60 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20  ree *p){.#ifdef 
13e70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
13e80 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
13e90 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
13ea0 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69  _NONE;.#else.  i
13eb0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
13ec0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
13ed0 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d   rc = (.    (!p-
13ee0 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
13ef0 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
13f00 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70  UM_NONE:.    (!p
13f10 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ->pBt->incrVacuu
13f20 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
13f30 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54  UUM_FULL:.    BT
13f40 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49  REE_AUTOVACUUM_I
13f50 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74  NCR.  );.  sqlit
13f60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
13f70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
13f80 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  ndif.}.../*.** G
13f90 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  et a reference t
13fa0 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20  o pPage1 of the 
13fb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
13fc0 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  This will.** als
13fd0 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64  o acquire a read
13fe0 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c  lock on that fil
13ff0 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
14000 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
14010 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74  n success.  If t
14020 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  he file is not a
14030 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  .** well-formed 
14040 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
14050 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  hen SQLITE_CORRU
14060 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  PT is returned..
14070 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
14080 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
14090 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f  e database is lo
140a0 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f  cked.  SQLITE_NO
140b0 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  MEM.** is return
140c0 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74  ed if we run out
140d0 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a   of memory. .*/.
140e0 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42  static int lockB
140f0 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70  tree(BtShared *p
14100 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Bt){.  int rc;  
14110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14120 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
14130 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  subfunctions */.
14140 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
14150 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31  1;     /* Page 1
14160 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
14170 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
14180 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
14190 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
141a0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
141b0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  se */.  int nPag
141c0 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20  eFile = 0;   /* 
141d0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
141e0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
141f0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
14200 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f  ageHeader;     /
14210 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
14220 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
14230 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68  e according to h
14240 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  dr */..  assert(
14250 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
14260 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
14270 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
14280 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20  ->pPage1==0 );. 
14290 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
142a0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74  erSharedLock(pBt
142b0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  ->pPager);.  if(
142c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
142d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
142e0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
142f0 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
14300 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
14310 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
14320 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73  n rc;..  /* Do s
14330 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  ome checking to 
14340 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20  help insure the 
14350 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72  file we opened r
14360 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20  eally is.  ** a 
14370 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66  valid database f
14380 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61  ile. .  */.  nPa
14390 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72  ge = nPageHeader
143a0 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28   = get4byte(28+(
143b0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
143c0 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  a);.  sqlite3Pag
143d0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
143e0 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46  >pPager, &nPageF
143f0 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67  ile);.  if( nPag
14400 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32  e==0 || memcmp(2
14410 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  4+(u8*)pPage1->a
14420 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50  Data, 92+(u8*)pP
14430 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d  age1->aData,4)!=
14440 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d  0 ){.    nPage =
14450 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a   nPageFile;.  }.
14460 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
14470 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a  .    u32 pageSiz
14480 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c  e;.    u32 usabl
14490 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70  eSize;.    u8 *p
144a0 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61  age1 = pPage1->a
144b0 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53  Data;.    rc = S
144c0 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
144d0 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
144e0 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
144f0 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
14500 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
14510 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
14520 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
14530 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20  MIT_WAL.    if( 
14540 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20  page1[18]>1 ){. 
14550 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
14560 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
14570 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
14580 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
14590 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
145a0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
145b0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
145c0 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20  if( page1[18]>2 
145d0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
145e0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
145f0 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
14600 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
14610 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >2 ){.      goto
14620 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
14630 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
14640 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76  * If the write v
14650 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f  ersion is set to
14660 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73   2, this databas
14670 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65  e should be acce
14680 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57  ssed.    ** in W
14690 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  AL mode. If the 
146a0 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  log is not alrea
146b0 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74  dy open, open it
146c0 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20   now. Then .    
146d0 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
146e0 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77  _OK and return w
146f0 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e  ithout populatin
14700 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65  g BtShared.pPage
14710 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  1..    ** The ca
14720 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69  ller detects thi
14730 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73  s and calls this
14740 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e   function again.
14750 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20   This is.    ** 
14760 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20  required as the 
14770 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
14780 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  1 currently in t
14790 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a  he page1 buffer.
147a0 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62      ** may not b
147b0 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72  e the latest ver
147c0 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79  sion - there may
147d0 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20   be a newer one 
147e0 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a  in the log.    *
147f0 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  * file..    */. 
14800 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
14810 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73  ==2 && (pBt->bts
14820 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57  Flags & BTS_NO_W
14830 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  AL)==0 ){.      
14840 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a  int isOpen = 0;.
14850 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14860 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
14870 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f  Bt->pPager, &isO
14880 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pen);.      if( 
14890 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
148a0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
148b0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
148c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
148d0 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20   isOpen==0 ){.  
148e0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
148f0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
14900 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14910 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
14920 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
14930 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e  OTADB;.    }.#en
14940 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  dif..    /* The 
14950 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64  maximum embedded
14960 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
14970 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20  e exactly 25%.  
14980 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a  And the minimum.
14990 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20      ** embedded 
149a0 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  fraction must be
149b0 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20   12.5% for both 
149c0 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f  leaf-data and no
149d0 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20  n-leaf-data..   
149e0 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   ** The original
149f0 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20   design allowed 
14a00 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f  these amounts to
14a10 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66   vary, but as of
14a20 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20  .    ** version 
14a30 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72  3.6.0, we requir
14a40 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78  e them to be fix
14a50 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
14a60 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31  f( memcmp(&page1
14a70 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c  [21], "\100\040\
14a80 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20  040",3)!=0 ){.  
14a90 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
14aa0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
14ab0 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  }.    pageSize =
14ac0 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20   (page1[16]<<8) 
14ad0 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36  | (page1[17]<<16
14ae0 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  );.    if( ((pag
14af0 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
14b00 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61  e)!=0.     || pa
14b10 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
14b20 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  X_PAGE_SIZE .   
14b30 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32    || pageSize<=2
14b40 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  56 .    ){.     
14b50 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
14b60 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
14b70 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
14b80 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
14b90 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
14ba0 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
14bb0 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28  1[20];.    if( (
14bc0 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42  u32)pageSize!=pB
14bd0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  t->pageSize ){. 
14be0 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65       /* After re
14bf0 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ading the first 
14c00 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
14c10 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20  base assuming a 
14c20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20  page size.      
14c30 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70  ** of BtShared.p
14c40 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65  ageSize, we have
14c50 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
14c60 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69   the page-size i
14c70 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61  s.      ** actua
14c80 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e  lly pageSize. Un
14c90 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
14ca0 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  e, leave pBt->pP
14cb0 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a  age1 at.      **
14cc0 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
14cd0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
14ce0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c  caller will call
14cf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
14d00 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
14d10 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  th the correct p
14d20 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20  age-size..      
14d30 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
14d40 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
14d50 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
14d60 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
14d70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
14d80 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
14d90 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
14da0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
14db0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
14dc0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
14dd0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
14de0 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
14df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
14e10 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69  ageSize-usableSi
14e20 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
14e30 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
14e40 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c  if( (pBt->db->fl
14e50 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 63  ags & SQLITE_Rec
14e60 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26  overyMode)==0 &&
14e70 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65   nPage>nPageFile
14e80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
14e90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
14ea0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
14eb0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
14ec0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14ed0 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29  usableSize<480 )
14ee0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
14ef0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
14f00 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
14f10 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
14f20 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
14f30 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
14f40 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
14f50 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
14f60 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
14f70 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
14f80 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
14f90 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
14fa0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
14fb0 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
14fc0 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
14fd0 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
14fe0 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
14ff0 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
15000 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
15010 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
15020 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
15030 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
15040 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
15050 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
15060 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
15070 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
15080 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
15090 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
150a0 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
150b0 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
150c0 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
150d0 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
150e0 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
150f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
15100 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
15110 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
15120 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
15130 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
15140 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
15150 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
15160 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
15170 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
15180 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
15190 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
151a0 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68  yte pointer, a h
151b0 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
151c0 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
151d0 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
151e0 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
151f0 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
15200 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
15210 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
15220 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
15230 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
15240 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
15250 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
15260 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
15270 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >minLocal = (u16
15280 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
15290 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
152a0 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c  23);.  pBt->maxL
152b0 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d  eaf = (u16)(pBt-
152c0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
152d0 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  );.  pBt->minLea
152e0 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  f = (u16)((pBt->
152f0 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
15300 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69  2/255 - 23);.  i
15310 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  f( pBt->maxLocal
15320 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d  >127 ){.    pBt-
15330 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
15340 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b   = 127;.  }else{
15350 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
15360 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29  tePayload = (u8)
15370 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
15380 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
15390 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
153a0 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
153b0 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
153c0 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
153d0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
153e0 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
153f0 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f  LITE_OK;..page1_
15400 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72  init_failed:.  r
15410 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
15420 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65  1);.  pBt->pPage
15430 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  1 = 0;.  return 
15440 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
15450 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
15460 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
15470 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
15480 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f   pBt. This is fo
15490 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
154a0 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
154b0 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
154c0 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
154d0 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
154e0 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ined..**.** Only
154f0 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
15500 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72  re counted if wr
15510 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49  Only is true.  I
15520 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66  f wrOnly is.** f
15530 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75  alse then all cu
15540 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
15550 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  d..**.** For the
15560 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
15570 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72  s routine, a cur
15580 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
15590 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
155a0 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20  able of reading 
155b0 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  or writing to th
155c0 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72  e database.  Cur
155d0 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76  sors that.** hav
155e0 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69  e been tripped i
155f0 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46  nto the CURSOR_F
15600 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e  AULT state are n
15610 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73  ot counted..*/.s
15620 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56  tatic int countV
15630 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68  alidCursors(BtSh
15640 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77  ared *pBt, int w
15650 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  rOnly){.  BtCurs
15660 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
15670 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
15680 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
15690 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
156a0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
156b0 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28   (wrOnly==0 || (
156c0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
156d0 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
156e0 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75  !=0).     && pCu
156f0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
15700 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
15710 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
15720 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
15730 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
15740 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
15750 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
15760 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
15770 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
15780 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
15790 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
157a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
157b0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
157c0 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
157d0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
157e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
157f0 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
15800 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
15810 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
15820 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
15830 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
15840 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
15850 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
15860 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
15870 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
15880 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
15890 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
158a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
158b0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
158c0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
158d0 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
158e0 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c  sors(pBt,0)==0 |
158f0 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
15900 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
15910 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
15920 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
15930 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
15940 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
15950 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
15960 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
15970 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
15980 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
15990 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20  pBt->pPager)==1 
159a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
159b0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
159c0 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  a );.    release
159d0 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31  Page(pBt->pPage1
159e0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  );.    pBt->pPag
159f0 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e1 = 0;.  }.}../
15a00 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e  *.** If pBt poin
15a10 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66  ts to an empty f
15a20 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  ile then convert
15a30 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65   that empty file
15a40 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65  .** into a new e
15a50 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79  mpty database by
15a60 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
15a70 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a  e first page of.
15a80 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ** the database.
15a90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
15aa0 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61  ewDatabase(BtSha
15ab0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
15ac0 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73  Page *pP1;.  uns
15ad0 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
15ae0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
15af0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15b00 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
15b10 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
15b20 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20  Bt->nPage>0 ){. 
15b30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15b40 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d  _OK;.  }.  pP1 =
15b50 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
15b60 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29  assert( pP1!=0 )
15b70 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e  ;.  data = pP1->
15b80 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71  aData;.  rc = sq
15b90 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
15ba0 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pP1->pDbPage);. 
15bb0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
15bc0 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61   rc;.  memcpy(da
15bd0 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  ta, zMagicHeader
15be0 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  , sizeof(zMagicH
15bf0 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72  eader));.  asser
15c00 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  t( sizeof(zMagic
15c10 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20  Header)==16 );. 
15c20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29   data[16] = (u8)
15c30 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
15c40 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  >8)&0xff);.  dat
15c50 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42  a[17] = (u8)((pB
15c60 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29  t->pageSize>>16)
15c70 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
15c80 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31  8] = 1;.  data[1
15c90 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  9] = 1;.  assert
15ca0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
15cb0 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
15cc0 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   && pBt->usableS
15cd0 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61  ize+255>=pBt->pa
15ce0 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
15cf0 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e  20] = (u8)(pBt->
15d00 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
15d10 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64  usableSize);.  d
15d20 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20  ata[21] = 64;.  
15d30 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20  data[22] = 32;. 
15d40 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a   data[23] = 32;.
15d50 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32    memset(&data[2
15d60 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a  4], 0, 100-24);.
15d70 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20    zeroPage(pP1, 
15d80 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
15d90 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  EAF|PTF_LEAFDATA
15da0 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c   );.  pBt->btsFl
15db0 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
15dc0 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
15dd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
15de0 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65  UTOVACUUM.  asse
15df0 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
15e00 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61  uum==1 || pBt->a
15e10 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  utoVacuum==0 );.
15e20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
15e30 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  ncrVacuum==1 || 
15e40 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
15e50 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  =0 );.  put4byte
15e60 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d  (&data[36 + 4*4]
15e70 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  , pBt->autoVacuu
15e80 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  m);.  put4byte(&
15e90 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20  data[36 + 7*4], 
15ea0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
15eb0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e  ;.#endif.  pBt->
15ec0 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74  nPage = 1;.  dat
15ed0 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74  a[31] = 1;.  ret
15ee0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15ef0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
15f00 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ze the first pag
15f10 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
15f20 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67  e file (creating
15f30 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63   a database.** c
15f40 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73  onsisting of a s
15f50 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e  ingle page and n
15f60 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73  o schema objects
15f70 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
15f80 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73  _OK.** if succes
15f90 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
15fa0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
15fb0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
15fc0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44  sqlite3BtreeNewD
15fd0 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  b(Btree *p){.  i
15fe0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
15ff0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
16000 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d   p->pBt->nPage =
16010 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61   0;.  rc = newDa
16020 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a  tabase(p->pBt);.
16030 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16040 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
16050 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   rc;.}../*.** At
16060 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61  tempt to start a
16070 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
16080 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  . A write-transa
16090 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72  ction.** is star
160a0 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ted if the secon
160b0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
160c0 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  nzero, otherwise
160d0 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e   a read-.** tran
160e0 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  saction.  If the
160f0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
16100 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e   is 2 or more an
16110 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74  d exclusive.** t
16120 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
16130 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74  arted, meaning t
16140 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
16150 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a  cess is allowed.
16160 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ** to access the
16170 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72   database.  A pr
16180 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61  eexisting transa
16190 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65  ction may not be
161a0 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20  .** upgraded to 
161b0 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c  exclusive by cal
161c0 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
161d0 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20  e a second time 
161e0 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69  - the.** exclusi
161f0 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77  vity flag only w
16200 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74  orks for a new t
16210 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
16220 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
16230 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74  ction must be st
16240 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74  arted before att
16250 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20  empting any .** 
16260 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
16270 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f  atabase.  None o
16280 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
16290 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c  routines .** wil
162a0 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20  l work unless a 
162b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
162c0 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a  tarted first:.**
162d0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
162e0 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
162f0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
16300 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64  e3BtreeCreateInd
16310 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  ex().**      sql
16320 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
16330 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
16340 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
16350 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
16360 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
16370 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
16380 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a  e3BtreeDelete().
16390 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
163a0 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29  treeUpdateMeta()
163b0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69  .**.** If an ini
163c0 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20  tial attempt to 
163d0 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b  acquire the lock
163e0 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f   fails because o
163f0 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  f lock contentio
16400 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  n.** and the dat
16410 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f  abase was previo
16420 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74  usly unlocked, t
16430 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  hen invoke the b
16440 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69  usy handler.** i
16450 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
16460 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61   But if there wa
16470 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72  s previously a r
16480 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74  ead-lock, do not
16490 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  .** invoke the b
164a0 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75  usy handler - ju
164b0 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
164c0 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42  _BUSY.  SQLITE_B
164d0 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  USY is .** retur
164e0 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  ned when there i
164f0 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  s already a read
16500 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74  -lock in order t
16510 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f  o avoid a deadlo
16520 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  ck..**.** Suppos
16530 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  e there are two 
16540 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20  processes A and 
16550 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64  B.  A has a read
16560 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a   lock and B has.
16570 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ** a reserved lo
16580 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20  ck.  B tries to 
16590 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75  promote to exclu
165a0 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63  sive but is bloc
165b0 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f  ked because.** o
165c0 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e  f A's read lock.
165d0 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f    A tries to pro
165e0 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64  mote to reserved
165f0 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
16600 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20  by B..** One or 
16610 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
16620 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d   two processes m
16630 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20  ust give way or 
16640 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
16650 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79  no progress.  By
16660 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
16670 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69  E_BUSY and not i
16680 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79  nvoking the busy
16690 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65   callback.** whe
166a0 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  n A already has 
166b0 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20  a read lock, we 
166c0 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67  encourage A to g
166d0 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42  ive up and let B
166e0 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a  .** proceed..*/.
166f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16700 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65  BeginTrans(Btree
16710 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29   *p, int wrflag)
16720 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c  {.  sqlite3 *pBl
16730 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61  ock = 0;.  BtSha
16740 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
16750 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
16760 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69  LITE_OK;..  sqli
16770 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16780 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
16790 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
167a0 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72  the btree is alr
167b0 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d  eady in a write-
167c0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
167d0 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  it.  ** is alrea
167e0 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61  dy in a read-tra
167f0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72  nsaction and a r
16800 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
16810 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65    ** is requeste
16820 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  d, this is a no-
16830 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
16840 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
16850 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e  _WRITE || (p->in
16860 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41  Trans==TRANS_REA
16870 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b  D && !wrflag) ){
16880 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
16890 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  begun;.  }.  ass
168a0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
168b0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
168c0 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69  RITE || IfNotOmi
168d0 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e  tAV(pBt->bDoTrun
168e0 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f  cate)==0 );..  /
168f0 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74  * Write transact
16900 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73  ions are not pos
16910 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d  sible on a read-
16920 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
16930 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
16940 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
16950 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66  _ONLY)!=0 && wrf
16960 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
16970 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
16980 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
16990 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
169a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
169b0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
169c0 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
169d0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
169e0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
169f0 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
16a00 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ion .  ** on thi
16a10 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
16a20 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
16a30 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
16a40 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
16a50 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
16a60 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
16a70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66  .  */.  if( (wrf
16a80 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
16a90 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
16aa0 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28 70  _WRITE).   || (p
16ab0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
16ac0 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20  TS_PENDING)!=0. 
16ad0 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d   ){.    pBlock =
16ae0 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
16af0 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77  b;.  }else if( w
16b00 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42  rflag>1 ){.    B
16b10 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20  tLock *pIter;.  
16b20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
16b30 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
16b40 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
16b50 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  t){.      if( pI
16b60 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
16b70 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b  {.        pBlock
16b80 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65   = pIter->pBtree
16b90 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72  ->db;.        br
16ba0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
16bb0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c   }.  }.  if( pBl
16bc0 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ock ){.    sqlit
16bd0 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
16be0 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63  ked(p->db, pBloc
16bf0 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  k);.    rc = SQL
16c00 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
16c10 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f  DCACHE;.    goto
16c20 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
16c30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
16c40 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  ny read-only or 
16c50 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73  read-write trans
16c60 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61  action implies a
16c70 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20   read-lock on . 
16c80 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69   ** page 1. So i
16c90 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61  f some other sha
16ca0 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74  red-cache client
16cb0 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77   already has a w
16cc0 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20  rite-lock .  ** 
16cd0 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74  on page 1, the t
16ce0 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f  ransaction canno
16cf0 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  t be opened. */.
16d00 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72    rc = queryShar
16d10 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
16d20 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
16d30 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
16d40 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
16d50 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65   ) goto trans_be
16d60 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73  gun;..  pBt->bts
16d70 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e  Flags &= ~BTS_IN
16d80 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
16d90 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
16da0 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  =0 ) pBt->btsFla
16db0 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41  gs |= BTS_INITIA
16dc0 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20  LLY_EMPTY;.  do 
16dd0 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f  {.    /* Call lo
16de0 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20  ckBtree() until 
16df0 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67  either pBt->pPag
16e00 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  e1 is populated 
16e10 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74  or.    ** lockBt
16e20 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f  ree() returns so
16e30 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
16e40 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f  an SQLITE_OK. lo
16e50 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a  ckBtree().    **
16e60 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
16e70 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20  TE_OK but leave 
16e80 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20  pBt->pPage1 set 
16e90 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20  to 0 if after.  
16ea0 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67    ** reading pag
16eb0 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73  e 1 it discovers
16ec0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
16ed0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
16ee0 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ase .    ** file
16ef0 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67   is not pBt->pag
16f00 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63  eSize. In this c
16f10 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ase lockBtree() 
16f20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20  will update.    
16f30 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ** pBt->pageSize
16f40 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a   to the page-siz
16f50 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
16f60 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
16f70 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50    while( pBt->pP
16f80 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54  age1==0 && SQLIT
16f90 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b  E_OK==(rc = lock
16fa0 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a  Btree(pBt)) );..
16fb0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16fc0 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
16fd0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42  ){.      if( (pB
16fe0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
16ff0 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
17000 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
17010 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
17020 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17030 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
17040 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
17050 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
17060 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
17070 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
17080 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
17090 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
170a0 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
170b0 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
170c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
170d0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
170e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
170f0 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
17100 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
17110 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
17120 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49   (rc&0xFF)==SQLI
17130 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
17140 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
17150 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
17160 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
17170 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
17180 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  t) );..  if( rc=
17190 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
171a0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
171b0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
171c0 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
171d0 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
171e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
171f0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
17200 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
17210 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
17220 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  ert( p->lock.pBt
17230 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63  ree==p && p->loc
17240 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  k.iTable==1 );. 
17250 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65         p->lock.e
17260 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
17270 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
17280 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  k.pNext = pBt->p
17290 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42  Lock;.        pB
172a0 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c  t->pLock = &p->l
172b0 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ock;.      }.#en
172c0 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
172d0 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
172e0 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
172f0 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
17300 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
17310 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
17320 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
17330 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
17340 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
17350 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  }.    if( wrflag
17360 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
17370 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
17380 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66  >pPage1;.#ifndef
17390 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
173a0 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
173b0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57  assert( !pBt->pW
173c0 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70  riter );.      p
173d0 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b  Bt->pWriter = p;
173e0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
173f0 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43  lags &= ~BTS_EXC
17400 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66  LUSIVE;.      if
17410 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74  ( wrflag>1 ) pBt
17420 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
17430 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e  S_EXCLUSIVE;.#en
17440 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  dif..      /* If
17450 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61   the db-size hea
17460 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63  der field is inc
17470 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61  orrect (as it ma
17480 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20  y be if an old. 
17490 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68       ** client h
174a0 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20  as been writing 
174b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
174c0 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f  e), update it no
174d0 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a  w. Doing.      *
174e0 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61  * this sooner ra
174f0 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20  ther than later 
17500 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
17510 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65  se size can safe
17520 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d  ly .      ** re-
17530 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
17540 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65  e size from page
17550 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e   1 if a savepoin
17560 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
17570 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
17580 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  ck occurs within
17590 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
175a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
175b0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21   if( pBt->nPage!
175c0 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65  =get4byte(&pPage
175d0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b  1->aData[28]) ){
175e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
175f0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
17600 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
17610 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
17620 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17630 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
17640 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
17650 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
17660 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
17670 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
17680 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20  .trans_begun:.  
17690 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
176a0 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
176b0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
176c0 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20  makes sure that 
176d0 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
176e0 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
176f0 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20   of.    ** open 
17700 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74  savepoints. If t
17710 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
17720 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ter is greater t
17730 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a  han 0 and.    **
17740 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
17750 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
17760 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69  open, then it wi
17770 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72  ll be opened her
17780 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
17790 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
177a0 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
177b0 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d  ->pPager, p->db-
177c0 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >nSavepoint);.  
177d0 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
177e0 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
177f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17800 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17810 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17820 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
17830 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
17840 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
17850 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
17860 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
17870 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
17880 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
17890 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
178a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
178b0 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
178c0 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
178d0 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
178e0 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
178f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
17900 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
17910 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
17920 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17940 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
17950 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
17960 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
17970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17980 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
17990 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
179a0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
179b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
179d0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
179e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
179f0 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73  ge->pBt;.  u8 is
17a00 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
17a10 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f  ->isInit;.  Pgno
17a20 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
17a30 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
17a40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17a50 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
17a60 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
17a70 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
17a80 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
17a90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17aa0 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
17ab0 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d  ptrmaps_out;.  }
17ac0 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
17ad0 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
17ae0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
17af0 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
17b00 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
17b10 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72  ge, i);..    ptr
17b20 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
17b30 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  age, pCell, &rc)
17b40 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ;..    if( !pPag
17b50 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
17b60 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
17b70 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
17b80 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  );.      ptrmapP
17b90 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
17ba0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
17bb0 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20   pgno, &rc);.   
17bc0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
17bd0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
17be0 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
17bf0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
17c00 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
17c10 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
17c20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
17c30 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
17c40 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
17c50 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74  , &rc);.  }..set
17c60 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
17c70 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  ut:.  pPage->isI
17c80 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
17c90 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17ca0 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
17cb0 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20  e on pPage is a 
17cc0 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
17cd0 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74  iFrom.  Modify t
17ce0 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a  his pointer so.*
17cf0 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
17d00 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74   to iTo. Paramet
17d10 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
17d20 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
17d30 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20  ointer to.** be 
17d40 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f  modified, as  fo
17d50 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
17d60 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
17d70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
17d80 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
17d90 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
17da0 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
17db0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
17dc0 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
17dd0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
17de0 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
17df0 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
17e00 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
17e10 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
17e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17e30 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
17e40 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
17e50 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
17e60 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
17e70 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
17e80 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
17e90 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
17ea0 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
17eb0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
17ec0 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
17ed0 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
17ee0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
17ef0 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
17f00 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
17f10 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
17f20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
17f30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17f40 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
17f50 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
17f60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
17f70 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
17f80 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
17f90 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
17fa0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
17fb0 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
17fc0 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
17fd0 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
17fe0 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
17ff0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
18000 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
18010 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
18020 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
18030 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18040 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18050 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
18060 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
18070 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
18080 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72  .    u8 isInitOr
18090 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
180a0 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
180b0 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20     int nCell;.. 
180c0 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65     btreeInitPage
180d0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65  (pPage);.    nCe
180e0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
180f0 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
18100 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
18110 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
18120 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
18130 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
18140 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
18150 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
18160 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
18170 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50  ;.        btreeP
18180 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
18190 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
181a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
181b0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20  fo.iOverflow.   
181c0 20 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69        && pCell+i
181d0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c  nfo.iOverflow+3<
181e0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50  =pPage->aData+pP
181f0 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20  age->maskPage.  
18200 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d         && iFrom=
18210 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c  =get4byte(&pCell
18220 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
18230 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
18240 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
18250 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
18260 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20  rflow], iTo);.  
18270 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18280 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
18290 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
182a0 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
182b0 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
182c0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
182d0 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
182e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
182f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
18300 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
18310 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
18320 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
18330 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
18340 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
18350 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
18360 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
18370 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
18380 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18390 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
183a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
183b0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
183c0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
183d0 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
183e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
183f0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
18400 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72  nitOrig;.  }.  r
18410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18420 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
18430 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
18440 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
18450 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
18460 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
18470 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
18480 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
18490 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
184a0 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69  *.** The isCommi
184b0 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  t flag indicates
184c0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
184d0 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  o need to rememb
184e0 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a  er that.** the j
184f0 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
18500 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
18510 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
18520 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a   pDbPage->pgno .
18530 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ** can be writte
18540 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72  n to. The caller
18550 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f   has already pro
18560 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69  mised not to wri
18570 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61  te to that.** pa
18580 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
18590 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
185a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
185b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
185c0 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
185d0 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
185e0 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
185f0 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
18600 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
18610 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
18620 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
18630 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
18640 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
18650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
18660 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
18670 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
18680 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
18690 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20  iFreePage,      
186a0 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
186b0 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
186c0 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  age to */.  int 
186d0 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
186e0 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74       /* isCommit
186f0 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20   flag passed to 
18700 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
18710 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  page */.){.  Mem
18720 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
18730 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
18740 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
18750 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
18760 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
18770 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
18780 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
18790 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
187a0 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
187b0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
187c0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
187d0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
187e0 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
187f0 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
18800 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
18810 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
18820 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
18830 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
18840 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
18850 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50  ;.  assert( pDbP
18860 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  age->pBt==pBt );
18870 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65  ..  /* Move page
18880 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74   iDbPage from it
18890 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
188a0 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
188b0 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
188c0 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
188d0 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
188e0 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
188f0 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
18900 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
18910 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
18920 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
18930 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
18940 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
18950 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61  ge(pPager, pDbPa
18960 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72  ge->pDbPage, iFr
18970 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74  eePage, isCommit
18980 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
18990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
189a0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
189b0 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
189c0 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
189d0 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
189e0 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
189f0 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
18a00 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
18a10 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
18a20 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
18a30 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
18a40 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
18a50 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
18a60 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
18a70 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
18a80 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
18a90 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
18aa0 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
18ab0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
18ac0 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
18ad0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
18ae0 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
18af0 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
18b00 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
18b10 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
18b20 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
18b30 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
18b40 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
18b50 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
18b60 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
18b70 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
18b80 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
18b90 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
18ba0 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
18bb0 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
18bc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18bd0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
18be0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
18bf0 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
18c00 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
18c10 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
18c20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
18c30 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
18c40 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
18c50 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
18c60 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
18c70 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
18c80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18c90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
18ca0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18cb0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
18cc0 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
18cd0 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
18ce0 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
18cf0 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
18d00 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
18d10 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
18d20 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
18d30 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
18d40 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
18d50 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
18d60 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
18d70 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
18d80 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
18d90 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
18da0 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20  age, &pPtrPage, 
18db0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
18dc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18dd0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18de0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
18df0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
18e00 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65  PtrPage->pDbPage
18e10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
18e20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18e30 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
18e40 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  trPage);.      r
18e50 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
18e60 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50      rc = modifyP
18e70 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50  agePointer(pPtrP
18e80 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46  age, iDbPage, iF
18e90 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b  reePage, eType);
18ea0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
18eb0 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
18ec0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18ed0 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  K ){.      ptrma
18ee0 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50  pPut(pBt, iFreeP
18ef0 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72  age, eType, iPtr
18f00 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
18f10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
18f20 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
18f30 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71   declaration req
18f40 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63  uired by incrVac
18f50 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74  uumStep(). */.st
18f60 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
18f70 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61  eBtreePage(BtSha
18f80 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a  red *, MemPage *
18f90 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c  *, Pgno *, Pgno,
18fa0 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72   u8);../*.** Per
18fb0 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74  form a single st
18fc0 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  ep of an increme
18fd0 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20  ntal-vacuum. If 
18fe0 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
18ff0 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  rn.** SQLITE_OK.
19000 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
19010 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20  work to do (and 
19020 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69  therefore no poi
19030 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e  nt in .** callin
19040 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
19050 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53  again), return S
19060 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20  QLITE_DONE. Or, 
19070 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  if an error .** 
19080 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73  occurs, return s
19090 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
190a0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65  code..**.** More
190b0 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   specifically, t
190c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
190d0 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61  empts to re-orga
190e0 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73  nize the databas
190f0 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68  e so .** that th
19100 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74  e last page of t
19110 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  he file currentl
19120 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c  y in use is no l
19130 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a  onger in use..**
19140 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46  .** Parameter nF
19150 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  in is the number
19160 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74   of pages that t
19170 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f 75  his database wou
19180 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65  ld contain.** we
19190 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
191a0 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74   called until it
191b0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
191c0 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  DONE..**.** If t
191d0 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d  he bCommit param
191e0 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
191f0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
19200 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
19210 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c   .** caller will
19220 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e   keep calling in
19230 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75  crVacuumStep() u
19240 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
19250 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20  SQLITE_DONE .** 
19260 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f  or an error. bCo
19270 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20 74  mmit is passed t
19280 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  rue for an auto-
19290 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74  vacuum-on-commit
192a0 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20   .** operation, 
192b0 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20  or false for an 
192c0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
192d0 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  um..*/.static in
192e0 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  t incrVacuumStep
192f0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
19300 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20  Pgno nFin, Pgno 
19310 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f  iLastPg, int bCo
19320 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46  mmit){.  Pgno nF
19330 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
19340 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19350 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74  pages still on t
19360 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  he free-list */.
19370 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
19380 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
19390 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
193a0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
193b0 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b   iLastPg>nFin );
193c0 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
193d0 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
193e0 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
193f0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
19400 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75  GE(pBt) ){.    u
19410 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e  8 eType;.    Pgn
19420 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
19430 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74   nFreeList = get
19440 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
19450 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
19460 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73      if( nFreeLis
19470 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
19480 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
19490 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
194a0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
194b0 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65   iLastPg, &eType
194c0 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
194d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
194e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
194f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
19500 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
19510 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
19520 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19530 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
19540 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
19550 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
19560 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
19570 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
19580 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ){.        /* Re
19590 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72  move the page fr
195a0 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65  om the files fre
195b0 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20  e-list. This is 
195c0 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20  not required.   
195d0 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d       ** if bComm
195e0 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  it is non-zero. 
195f0 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
19600 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c  e free-list will
19610 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   be.        ** t
19620 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
19630 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
19640 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f  tion returns, so
19650 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20   it doesn't .   
19660 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69       ** matter i
19670 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  f it still conta
19680 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ins some garbage
19690 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
196a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
196b0 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20  o iFreePg;.     
196c0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
196d0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
196e0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
196f0 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
19700 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61  g, &iFreePg, iLa
19710 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58  stPg, BTALLOC_EX
19720 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ACT);.        if
19730 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19740 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
19750 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
19760 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
19770 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74  ( iFreePg==iLast
19780 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Pg );.        re
19790 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
197a0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
197b0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50  } else {.      P
197c0 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20  gno iFreePg;    
197d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
197e0 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74  x of free page t
197f0 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74  o move pLastPg t
19800 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61  o */.      MemPa
19810 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20  ge *pLastPg;.   
19820 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54     u8 eMode = BT
19830 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20  ALLOC_ANY;   /* 
19840 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 66  Mode parameter f
19850 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
19860 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20  Page() */.      
19870 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20  Pgno iNear = 0; 
19880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61            /* nea
19890 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f  rby parameter fo
198a0 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  r allocateBtreeP
198b0 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20  age() */..      
198c0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
198d0 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  e(pBt, iLastPg, 
198e0 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20  &pLastPg, 0);.  
198f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19900 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19910 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19920 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
19930 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f   bCommit is zero
19940 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  , this loop runs
19950 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e   exactly once an
19960 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20  d page pLastPg. 
19970 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70       ** is swapp
19980 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
19990 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c  t free page pull
199a0 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20  ed off the free 
199b0 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  list..      **. 
199c0 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f       ** On the o
199d0 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43  ther hand, if bC
199e0 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65 72  ommit is greater
199f0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
19a00 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
19a10 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
19a20 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
19a30 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
19a40 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
19a50 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
19a60 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
19a70 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62    */.      if( b
19a80 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
19a90 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41       eMode = BTA
19aa0 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20  LLOC_LE;.       
19ab0 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20   iNear = nFin;. 
19ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20       }.      do 
19ad0 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
19ae0 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
19af0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
19b00 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
19b10 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
19b20 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65  Pg, iNear, eMode
19b30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
19b40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19b50 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
19b60 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
19b70 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
19b80 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
19b90 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
19ba0 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
19bb0 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d     }while( bComm
19bc0 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46  it && iFreePg>nF
19bd0 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  in );.      asse
19be0 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73  rt( iFreePg<iLas
19bf0 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20  tPg );.      .  
19c00 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
19c10 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74  ePage(pBt, pLast
19c20 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  Pg, eType, iPtrP
19c30 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43  age, iFreePg, bC
19c40 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65  ommit);.      re
19c50 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
19c60 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
19c70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19c80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
19c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19ca0 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d    }..  if( bComm
19cb0 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20  it==0 ){.    do 
19cc0 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d  {.      iLastPg-
19cd0 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  -;.    }while( i
19ce0 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f  LastPg==PENDING_
19cf0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c  BYTE_PAGE(pBt) |
19d00 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  | PTRMAP_ISPAGE(
19d10 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b  pBt, iLastPg) );
19d20 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  .    pBt->bDoTru
19d30 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70  ncate = 1;.    p
19d40 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73  Bt->nPage = iLas
19d50 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  tPg;.  }.  retur
19d60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19d70 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61  /*.** The databa
19d80 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  se opened by the
19d90 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
19da0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
19db0 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f  m database.** nO
19dc0 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a  rig pages in siz
19dd0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72  e containing nFr
19de0 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20 52  ee free pages. R
19df0 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63 74  eturn the expect
19e00 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  ed .** size of t
19e10 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70  he database in p
19e20 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  ages following a
19e30 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70  n auto-vacuum op
19e40 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
19e50 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53  ic Pgno finalDbS
19e60 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ize(BtShared *pB
19e70 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50  t, Pgno nOrig, P
19e80 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e  gno nFree){.  in
19e90 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20  t nEntry;       
19ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19eb0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
19ec0 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70  es on one ptrmap
19ed0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
19ee0 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20  nPtrmap;        
19ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19f00 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70  mber of PtrMap p
19f10 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64  ages to be freed
19f20 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b   */.  Pgno nFin;
19f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f40 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
19f50 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74  value */..  nEnt
19f60 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ry = pBt->usable
19f70 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61  Size/5;.  nPtrma
19f80 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67  p = (nFree-nOrig
19f90 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  +PTRMAP_PAGENO(p
19fa0 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72  Bt, nOrig)+nEntr
19fb0 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69  y)/nEntry;.  nFi
19fc0 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
19fd0 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69  e - nPtrmap;.  i
19fe0 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
19ff0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1a000 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f  && nFin<PENDING_
1a010 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1a020 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20  {.    nFin--;.  
1a030 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41  }.  while( PTRMA
1a040 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46  P_ISPAGE(pBt, nF
1a050 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e  in) || nFin==PEN
1a060 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1a070 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
1a080 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  -;.  }..  return
1a090 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nFin;.}../*.** 
1a0a0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
1a0b0 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
1a0c0 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
1a0d0 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
1a0e0 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
1a0f0 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
1a100 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
1a110 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1a120 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
1a130 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
1a140 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
1a150 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
1a160 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
1a170 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
1a180 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
1a190 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
1a1a0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
1a1b0 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  curred,.** SQLIT
1a1c0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1a1d0 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
1a1e0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1a1f0 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
1a200 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
1a210 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1a220 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
1a230 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1a240 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1a250 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
1a260 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
1a270 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
1a280 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
1a290 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1a2a0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
1a2b0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
1a2c0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1a2d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
1a2e0 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65  no nOrig = btree
1a2f0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
1a300 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d      Pgno nFree =
1a310 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1a320 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1a330 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69  ]);.    Pgno nFi
1a340 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  n = finalDbSize(
1a350 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65  pBt, nOrig, nFre
1a360 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72  e);..    if( nOr
1a370 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20  ig<nFin ){.     
1a380 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1a390 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1a3a0 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30  else if( nFree>0
1a3b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1a3c0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
1a3d0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
1a3e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a3f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  K ){.        inv
1a400 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
1a410 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
1a420 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
1a430 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
1a440 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a  Fin, nOrig, 0);.
1a450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1a460 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a470 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1a480 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1a490 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
1a4a0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1a4b0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1a4c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1a4d0 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  ], pBt->nPage);.
1a4e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1a4f0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1a500 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
1a510 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
1a520 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1a530 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1a540 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1a550 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
1a560 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
1a570 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
1a580 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
1a590 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20  ommitted for 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 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  base..**.** If S
1a5c0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1a5d0 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72  rned, then *pnTr
1a5e0 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  unc is set to th
1a5f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1a600 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
1a610 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
1a620 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75   truncated to du
1a630 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
1a640 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65  process. .** i.e
1a650 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  . the database h
1a660 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69  as been reorgani
1a670 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79  zed so that only
1a680 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72   the first *pnTr
1a690 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65  unc.** pages are
1a6a0 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
1a6b0 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  ic int autoVacuu
1a6c0 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64  mCommit(BtShared
1a6d0 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
1a6e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1a6f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1a700 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56  pBt->pPager;.  V
1a710 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65  VA_ONLY( int nRe
1a720 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  f = sqlite3Pager
1a730 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
1a740 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   );..  assert( s
1a750 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1a760 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1a770 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  .  invalidateAll
1a780 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
1a790 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74  t);.  assert(pBt
1a7a0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
1a7b0 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56   if( !pBt->incrV
1a7c0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
1a7d0 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
1a7e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1a7f0 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61  es in database a
1a800 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69  fter autovacuumi
1a810 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ng */.    Pgno n
1a820 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
1a830 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1a840 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
1a850 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20  initially */.   
1a860 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20   Pgno iFree;    
1a870 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
1a880 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64  page to be freed
1a890 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72   */.    Pgno nOr
1a8a0 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ig;        /* Da
1a8b0 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f  tabase size befo
1a8c0 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20  re freeing */.. 
1a8d0 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65     nOrig = btree
1a8e0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
1a8f0 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
1a900 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67  SPAGE(pBt, nOrig
1a910 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44  ) || nOrig==PEND
1a920 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1a930 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  t) ){.      /* I
1a940 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
1a950 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61  e to create a da
1a960 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68  tabase for which
1a970 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a   the final page.
1a980 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
1a990 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  er a pointer-map
1a9a0 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e   page or the pen
1a9b0 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20  ding-byte page. 
1a9c0 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20  If one.      ** 
1a9d0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
1a9e0 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63  this indicates c
1a9f0 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
1aa00 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1aa10 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1aa20 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1aa30 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
1aa40 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1aa50 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1aa60 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69  nFin = finalDbSi
1aa70 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e  ze(pBt, nOrig, n
1aa80 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  Free);.    if( n
1aa90 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75  Fin>nOrig ) retu
1aaa0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1aab0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20  T_BKPT;.    if( 
1aac0 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20  nFin<nOrig ){.  
1aad0 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
1aae0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
1aaf0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  0);.    }.    fo
1ab00 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69  r(iFree=nOrig; i
1ab10 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d  Free>nFin && rc=
1ab20 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65  =SQLITE_OK; iFre
1ab30 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  e--){.      rc =
1ab40 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1ab50 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65  pBt, nFin, iFree
1ab60 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
1ab70 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
1ab80 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  DONE || rc==SQLI
1ab90 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e  TE_OK) && nFree>
1aba0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1abb0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1abc0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
1abd0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  DbPage);.      p
1abe0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1abf0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1ac00 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
1ac10 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1ac20 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b  ->aData[36], 0);
1ac30 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1ac40 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1ac50 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a  ata[28], nFin);.
1ac60 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72        pBt->bDoTr
1ac70 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
1ac80 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
1ac90 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Fin;.    }.    i
1aca0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1acb0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1acc0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
1acd0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1ace0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  }..  assert( nRe
1acf0 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f>=sqlite3PagerR
1ad00 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
1ad10 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ad20 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64  }..#else /* ifnd
1ad30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1ad40 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64  UTOVACUUM */.# d
1ad50 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74  efine setChildPt
1ad60 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f  rmaps(x) SQLITE_
1ad70 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
1ad80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
1ad90 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
1ada0 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
1adb0 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
1adc0 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
1add0 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
1ade0 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
1adf0 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
1ae00 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
1ae10 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
1ae20 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
1ae30 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
1ae40 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
1ae50 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
1ae60 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
1ae70 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
1ae80 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
1ae90 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
1aea0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
1aeb0 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
1aec0 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
1aed0 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
1aee0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
1aef0 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
1af00 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
1af10 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
1af20 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
1af30 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
1af40 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
1af50 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
1af60 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
1af70 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
1af80 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
1af90 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1afa0 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
1afb0 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
1afc0 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
1afd0 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
1afe0 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
1aff0 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
1b000 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
1b010 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1b020 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72  itPhaseTwo() for
1b030 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
1b040 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
1b050 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
1b060 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
1b070 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
1b080 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
1b090 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
1b0a0 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
1b0b0 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
1b0c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b0d0 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
1b0e0 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
1b0f0 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
1b100 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
1b110 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
1b120 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
1b130 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
1b140 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
1b150 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
1b160 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
1b170 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
1b180 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
1b190 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
1b1a0 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
1b1b0 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
1b1c0 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
1b1d0 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
1b1e0 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
1b1f0 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
1b200 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
1b210 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
1b220 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
1b230 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
1b240 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
1b250 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
1b260 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
1b270 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
1b280 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
1b290 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
1b2a0 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
1b2b0 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
1b2c0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
1b2d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1b2e0 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
1b2f0 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
1b300 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
1b310 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1b320 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
1b330 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1b340 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
1b350 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1b360 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1b370 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66  nter(p);.#ifndef
1b380 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1b390 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
1b3a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1b3b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  ){.      rc = au
1b3c0 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
1b3d0 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
1b3e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b3f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
1b400 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1b410 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b420 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b430 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54     if( pBt->bDoT
1b440 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
1b450 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
1b460 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e  ncateImage(pBt->
1b470 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61  pPager, pBt->nPa
1b480 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ge);.    }.#endi
1b490 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
1b4a0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1b4b0 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
1b4c0 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  r, zMaster, 0);.
1b4d0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b4e0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
1b4f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b500 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1b510 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
1b520 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69   both BtreeCommi
1b530 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20  tPhaseTwo() and 
1b540 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a  BtreeRollback().
1b550 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
1b560 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61  sion of a transa
1b570 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1b580 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72   void btreeEndTr
1b590 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20  ansaction(Btree 
1b5a0 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
1b5b0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1b5c0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1b5d0 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
1b5e0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
1b5f0 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69  sMutex(p) );..#i
1b600 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b610 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70  T_AUTOVACUUM.  p
1b620 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1b630 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 0;.#endif.  if
1b640 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
1b650 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e  NS_NONE && db->n
1b660 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20  VdbeRead>1 ){.  
1b670 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
1b680 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73  e other active s
1b690 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62  tatements that b
1b6a0 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61  elong to this da
1b6b0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61  tabase.    ** ha
1b6c0 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20  ndle, downgrade 
1b6d0 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  to a read-only t
1b6e0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
1b6f0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
1b700 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c  .    ** may stil
1b710 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f  l be reading fro
1b720 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1b730 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64   */.    downgrad
1b740 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
1b750 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
1b760 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
1b770 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  RANS_READ;.  }el
1b780 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
1b790 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79  e handle had any
1b7a0 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
1b7b0 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
1b7c0 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  ment the .    **
1b7d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1b7e0 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
1b7f0 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
1b800 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1b810 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73   .    ** reaches
1b820 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72   0, set the shar
1b830 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
1b840 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f  S_NONE. The unlo
1b850 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1b860 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65  ).    ** call be
1b870 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20  low will unlock 
1b880 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20  the pager.  */. 
1b890 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1b8a0 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
1b8b0 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  .      clearAllS
1b8c0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1b8d0 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ocks(p);.      p
1b8e0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1b8f0 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  --;.      if( 0=
1b900 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
1b910 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  on ){.        pB
1b920 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1b930 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
1b940 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1b950 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72    /* Set the cur
1b960 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
1b970 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1b980 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  NONE and unlock 
1b990 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
1b9a0 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
1b9b0 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
1b9c0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1b9d0 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
1b9e0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
1b9f0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75  RANS_NONE;.    u
1ba00 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1ba10 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  ed(pBt);.  }..  
1ba20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1ba30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
1ba40 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1ba50 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
1ba60 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
1ba70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
1ba80 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
1ba90 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
1baa0 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
1bab0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
1bac0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1bad0 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
1bae0 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
1baf0 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
1bb00 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
1bb10 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
1bb20 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
1bb30 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1bb40 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
1bb50 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
1bb60 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
1bb70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
1bb80 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
1bb90 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
1bba0 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
1bbb0 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
1bbc0 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
1bbd0 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
1bbe0 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
1bbf0 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
1bc00 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
1bc10 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
1bc20 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
1bc30 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
1bc40 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
1bc50 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
1bc60 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
1bc70 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e  p locks..**.** N
1bc80 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  ormally, if an e
1bc90 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1bca0 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  e the pager laye
1bcb0 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20  r is attempting 
1bcc0 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20  to .** finalize 
1bcd0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a  the underlying j
1bce0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69  ournal file, thi
1bcf0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1bd00 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a  ns an error and.
1bd10 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  ** the upper lay
1bd20 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  er will attempt 
1bd30 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65  a rollback. Howe
1bd40 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f  ver, if the seco
1bd50 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
1bd60 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20  s non-zero then 
1bd70 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e  this b-tree tran
1bd80 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  saction is part 
1bd90 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
1bda0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
1bdb0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
1bdc0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
1bdd0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1bde0 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62  committed .** (b
1bdf0 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73  y deleting a mas
1be00 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1be10 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72  ) and the caller
1be20 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69   will ignore thi
1be30 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  s .** functions 
1be40 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c  return code. So,
1be50 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f   even if an erro
1be60 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
1be70 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20  pager layer,.** 
1be80 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65  reset the b-tree
1be90 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61   objects interna
1bea0 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63  l state to indic
1beb0 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69  ate that the wri
1bec0 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  te.** transactio
1bed0 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  n has been close
1bee0 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65  d. This is quite
1bef0 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61   safe, as the pa
1bf00 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a  ger will have.**
1bf10 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f   transitioned to
1bf20 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1bf30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
1bf40 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
1bf50 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
1bf60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1bf70 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
1bf80 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
1bf90 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
1bfa0 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
1bfb0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
1bfc0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1bfd0 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69  eTwo(Btree *p, i
1bfe0 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20  nt bCleanup){.. 
1bff0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1c000 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65  =TRANS_NONE ) re
1c010 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c020 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1c030 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
1c040 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
1c050 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
1c060 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
1c070 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
1c080 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
1c090 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
1c0a0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
1c0b0 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
1c0c0 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
1c0d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
1c0e0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1c0f0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
1c100 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  rc;.    BtShared
1c110 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1c120 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1c130 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1c140 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1c150 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1c160 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
1c170 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1c180 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1c190 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
1c1a0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
1c1b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c  SQLITE_OK && bCl
1c1c0 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  eanup==0 ){.    
1c1d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1c1e0 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
1c1f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1c200 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1c210 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
1c220 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65  AD;.    btreeCle
1c230 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
1c240 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  );.  }..  btreeE
1c250 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
1c260 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1c270 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1c280 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1c290 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
1c2a0 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
1c2b0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1c2c0 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
1c2d0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1c2e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1c2f0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
1c300 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1c310 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
1c320 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1c330 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1c340 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
1c350 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c  ommitPhaseTwo(p,
1c360 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
1c370 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1c380 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c390 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1c3a0 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
1c3b0 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
1c3c0 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
1c3d0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
1c3e0 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
1c3f0 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64  rsor on BtShared
1c400 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
1c410 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
1c420 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69  * Every cursor i
1c430 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  s tripped, inclu
1c440 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61  ding cursors tha
1c450 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f  t belong.** to o
1c460 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1c470 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
1c480 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72  appen to be shar
1c490 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  ing.** the cache
1c4a0 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
1c4b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c4c0 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
1c4d0 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
1c4e0 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73  urs..** All curs
1c4f0 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61  ors using the sa
1c500 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  me cache must be
1c510 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70   tripped.** to p
1c520 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d  revent them from
1c530 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
1c540 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a  he btree after.*
1c550 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  * the rollback. 
1c560 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
1c570 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74  y have deleted t
1c580 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65  ables.** or move
1c590 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f  d root pages, so
1c5a0 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69   it is not suffi
1c5b0 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65  cient to.** save
1c5c0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
1c5d0 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63  e cursor.  The c
1c5e0 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  ursor must be.**
1c5f0 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
1c600 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1c610 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1c620 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
1c630 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20  int errCode){.  
1c640 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
1c650 66 28 20 70 42 74 72 65 65 3d 3d 30 20 29 20 72  f( pBtree==0 ) r
1c660 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
1c670 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
1c680 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72  e);.  for(p=pBtr
1c690 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
1c6a0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1c6b0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1c6c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1c6d0 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  arCursor(p);.   
1c6e0 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
1c6f0 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70  SOR_FAULT;.    p
1c700 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72  ->skipNext = err
1c710 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Code;.    for(i=
1c720 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20  0; i<=p->iPage; 
1c730 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
1c740 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67  asePage(p->apPag
1c750 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  e[i]);.      p->
1c760 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
1c770 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1c780 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
1c790 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ree);.}../*.** R
1c7a0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
1c7b0 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
1c7c0 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72  ess.  All cursor
1c7d0 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76  s will be.** inv
1c7e0 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f  alided by this o
1c7f0 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61  peration.  Any a
1c800 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
1c810 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77  cursor.** that w
1c820 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62  as open at the b
1c830 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73  eginning of this
1c840 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20   operation will 
1c850 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20  result.** in an 
1c860 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  error..**.** Thi
1c870 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
1c880 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
1c890 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c8a0 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
1c8b0 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
1c8c0 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
1c8d0 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
1c8e0 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
1c8f0 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
1c900 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ack(Btree *p, in
1c910 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69  t tripCode){.  i
1c920 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
1c930 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1c940 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1c950 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  e1;..  sqlite3Bt
1c960 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
1c970 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  f( tripCode==SQL
1c980 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1c990 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61   = tripCode = sa
1c9a0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
1c9b0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 0);.  }else
1c9c0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1c9d0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
1c9e0 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20  tripCode ){.    
1c9f0 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
1ca00 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72  AllCursors(p, tr
1ca10 69 70 43 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 62  ipCode);.  }.  b
1ca20 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1ca30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
1ca40 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1ca50 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
1ca60 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52  ..    assert( TR
1ca70 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e  ANS_WRITE==pBt->
1ca80 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b  inTransaction );
1ca90 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
1caa0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1cab0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
1cac0 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
1cad0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1cae0 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20   = rc2;.    }.. 
1caf0 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61     /* The rollba
1cb00 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74  ck may have dest
1cb10 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31  royed the pPage1
1cb20 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20  ->aData value.  
1cb30 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  So.    ** call b
1cb40 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
1cb50 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
1cb60 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
1cb70 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
1cb80 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
1cb90 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72  . */.    if( btr
1cba0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
1cbb0 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
1cbc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cbd0 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65    int nPage = ge
1cbe0 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
1cbf0 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
1cc00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
1cc10 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Page==0 );.     
1cc20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20   if( nPage==0 ) 
1cc30 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1cc40 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1cc50 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
1cc60 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d    testcase( pBt-
1cc70 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b  >nPage!=nPage );
1cc80 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
1cc90 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
1cca0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
1ccb0 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
1ccc0 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c  assert( countVal
1ccd0 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31  idCursors(pBt, 1
1cce0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
1ccf0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1cd00 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
1cd10 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
1cd20 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
1cd30 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
1cd40 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
1cd50 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1cd60 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1cd70 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61  }../*.** Start a
1cd80 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
1cd90 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
1cda0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  ubtransaction ca
1cdb0 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n be rolled.** b
1cdc0 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
1cdd0 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72  y of the main tr
1cde0 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d  ansaction. You m
1cdf0 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
1ce00 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f  saction .** befo
1ce10 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75  re starting a su
1ce20 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
1ce30 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
1ce40 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61   is ended automa
1ce50 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74  tically .** if t
1ce60 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
1ce70 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72  ion commits or r
1ce80 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  olls back..**.**
1ce90 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   Statement subtr
1cea0 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75  ansactions are u
1ceb0 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76  sed around indiv
1cec0 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  idual SQL statem
1ced0 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ents.** that are
1cee0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
1cef0 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d  n a BEGIN...COMM
1cf00 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20  IT block.  If a 
1cf10 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72  constraint.** er
1cf20 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
1cf30 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  n the statement,
1cf40 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74   the effect of t
1cf50 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e  hat one statemen
1cf60 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c  t.** can be roll
1cf70 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ed back without 
1cf80 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  having to rollba
1cf90 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  ck the entire tr
1cfa0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1cfb0 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   A statement sub
1cfc0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
1cfd0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
1cfe0 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  n anonymous save
1cff0 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61  point. The.** va
1d000 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
1d010 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
1d020 65 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20  er is the total 
1d030 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f  number of savepo
1d040 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  ints,.** includi
1d050 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79  ng the new anony
1d060 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20  mous savepoint, 
1d070 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72  open on the B-Tr
1d080 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72  ee. i.e. if ther
1d090 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
1d0a0 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
1d0b0 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65  d no other state
1d0c0 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
1d0d0 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74  s open,.** iStat
1d0e0 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73  ement is 1. This
1d0f0 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
1d100 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65  oint can be rele
1d110 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  ased or rolled b
1d120 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ack.** using the
1d130 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
1d140 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f  epoint() functio
1d150 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
1d160 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28  3BtreeBeginStmt(
1d170 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53  Btree *p, int iS
1d180 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74  tatement){.  int
1d190 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
1d1a0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1d1b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1d1c0 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
1d1d0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1d1e0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
1d1f0 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
1d200 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
1d210 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ONLY)==0 );.  as
1d220 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
1d230 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1d240 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62  iStatement>p->db
1d250 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a  ->nSavepoint );.
1d260 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1d270 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1d280 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f  ANS_WRITE );.  /
1d290 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c  * At the pager l
1d2a0 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e  evel, a statemen
1d2b0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
1d2c0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74   a savepoint wit
1d2d0 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20  h.  ** an index 
1d2e0 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c  greater than all
1d2f0 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61   savepoints crea
1d300 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75  ted explicitly u
1d310 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74  sing.  ** SQL st
1d320 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20  atements. It is 
1d330 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c  illegal to open,
1d340 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
1d350 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75  back any.  ** su
1d360 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68  ch savepoints wh
1d370 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ile the statemen
1d380 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  t transaction sa
1d390 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
1d3a0 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
1d3b0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
1d3c0 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
1d3d0 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74  ager, iStatement
1d3e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1d3f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1d400 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d410 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
1d420 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
1d430 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c  ction, op, is al
1d440 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  ways SAVEPOINT_R
1d450 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41  OLLBACK.** or SA
1d460 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
1d470 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65   This function e
1d480 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f  ither releases o
1d490 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65  r rolls back the
1d4a0 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64  .** savepoint id
1d4b0 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
1d4c0 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74  meter iSavepoint
1d4d0 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
1d4e0 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  he value .** of 
1d4f0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  op..**.** Normal
1d500 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69  ly, iSavepoint i
1d510 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
1d520 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e  r equal to zero.
1d530 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20   However, if op 
1d540 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  is.** SAVEPOINT_
1d550 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69  ROLLBACK, then i
1d560 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c  Savepoint may al
1d570 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69  so be -1. In thi
1d580 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63  s case the .** c
1d590 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65  ontents of the e
1d5a0 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
1d5b0 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63  n are rolled bac
1d5c0 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65  k. This is diffe
1d5d0 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e  rent.** from a n
1d5e0 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f  ormal transactio
1d5f0 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e  n rollback, as n
1d600 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65  o locks are rele
1d610 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ased and the.** 
1d620 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61  transaction rema
1d630 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74  ins open..*/.int
1d640 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
1d650 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c  epoint(Btree *p,
1d660 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61   int op, int iSa
1d670 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
1d680 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d690 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e    if( p && p->in
1d6a0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1d6b0 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
1d6c0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1d6d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70  ;.    assert( op
1d6e0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
1d6f0 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50  ASE || op==SAVEP
1d700 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
1d710 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61  .    assert( iSa
1d720 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69  vepoint>=0 || (i
1d730 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26  Savepoint==-1 &&
1d740 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1d750 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20  OLLBACK) );.    
1d760 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1d770 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  r(p);.    rc = s
1d780 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
1d790 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
1d7a0 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74  , op, iSavepoint
1d7b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d7c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d7d0 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74    if( iSavepoint
1d7e0 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  <0 && (pBt->btsF
1d7f0 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49  lags & BTS_INITI
1d800 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29  ALLY_EMPTY)!=0 )
1d810 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e  {.        pBt->n
1d820 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
1d830 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77  }.      rc = new
1d840 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
1d850 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
1d860 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b 20  = get4byte(28 + 
1d870 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1d880 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  ta);..      /* T
1d890 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1d8a0 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74   was written int
1d8b0 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38 20  o the offset 28 
1d8c0 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20 20  of the header.  
1d8d0 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20      ** when the 
1d8e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72  transaction star
1d8f0 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20  ted, so we know 
1d900 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 61  that the value a
1d910 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a  t offset.      *
1d920 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e  * 28 is nonzero.
1d930 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1d940 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29  ( pBt->nPage>0 )
1d950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1d960 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1d970 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1d980 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
1d990 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  te a new cursor 
1d9a0 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68  for the BTree wh
1d9b0 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74  ose root is on t
1d9c0 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c  he page.** iTabl
1d9d0 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c  e. If a read-onl
1d9e0 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  y cursor is requ
1d9f0 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73 73  ested, it is ass
1da00 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
1da10 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20   caller already 
1da20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20 72  has at least a r
1da30 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
1da40 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20  tion open.** on 
1da50 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72  the database alr
1da60 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74 65  eady. If a write
1da70 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65  -cursor is reque
1da80 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sted, then.** th
1da90 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75  e caller is assu
1daa0 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f  med to have an o
1dab0 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
1dac0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
1dad0 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20  wrFlag==0, then 
1dae0 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
1daf0 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20  nly be used for 
1db00 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77  reading..** If w
1db10 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74  rFlag==1, then t
1db20 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65  he cursor can be
1db30 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
1db40 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74  g or for.** writ
1db50 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
1db60 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
1db70 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74  ing are also met
1db80 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20  .  These.** are 
1db90 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
1dba0 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
1dbb0 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69  in order for wri
1dbc0 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c  ting to.** be al
1dbd0 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
1dbe0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
1dbf0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
1dc00 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31  d with wrFlag==1
1dc10 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72  .**.** 2:  Other
1dc20 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1dc30 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65  tions that share
1dc40 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20   the same pager 
1dc50 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74  cache.**     but
1dc60 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69   which are not i
1dc70 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d  n the READ_UNCOM
1dc80 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79  MITTED state may
1dc90 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20   not have.**    
1dca0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69   cursors open wi
1dcb0 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20  th wrFlag==0 on 
1dcc0 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20  the same table. 
1dcd0 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20   Otherwise.**   
1dce0 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61    the changes ma
1dcf0 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65  de by this write
1dd00 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65   cursor would be
1dd10 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20   visible to.**  
1dd20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73     the read curs
1dd30 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  ors in the other
1dd40 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1dd50 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20  tion..**.** 3:  
1dd60 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  The database mus
1dd70 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e  t be writable (n
1dd80 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  ot on read-only 
1dd90 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20  media).**.** 4: 
1dda0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
1ddb0 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  n active transac
1ddc0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63  tion..**.** No c
1ddd0 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20  hecking is done 
1dde0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
1ddf0 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65  t page iTable re
1de00 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72  ally is the.** r
1de10 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
1de20 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20  tree.  If it is 
1de30 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  not, then the cu
1de40 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a  rsor acquired.**
1de50 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63   will not work c
1de60 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20  orrectly..**.** 
1de70 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
1de80 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  at the sqlite3Bt
1de90 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20  reeCursorZero() 
1dea0 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a  has been called.
1deb0 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e  ** on pCur to in
1dec0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d  itialize the mem
1ded0 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f 72 20  ory space prior 
1dee0 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
1def0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
1df00 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72  tic int btreeCur
1df10 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
1df20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1df40 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
1df50 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df70 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
1df80 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
1df90 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
1dfa0 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
1dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfc0 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
1dfd0 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
1dfe0 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
1dff0 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
1e000 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1e010 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73   arg to comparis
1e020 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  on function */. 
1e030 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
1e040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e050 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
1e060 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20   for new cursor 
1e070 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
1e080 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20   *pBt = p->pBt; 
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e0a0 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65 20  * Shared b-tree 
1e0b0 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  handle */..  ass
1e0c0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1e0d0 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
1e0e0 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
1e0f0 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d  ag==0 || wrFlag=
1e100 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  =1 );..  /* The 
1e110 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1e120 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69   statements veri
1e130 66 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20  fy that if this 
1e140 69 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20  is a sharable . 
1e150 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62   ** b-tree datab
1e160 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74  ase, the connect
1e170 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ion is holding t
1e180 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1e190 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61  e locks, .  ** a
1e1a0 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  nd that no other
1e1b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
1e1c0 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20  any open cursor 
1e1d0 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77  that conflicts w
1e1e0 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c  ith .  ** this l
1e1f0 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
1e200 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68  t( hasSharedCach
1e210 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  eTableLock(p, iT
1e220 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d  able, pKeyInfo!=
1e230 30 2c 20 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a  0, wrFlag+1) );.
1e240 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1e250 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43  ==0 || !hasReadC
1e260 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62  onflicts(p, iTab
1e270 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  le) );..  /* Ass
1e280 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c  ert that the cal
1e290 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74  ler has opened t
1e2a0 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61 6e  he required tran
1e2b0 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73  saction. */.  as
1e2c0 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
1e2d0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
1e2e0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
1e2f0 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73  =0 || p->inTrans
1e300 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1e310 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1e320 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70  pPage1 && pBt->p
1e330 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
1e340 0a 20 20 69 66 28 20 4e 45 56 45 52 28 77 72 46  .  if( NEVER(wrF
1e350 6c 61 67 20 26 26 20 28 70 42 74 2d 3e 62 74 73  lag && (pBt->bts
1e360 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
1e370 5f 4f 4e 4c 59 29 21 3d 30 29 20 29 7b 0a 20 20  _ONLY)!=0) ){.  
1e380 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e390 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
1e3a0 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26  if( iTable==1 &&
1e3b0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
1e3c0 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  pBt)==0 ){.    a
1e3d0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
1e3e0 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d   );.    iTable =
1e3f0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f   0;.  }..  /* No
1e400 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  w that no other 
1e410 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72  errors can occur
1e420 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67  , finish filling
1e430 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72   in the BtCursor
1e440 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  .  ** variables 
1e450 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72  and link the cur
1e460 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53  sor into the BtS
1e470 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a  hared list.  */.
1e480 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
1e490 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b   = (Pgno)iTable;
1e4a0 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d  .  pCur->iPage =
1e4b0 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65   -1;.  pCur->pKe
1e4c0 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
1e4d0 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65  ;.  pCur->pBtree
1e4e0 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42   = p;.  pCur->pB
1e4f0 74 20 3d 20 70 42 74 3b 0a 20 20 61 73 73 65 72  t = pBt;.  asser
1e500 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
1e510 77 72 46 6c 61 67 3d 3d 42 54 43 46 5f 57 72 69  wrFlag==BTCF_Wri
1e520 74 65 46 6c 61 67 20 29 3b 0a 20 20 70 43 75 72  teFlag );.  pCur
1e530 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46  ->curFlags = wrF
1e540 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65  lag;.  pCur->pNe
1e550 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  xt = pBt->pCurso
1e560 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  r;.  if( pCur->p
1e570 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72  Next ){.    pCur
1e580 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
1e590 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74   pCur;.  }.  pBt
1e5a0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
1e5b0 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
1e5c0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1e5d0 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  D;.  return SQLI
1e5e0 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  TE_OK;.}.int sql
1e5f0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
1e600 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
1e610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e630 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
1e640 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1e650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e670 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
1e680 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
1e690 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
1e6c0 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
1e6d0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
1e6e0 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
1e6f0 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
1e700 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1e710 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65   arg to xCompare
1e720 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  () */.  BtCursor
1e730 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
1e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e750 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
1e760 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a   cursor here */.
1e770 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1e780 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1e790 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  (p);.  rc = btre
1e7a0 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c  eCursor(p, iTabl
1e7b0 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49  e, wrFlag, pKeyI
1e7c0 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71  nfo, pCur);.  sq
1e7d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1e7e0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1e7f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1e800 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42   the size of a B
1e810 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69  tCursor object i
1e820 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  n bytes..**.** T
1e830 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69  his interfaces i
1e840 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74  s needed so that
1e850 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72   users of cursor
1e860 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74  s can preallocat
1e870 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20  e.** sufficient 
1e880 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20  storage to hold 
1e890 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42  a cursor.  The B
1e8a0 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69  tCursor object i
1e8b0 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75  s opaque.** to u
1e8c0 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e  sers so they can
1e8d0 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f  not do the sizeo
1e8e0 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d  f() themselves -
1e8f0 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a   they must call.
1e900 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
1e910 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1e920 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76  treeCursorSize(v
1e930 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52  oid){.  return R
1e940 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43  OUND8(sizeof(BtC
1e950 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ursor));.}../*.*
1e960 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d  * Initialize mem
1e970 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ory that will be
1e980 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
1e990 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
1e9a0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d  t..**.** The sim
1e9b0 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72  ple approach her
1e9c0 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65  e would be to me
1e9d0 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72  mset() the entir
1e9e0 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a  e object.** to z
1e9f0 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72  ero.  But it tur
1ea00 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  ns out that the 
1ea10 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49  apPage[] and aiI
1ea20 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64  dx[] arrays.** d
1ea30 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  o not need to be
1ea40 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79   zeroed and they
1ea50 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77   are large, so w
1ea60 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74  e can save a lot
1ea70 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20  .** of run-time 
1ea80 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20  by skipping the 
1ea90 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
1eaa0 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73  f those elements
1eab0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1eac0 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
1ead0 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  (BtCursor *p){. 
1eae0 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66   memset(p, 0, of
1eaf0 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c  fsetof(BtCursor,
1eb00 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a   iPage));.}../*.
1eb10 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
1eb20 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63  r.  The read loc
1eb30 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1eb40 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73  e file is releas
1eb50 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c  ed.** when the l
1eb60 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c  ast cursor is cl
1eb70 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
1eb80 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
1eb90 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
1eba0 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  Cur){.  Btree *p
1ebb0 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42  Btree = pCur->pB
1ebc0 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72  tree;.  if( pBtr
1ebd0 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ee ){.    int i;
1ebe0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1ebf0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
1ec00 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1ec10 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
1ec20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1ec30 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
1ec40 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
1ec50 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70  pPrev ){.      p
1ec60 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  Cur->pPrev->pNex
1ec70 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  t = pCur->pNext;
1ec80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ec90 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
1eca0 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
1ecb0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
1ecc0 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
1ecd0 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
1ece0 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65  rev = pCur->pPre
1ecf0 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  v;.    }.    for
1ed00 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
1ed10 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
1ed20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
1ed30 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
1ed40 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b      }.    unlock
1ed50 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
1ed60 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  t);.    sqlite3D
1ed70 62 46 72 65 65 28 70 42 74 72 65 65 2d 3e 64 62  bFree(pBtree->db
1ed80 2c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  , pCur->aOverflo
1ed90 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  w);.    /* sqlit
1eda0 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a  e3_free(pCur); *
1edb0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
1edc0 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
1edd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1ede0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1edf0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
1ee00 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20  BtCursor* given 
1ee10 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
1ee20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42  has a valid.** B
1ee30 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72  tCursor.info str
1ee40 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69  ucture.  If it i
1ee50 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
1ee60 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72  lid, call.** btr
1ee70 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f  eeParseCell() to
1ee80 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a   fill it in..**.
1ee90 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
1eea0 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74   is a cache of t
1eeb0 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
1eec0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65  n the current ce
1eed0 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  ll..** Using thi
1eee0 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20  s cache reduces 
1eef0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
1ef00 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73  lls to btreePars
1ef10 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32  eCell()..**.** 2
1ef20 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72  007-06-25:  Ther
1ef30 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f  e is a bug in so
1ef40 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d  me versions of M
1ef50 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74  SVC that cause t
1ef60 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74  he.** compiler t
1ef70 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74  o crash when get
1ef80 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d  CellInfo() is im
1ef90 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d  plemented as a m
1efa0 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65  acro..** But the
1efb0 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61  re is a measurea
1efc0 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74  ble speed advant
1efd0 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65  age to using the
1efe0 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a   macro on gcc.**
1eff0 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70   (when less comp
1f000 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  iler optimizatio
1f010 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d  ns like -Os or -
1f020 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20  O0 are used and 
1f030 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
1f040 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 67  is not doing agg
1f050 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67  ressive inlining
1f060 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61 20  .)  So we use a 
1f070 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  real function.**
1f080 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20   for MSVC and a 
1f090 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74  macro for everyt
1f0a0 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b  hing else.  Tick
1f0b0 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66  et #2457..*/.#if
1f0c0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74  ndef NDEBUG.  st
1f0d0 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
1f0e0 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
1f0f0 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65  r *pCur){.    Ce
1f100 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
1f110 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1f120 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65  r->iPage;.    me
1f130 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
1f140 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
1f150 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
1f160 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1f170 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64  age], pCur->aiId
1f180 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29  x[iPage], &info)
1f190 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f  ;.    assert( CO
1f1a0 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63  RRUPT_DB || memc
1f1b0 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d  mp(&info, &pCur-
1f1c0 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e  >info, sizeof(in
1f1d0 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23  fo))==0 );.  }.#
1f1e0 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61  else.  #define a
1f1f0 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29  ssertCellInfo(x)
1f200 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
1f210 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65  MSC_VER.  /* Use
1f220 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
1f230 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b   in MSVC to work
1f240 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20   around bugs in 
1f250 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a  that compiler. *
1f260 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  /.  static void 
1f270 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  getCellInfo(BtCu
1f280 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
1f290 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1f2a0 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
1f2b0 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
1f2c0 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20  ur->iPage;.     
1f2d0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1f2e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
1f2f0 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
1f300 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
1f310 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  fo);.      pCur-
1f320 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
1f330 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
1f340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1f350 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
1f360 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  r);.    }.  }.#e
1f370 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d  lse /* if not _M
1f380 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55  SC_VER */.  /* U
1f390 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c  se a macro in al
1f3a0 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72  l other compiler
1f3b0 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75  s so that the fu
1f3c0 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65  nction is inline
1f3d0 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74  d */.#define get
1f3e0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20  CellInfo(pCur)  
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f420 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72      \.  if( pCur
1f430 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
1f440 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
1f450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f470 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69       \.    int i
1f480 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
1f490 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1f4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4c0 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74 72 65        \.    btre
1f4d0 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
1f4e0 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70  >apPage[iPage],p
1f4f0 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
1f500 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20  ],&pCur->info); 
1f510 20 20 20 20 20 20 20 5c 0a 20 20 20 20 70 43 75         \.    pCu
1f520 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
1f530 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 20 20  TCF_ValidNKey;  
1f540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f560 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73          \.  }els
1f570 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e{              
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5b0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61           \.    a
1f5c0 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
1f5d0 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ur);            
1f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f600 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a            \.  }.
1f610 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56  #endif /* _MSC_V
1f620 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e  ER */..#ifndef N
1f630 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65  DEBUG  /* The ne
1f640 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  xt routine used 
1f650 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
1f660 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1f670 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  */./*.** Return 
1f680 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65  true if the give
1f690 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61  n BtCursor is va
1f6a0 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75  lid.  A valid cu
1f6b0 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74  rsor is one.** t
1f6c0 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
1f6d0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72   pointing to a r
1f6e0 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70  ow in a (non-emp
1f6f0 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  ty) table..** Th
1f700 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61  is is a verifica
1f710 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20  tion routine is 
1f720 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
1f730 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1f740 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
1f750 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
1f760 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20  sValid(BtCursor 
1f770 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
1f780 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65   pCur && pCur->e
1f790 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1f7a0 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  LID;.}.#endif /*
1f7b0 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a   NDEBUG */../*.*
1f7c0 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
1f7d0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1f7e0 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f  buffer needed to
1f7f0 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20   hold the value 
1f800 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f  of.** the key fo
1f810 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
1f820 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72  try.  If the cur
1f830 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
1f840 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
1f850 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20  d entry, *pSize 
1f860 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a  is set to 0. .**
1f870 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20  .** For a table 
1f880 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20  with the INTKEY 
1f890 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72  flag set, this r
1f8a0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
1f8b0 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66  he key.** itself
1f8c0 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72  , not the number
1f8d0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
1f8e0 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   key..**.** The 
1f8f0 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69  caller must posi
1f900 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20  tion the cursor 
1f910 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e  prior to invokin
1f920 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
1f930 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
1f940 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ine cannot fail.
1f950 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74 75    It always retu
1f960 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20  rns SQLITE_OK.  
1f970 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1f980 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75  treeKeySize(BtCu
1f990 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
1f9a0 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  *pSize){.  asser
1f9b0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1f9c0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1f9d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1f9e0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1f9f0 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
1fa00 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1fa10 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  D );.  if( pCur-
1fa20 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
1fa30 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 53  VALID ){.    *pS
1fa40 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ize = 0;.  }else
1fa50 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66  {.    getCellInf
1fa60 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 2a 70 53  o(pCur);.    *pS
1fa70 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
1fa80 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74  .nKey;.  }.  ret
1fa90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1faa0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
1fab0 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ze to the number
1fac0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
1fad0 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  a in the entry t
1fae0 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72  he.** cursor cur
1faf0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
1fb00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
1fb10 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  er must guarante
1fb20 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
1fb30 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1fb40 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76   a non-NULL.** v
1fb50 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20  alid entry.  In 
1fb60 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
1fb70 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
1fb80 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  re must guarante
1fb90 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75  e.** that the cu
1fba0 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e  rsor has Cursor.
1fbb0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1fbc0 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c  ALID..**.** Fail
1fbd0 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  ure is not possi
1fbe0 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ble.  This funct
1fbf0 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72  ion always retur
1fc00 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
1fc10 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61   It might just a
1fc20 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63  s well be a proc
1fc30 65 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67  edure (returning
1fc40 20 76 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f   void) but we co
1fc50 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74  ntinue.** to ret
1fc60 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72  urn an integer r
1fc70 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68  esult code for h
1fc80 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e  istorical reason
1fc90 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1fca0 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42  3BtreeDataSize(B
1fcb0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
1fcc0 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73  32 *pSize){.  as
1fcd0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1fce0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1fcf0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1fd00 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1fd10 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
1fd20 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
1fd30 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 6e 74  Cur->iPage]->int
1fd40 4b 65 79 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43  Key==1 );.  getC
1fd50 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1fd60 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
1fd70 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20  info.nPayload;. 
1fd80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fd90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  K;.}../*.** Give
1fda0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
1fdb0 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r of an overflow
1fdc0 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
1fdd0 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72  abase (parameter
1fde0 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20  .** ovfl), this 
1fdf0 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74  function finds t
1fe00 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1fe10 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
1fe20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65  in the .** linke
1fe30 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c  d list of overfl
1fe40 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73  ow pages. If pos
1fe50 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74  sible, it uses t
1fe60 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  he auto-vacuum.*
1fe70 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61  * pointer-map da
1fe80 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65  ta instead of re
1fe90 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  ading the conten
1fea0 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74  t of page ovfl t
1feb0 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20  o do so. .**.** 
1fec0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1fed0 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rs an SQLite err
1fee0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1fef0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a  ned. Otherwise:.
1ff00 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e  **.** The page n
1ff10 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
1ff20 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1ff30 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
1ff40 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65  st is .** writte
1ff50 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e  n to *pPgnoNext.
1ff60 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73   If page ovfl is
1ff70 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
1ff80 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a  n its linked .**
1ff90 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78   list, *pPgnoNex
1ffa0 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
1ffb0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61  . .**.** If ppPa
1ffc0 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
1ffd0 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20  and a reference 
1ffe0 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
1fff0 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64  bject correspond
20000 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e  ing.** to page n
20010 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20  umber pOvfl was 
20020 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a  obtained, then *
20030 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
20040 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a   point to that.*
20050 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20  * reference. It 
20060 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
20070 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
20080 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65  ler to call rele
20090 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20  asePage().** on 
200a0 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20  *ppPage to free 
200b0 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49  the reference. I
200c0 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77  n no reference w
200d0 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63  as obtained (bec
200e0 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e  ause.** the poin
200f0 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64  ter-map was used
20100 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76   to obtain the v
20110 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e  alue for *pPgnoN
20120 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70  ext), then.** *p
20130 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
20140 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
20150 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  int getOverflowP
20160 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
20170 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
20180 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
20190 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
201a0 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20  no ovfl,        
201b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
201c0 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  rrent overflow p
201d0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
201e0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
201f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
20200 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e  OUT: MemPage han
20210 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c  dle (may be NULL
20220 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  ) */.  Pgno *pPg
20230 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20  noNext          
20240 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74      /* OUT: Next
20250 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
20260 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67  umber */.){.  Pg
20270 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d  no next = 0;.  M
20280 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
20290 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
202a0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
202b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
202c0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
202d0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70  x) );.  assert(p
202e0 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e  PgnoNext);..#ifn
202f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20300 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
20310 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20  Try to find the 
20320 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
20330 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75   overflow list u
20340 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75  sing the.  ** au
20350 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72  tovacuum pointer
20360 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73  -map pages. Gues
20370 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  s that the next 
20380 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68  page in .  ** th
20390 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
203a0 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  is page number (
203b0 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74  ovfl+1). If that
203c0 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20   guess turns .  
203d0 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f  ** out to be wro
203e0 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ng, fall back to
203f0 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74   loading the dat
20400 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20  a of page .  ** 
20410 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64  number ovfl to d
20420 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78  etermine the nex
20430 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20  t page number.. 
20440 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61   */.  if( pBt->a
20450 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
20460 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20   Pgno pgno;.    
20470 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76  Pgno iGuess = ov
20480 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79  fl+1;.    u8 eTy
20490 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  pe;..    while( 
204a0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
204b0 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47  t, iGuess) || iG
204c0 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  uess==PENDING_BY
204d0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
204e0 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a        iGuess++;.
204f0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
20500 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65  Guess<=btreePage
20510 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
20520 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
20530 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20  et(pBt, iGuess, 
20540 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a  &eType, &pgno);.
20550 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
20560 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65  LITE_OK && eType
20570 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
20580 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c  W2 && pgno==ovfl
20590 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74   ){.        next
205a0 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20   = iGuess;.     
205b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
205c0 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
205d0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
205e0 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30   assert( next==0
205f0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44   || rc==SQLITE_D
20600 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  ONE );.  if( rc=
20610 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20620 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
20630 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  age(pBt, ovfl, &
20640 70 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d  pPage, (ppPage==
20650 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  0) ? PAGER_GET_R
20660 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20  EADONLY : 0);.  
20670 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
20680 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
20690 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ==0 );.    if( r
206a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
206b0 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
206c0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
206d0 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ta);.    }.  }..
206e0 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e    *pPgnoNext = n
206f0 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67  ext;.  if( ppPag
20700 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  e ){.    *ppPage
20710 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73   = pPage;.  }els
20720 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  e{.    releasePa
20730 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
20740 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
20750 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54  ITE_DONE ? SQLIT
20760 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f  E_OK : rc);.}../
20770 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66  *.** Copy data f
20780 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20  rom a buffer to 
20790 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20  a page, or from 
207a0 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66  a page to a buff
207b0 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f  er..**.** pPaylo
207c0 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ad is a pointer 
207d0 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f  to data stored o
207e0 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
207f0 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61  pDbPage..** If a
20800 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66  rgument eOp is f
20810 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65  alse, then nByte
20820 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61   bytes of data a
20830 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f  re copied.** fro
20840 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68  m pPayload to th
20850 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
20860 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20   at by pBuf. If 
20870 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20  eOp is true,.** 
20880 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65  then sqlite3Page
20890 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
208a0 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e  ed on pDbPage an
208b0 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a  d nByte bytes.**
208c0 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
208d0 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66  ied from the buf
208e0 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79  fer pBuf to pPay
208f0 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  load..**.** SQLI
20900 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
20910 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74  d on success, ot
20920 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
20930 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
20940 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64   int copyPayload
20950 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f  (.  void *pPaylo
20960 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad,           /*
20970 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
20980 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
20990 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
209a0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
209b0 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  to buffer */.  i
209c0 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
209d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
209e0 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63  er of bytes to c
209f0 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  opy */.  int eOp
20a00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20a10 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20     /* 0 -> copy 
20a20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20  from page, 1 -> 
20a30 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a  copy to page */.
20a40 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
20a50 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e           /* P
20a60 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  age containing p
20a70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20  Payload */.){.  
20a80 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f  if( eOp ){.    /
20a90 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
20aa0 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20   buffer to page 
20ab0 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  (a write operati
20ac0 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  on) */.    int r
20ad0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20ae0 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
20af0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20b00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
20b10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
20b20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
20b30 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  oad, pBuf, nByte
20b40 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20b50 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
20b60 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72  m page to buffer
20b70 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69   (a read operati
20b80 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70  on) */.    memcp
20b90 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64  y(pBuf, pPayload
20ba0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
20bb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20bc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
20bd0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
20be0 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72   to read or over
20bf0 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e  write payload in
20c00 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72  formation.** for
20c10 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
20c20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20  the pCur cursor 
20c30 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
20c40 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d  The eOp.** argum
20c50 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65 74  ent is interpret
20c60 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
20c70 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70  *.**   0: The op
20c80 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61  eration is a rea
20c90 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  d. Populate the 
20ca0 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
20cb0 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72  **   1: The oper
20cc0 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65  ation is a write
20cd0 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
20ce0 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
20cf0 2a 20 20 20 32 3a 20 54 68 65 20 6f 70 65 72 61  *   2: The opera
20d00 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20  tion is a read. 
20d10 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20  Do not populate 
20d20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63  the overflow cac
20d30 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61  he..**.** A tota
20d40 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73  l of "amt" bytes
20d50 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69   are read or wri
20d60 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61  tten beginning a
20d70 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44  t "offset"..** D
20d80 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f  ata is read to o
20d90 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  r from the buffe
20da0 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68  r pBuf..**.** Th
20db0 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20  e content being 
20dc0 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
20dd0 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20  might appear on 
20de0 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a  the main page.**
20df0 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64   or be scattered
20e00 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65   out on multiple
20e10 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
20e20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
20e30 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74  rrent cursor ent
20e40 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d  ry uses one or m
20e50 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
20e60 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f  es and the.** eO
20e70 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  p argument is no
20e80 74 20 32 2c 20 74 68 69 73 20 66 75 6e 63 74 69  t 2, this functi
20e90 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20  on may allocate 
20ea0 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
20eb0 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74  zily .** populat
20ec0 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  es the overflow 
20ed0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
20ee0 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
20ef0 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20  aOverflow). .** 
20f00 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
20f10 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20   use this cache 
20f20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20  to make seeking 
20f30 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
20f40 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20  offset .** more 
20f50 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
20f60 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
20f70 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
20f80 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
20f90 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a  ated, it may be.
20fa0 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69  ** invalidated i
20fb0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72  f some other cur
20fc0 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68  sor writes to th
20fd0 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72  e same table, or
20fe0 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f   if.** the curso
20ff0 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20  r is moved to a 
21000 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41  different row. A
21010 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20  dditionally, in 
21020 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d  auto-vacuum.** m
21030 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ode, the followi
21040 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e  ng events may in
21050 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72  validate an over
21060 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
21070 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ache..**.**   * 
21080 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  An incremental v
21090 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20  acuum,.**   * A 
210a0 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76  commit in auto_v
210b0 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64  acuum="full" mod
210c0 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69  e,.**   * Creati
210d0 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20  ng a table (may 
210e0 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
210f0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29  n overflow page)
21100 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21110 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20  accessPayload(. 
21120 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
21130 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
21140 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
21150 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
21160 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20  /.  u32 offset, 
21170 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
21180 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66  n reading this f
21190 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20  ar into payload 
211a0 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20  */.  u32 amt,   
211b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
211c0 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
211d0 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
211e0 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57  char *pBuf, /* W
211f0 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69  rite the bytes i
21200 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
21210 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20  */ .  int eOp   
21220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65             /* ze
21230 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d  ro to read. non-
21240 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a  zero to write. *
21250 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
21260 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a  char *aPayload;.
21270 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
21280 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78  E_OK;.  int iIdx
21290 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
212a0 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
212b0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
212c0 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67  e]; /* Btree pag
212d0 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74  e of current ent
212e0 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ry */.  BtShared
212f0 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
21300 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
21310 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69      /* Btree thi
21320 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73  s cursor belongs
21330 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51   to */.#ifdef SQ
21340 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
21350 46 4c 4f 57 5f 52 45 41 44 0a 20 20 69 6e 74 20  FLOW_READ.  int 
21360 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  bEnd;           
21370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21380 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
21390 69 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e  if reading to en
213a0 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e  d of data */.#en
213b0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
213c0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
213d0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
213e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
213f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
21400 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
21410 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
21420 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
21430 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
21440 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
21450 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65   eOp!=2 || offse
21460 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  t==0 );      /* 
21470 41 6c 77 61 79 73 20 73 74 61 72 74 20 66 72 6f  Always start fro
21480 6d 20 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20  m beginning for 
21490 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74  eOp==2 */..  get
214a0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
214b0 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
214c0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
214d0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
214e0 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
214f0 52 45 41 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66  READ.  bEnd = of
21500 66 73 65 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e  fset+amt==pCur->
21510 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23  info.nPayload;.#
21520 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
21530 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43  offset+amt <= pC
21540 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
21550 64 20 29 3b 0a 0a 20 20 69 66 28 20 26 61 50 61  d );..  if( &aPa
21560 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
21570 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67  .nLocal] > &pPag
21580 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73  e->aData[pBt->us
21590 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20  ableSize] ){.   
215a0 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
215b0 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
215c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
215d0 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
215e0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
215f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
21600 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  PT;.  }..  /* Ch
21610 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
21620 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
21630 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
21640 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
21650 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
21660 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
21670 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
21680 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
21690 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
216a0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
216b0 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
216c0 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
216d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
216e0 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
216f0 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
21700 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20  pBuf, a, (eOp & 
21710 30 78 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44  0x01), pPage->pD
21720 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73  bPage);.    offs
21730 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66  et = 0;.    pBuf
21740 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d   += a;.    amt -
21750 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
21760 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72    offset -= pCur
21770 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
21780 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
21790 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
217a0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33   ){.    const u3
217b0 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74  2 ovflSize = pBt
217c0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
217d0 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74  ;  /* Bytes cont
217e0 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67  ent per ovfl pag
217f0 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65  e */.    Pgno ne
21800 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78  xtPage;..    nex
21810 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
21820 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d  (&aPayload[pCur-
21830 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a  >info.nLocal]);.
21840 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42  .    /* If the B
21850 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
21860 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  w[] has not been
21870 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
21880 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20  cate it now..   
21890 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e   ** Except, do n
218a0 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65  ot allocate aOve
218b0 72 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d  rflow[] for eOp=
218c0 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  =2..    **.    *
218d0 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  * The aOverflow[
218e0 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64  ] array is sized
218f0 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f   at one entry fo
21900 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20  r each overflow 
21910 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74  page.    ** in t
21920 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
21930 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  n. The page numb
21940 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
21950 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
21960 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69  .    ** stored i
21970 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20  n aOverflow[0], 
21980 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  etc. A value of 
21990 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c  0 in the aOverfl
219a0 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a  ow[] array.    *
219b0 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74  * means "not yet
219c0 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63   known" (the cac
219d0 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70  he is lazily pop
219e0 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a  ulated)..    */.
219f0 20 20 20 20 69 66 28 20 65 4f 70 21 3d 32 20 26      if( eOp!=2 &
21a00 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  & (pCur->curFlag
21a10 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
21a20 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  fl)==0 ){.      
21a30 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75  int nOvfl = (pCu
21a40 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
21a50 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  -pCur->info.nLoc
21a60 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f  al+ovflSize-1)/o
21a70 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  vflSize;.      i
21a80 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e  f( nOvfl>pCur->n
21a90 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  OvflAlloc ){.   
21aa0 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20       Pgno *aNew 
21ab0 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33  = (Pgno*)sqlite3
21ac0 44 62 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  DbRealloc(.     
21ad0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 42 74         pCur->pBt
21ae0 72 65 65 2d 3e 64 62 2c 20 70 43 75 72 2d 3e 61  ree->db, pCur->a
21af0 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a  Overflow, nOvfl*
21b00 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20  2*sizeof(Pgno). 
21b10 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
21b20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
21b30 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21b40 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
21b50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21b60 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76         pCur->nOv
21b70 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a  flAlloc = nOvfl*
21b80 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  2;.          pCu
21b90 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61  r->aOverflow = a
21ba0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  New;.        }. 
21bb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
21bc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21bd0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
21be0 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  (pCur->aOverflow
21bf0 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f  , 0, nOvfl*sizeo
21c00 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  f(Pgno));.      
21c10 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
21c20 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76   |= BTCF_ValidOv
21c30 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  fl;.      }.    
21c40 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
21c50 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
21c60 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
21c70 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
21c80 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72   the.    ** entr
21c90 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
21ca0 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f  required overflo
21cb0 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c  w page is valid,
21cc0 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72   skip.    ** dir
21cd0 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20  ectly to it..   
21ce0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75   */.    if( (pCu
21cf0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
21d00 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30  CF_ValidOvfl)!=0
21d10 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
21d20 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53  low[offset/ovflS
21d30 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49  ize] ){.      iI
21d40 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66  dx = (offset/ovf
21d50 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65  lSize);.      ne
21d60 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
21d70 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a  Overflow[iIdx];.
21d80 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28        offset = (
21d90 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29  offset%ovflSize)
21da0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
21db0 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( ; rc==SQLITE_O
21dc0 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65  K && amt>0 && ne
21dd0 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b  xtPage; iIdx++){
21de0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65  ..      /* If re
21df0 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65  quired, populate
21e00 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
21e10 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a  ge-list cache. *
21e20 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 43 75  /.      if( (pCu
21e30 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
21e40 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30  CF_ValidOvfl)!=0
21e50 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
21e60 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt(!pCur->aOverf
21e70 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75  low[iIdx] || pCu
21e80 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
21e90 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20  x]==nextPage);. 
21ea0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
21eb0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e  erflow[iIdx] = n
21ec0 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  extPage;.      }
21ed0 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73  ..      if( offs
21ee0 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  et>=ovflSize ){.
21ef0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
21f00 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65  nly reason to re
21f10 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20  ad this page is 
21f20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61  to obtain the pa
21f30 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
21f40 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78  mber for the nex
21f50 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
21f60 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
21f70 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
21f80 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65  * data is not re
21f90 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74  quired. So first
21fa0 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74   try to lookup t
21fb0 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20  he overflow.    
21fc0 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74      ** page-list
21fd0 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20   cache, if any, 
21fe0 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74  then fall back t
21ff0 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f  o the getOverflo
22000 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20  wPage().        
22010 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ** function..   
22020 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
22030 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
22040 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
22050 61 79 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  ay must be alloc
22060 61 74 65 64 20 62 65 63 61 75 73 65 20 65 4f 70  ated because eOp
22070 21 3d 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  !=2.        ** h
22080 65 72 65 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c  ere.  If eOp==2,
22090 20 74 68 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20   then offset==0 
220a0 61 6e 64 20 74 68 69 73 20 62 72 61 6e 63 68 20  and this branch 
220b0 69 73 20 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a  is never taken..
220c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
220d0 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d     assert( eOp!=
220e0 32 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  2 );.        ass
220f0 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46 6c  ert( pCur->curFl
22100 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
22110 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  Ovfl );.        
22120 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
22130 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20  low[iIdx+1] ){. 
22140 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
22150 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
22160 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20  low[iIdx+1];.   
22170 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22180 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
22190 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
221a0 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65  nextPage, 0, &ne
221b0 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
221c0 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65   }.        offse
221d0 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20  t -= ovflSize;. 
221e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
221f0 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72      /* Need to r
22200 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72  ead this page pr
22210 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61  operly. It conta
22220 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a  ins some of the.
22230 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65          ** range
22240 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73   of data that is
22250 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70   being read (eOp
22260 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20  ==0) or written 
22270 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20  (eOp!=0)..      
22280 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
22290 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
222a0 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20  OW_READ.        
222b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
222c0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
222d0 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
222e0 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
222f0 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
22300 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d  ){.          a =
22310 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
22320 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23  et;.        }..#
22330 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
22340 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
22350 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  D.        /* If 
22360 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  all the followin
22370 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  g are true:.    
22380 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
22390 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61  *   1) this is a
223a0 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c   read operation,
223b0 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a   and .        **
223c0 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65     2) data is re
223d0 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20  quired from the 
223e0 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76  start of this ov
223f0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64  erflow page, and
22400 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29  .        **   3)
22410 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
22420 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e   file-backed, an
22430 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34  d.        **   4
22440 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70  ) there is no op
22450 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  en write-transac
22460 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20  tion, and.      
22470 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64 61    **   5) the da
22480 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 20  tabase is not a 
22490 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20 20  WAL database,.  
224a0 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61 6c        **   6) al
224b0 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  l data from the 
224c0 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72 65  page is being re
224d0 61 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ad..        **. 
224e0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64         ** then d
224f0 61 74 61 20 63 61 6e 20 62 65 20 72 65 61 64 20  ata can be read 
22500 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68  directly from th
22510 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22520 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
22530 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65   ** output buffe
22540 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65  r, bypassing the
22550 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f   page-cache alto
22560 67 65 74 68 65 72 2e 20 54 68 69 73 20 73 70 65  gether. This spe
22570 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  eds.        ** u
22580 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20  p loading large 
22590 72 65 63 6f 72 64 73 20 74 68 61 74 20 73 70 61  records that spa
225a0 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  n many overflow 
225b0 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  pages..        *
225c0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65  /.        if( (e
225d0 4f 70 26 30 78 30 31 29 3d 3d 30 20 20 20 20 20  Op&0x01)==0     
225e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22600 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20   /* (1) */.     
22610 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30      && offset==0
22620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29            /* (2)
22650 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
22660 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c  (bEnd || a==ovfl
22670 53 69 7a 65 29 20 20 20 20 20 20 20 20 20 20 20  Size)           
22680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22690 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20     /* (6) */.   
226a0 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e        && pBt->in
226b0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
226c0 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20 20 20  NS_READ         
226d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
226e0 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  4) */.         &
226f0 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50  & (fd = sqlite3P
22700 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50  agerFile(pBt->pP
22710 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73  ager))->pMethods
22720 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20       /* (3) */. 
22730 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e          && pBt->
22740 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 39  pPage1->aData[19
22750 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20 20  ]==0x01         
22760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22770 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (5) */.        
22780 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
22790 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20  aSave[4];.      
227a0 20 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d      u8 *aWrite =
227b0 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20   &pBuf[-4];.    
227c0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61        memcpy(aSa
227d0 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a  ve, aWrite, 4);.
227e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
227f0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
22800 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69   aWrite, a+4, (i
22810 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  64)pBt->pageSize
22820 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a  *(nextPage-1));.
22830 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
22840 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 57  ge = get4byte(aW
22850 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20  rite);.         
22860 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20   memcpy(aWrite, 
22870 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20  aSave, 4);.     
22880 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
22890 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
228a0 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62       DbPage *pDb
228b0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
228c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
228d0 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
228e0 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20  ager, nextPage, 
228f0 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20  &pDbPage,.      
22900 20 20 20 20 20 20 20 20 28 28 65 4f 70 26 30 78          ((eOp&0x
22910 30 31 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47  01)==0 ? PAGER_G
22920 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
22930 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
22940 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
22950 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22960 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61           aPayloa
22970 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
22980 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
22990 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  ;.            ne
229a0 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
229b0 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  e(aPayload);.   
229c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
229d0 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
229e0 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70  oad[offset+4], p
229f0 42 75 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30  Buf, a, (eOp&0x0
22a00 31 29 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  1), pDbPage);.  
22a10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22a20 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
22a30 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
22a40 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
22a50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22a60 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20    }.        amt 
22a70 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42  -= a;.        pB
22a80 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d  uf += a;.      }
22a90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
22aa0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22ab0 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
22ac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
22ad0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
22ae0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22af0 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
22b00 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
22b10 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
22b20 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
22b30 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
22b40 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
22b50 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
22b60 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
22b70 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
22b80 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  set"..**.** The 
22b90 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
22ba0 72 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20  re that pCur is 
22bb0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61  pointing to a va
22bc0 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68  lid row.** in th
22bd0 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52  e table..**.** R
22be0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
22bf0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
22c00 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
22c10 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
22c20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
22c30 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
22c40 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
22c50 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
22c60 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
22c70 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
22c80 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
22c90 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
22ca0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
22cb0 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
22cc0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
22cd0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
22ce0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
22cf0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
22d00 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
22d10 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
22d20 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
22d30 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
22d40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
22d50 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
22d60 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
22d70 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
22d80 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74  ->nCell );.  ret
22d90 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
22da0 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
22db0 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
22dc0 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d  har*)pBuf, 0);.}
22dd0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
22de0 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73  t of the data as
22df0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
22e00 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
22e10 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
22e20 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
22e30 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
22e40 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
22e50 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
22e60 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65  ffset"..**.** Re
22e70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
22e80 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
22e90 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
22ea0 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
22eb0 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
22ec0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
22ed0 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
22ee0 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
22ef0 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
22f00 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
22f10 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43  te3BtreeData(BtC
22f20 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
22f30 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
22f40 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
22f50 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65   int rc;..#ifnde
22f60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
22f70 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43  CRBLOB.  if ( pC
22f80 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
22f90 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
22fa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22fb0 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  ABORT;.  }.#endi
22fc0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  f..  assert( cur
22fd0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
22fe0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
22ff0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
23000 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
23010 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23020 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
23030 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
23040 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
23050 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
23060 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
23070 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
23080 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge] );.    asser
23090 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
230a0 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
230b0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
230c0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
230d0 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
230e0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
230f0 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
23100 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
23110 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
23120 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
23130 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
23140 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
23150 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
23160 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
23170 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
23180 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
23190 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
231a0 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
231b0 69 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50  index btrees (pP
231c0 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20  age->intKey==0) 
231d0 61 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20  and is the data 
231e0 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72  for.** table btr
231f0 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
23200 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62  ey==1). The numb
23210 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61  er of bytes of a
23220 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f  vailable.** key/
23230 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
23240 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20  into *pAmt.  If 
23250 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74  *pAmt==0, then t
23260 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75  he value.** retu
23270 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rned will not be
23280 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
23290 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
232a0 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d  tine is an optim
232b0 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20  ization.  It is 
232c0 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65  common for the e
232d0 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64  ntire key.** and
232e0 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20   data to fit on 
232f0 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61  the local page a
23300 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  nd for there to 
23310 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a  be no overflow.*
23320 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74  * pages.  When t
23330 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20  hat is so, this 
23340 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75  routine can be u
23350 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  sed to access th
23360 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
23370 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67  a without making
23380 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65   a copy.  If the
23390 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61   key and/or data
233a0 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20   spills.** onto 
233b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
233c0 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  then accessPaylo
233d0 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65  ad() must be use
233e0 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a  d to reassemble.
233f0 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20  ** the key/data 
23400 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f  and copy it into
23410 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
23420 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  buffer..**.** Th
23430 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
23440 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
23450 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c  ne looks directl
23460 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  y into the cache
23470 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65  d.** page of the
23480 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
23490 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67  data might chang
234a0 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65  e or move the ne
234b0 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62  xt time.** any b
234c0 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20  tree routine is 
234d0 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
234e0 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65  c const void *fe
234f0 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
23500 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
23510 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
23520 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
23530 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
23540 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20   u32 *pAmt      
23550 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
23560 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
23570 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
23580 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
23590 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
235a0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
235b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
235c0 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73  ->iPage]);.  ass
235d0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
235e0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
235f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
23600 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
23610 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
23620 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
23630 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
23640 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
23650 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23660 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23670 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
23680 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
23690 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
236a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
236b0 65 3e 30 20 29 3b 0a 20 20 2a 70 41 6d 74 20 3d  e>0 );.  *pAmt =
236c0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
236d0 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  al;.  return (vo
236e0 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  id*)pCur->info.p
236f0 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a  Payload;.}.../*.
23700 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79  ** For the entry
23710 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
23720 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72  r is point to, r
23730 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79  eturn as.** many
23740 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
23750 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65  y or data as are
23760 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
23770 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65  e local.** b-tre
23780 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74  e page.  Write t
23790 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
237a0 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74  ilable bytes int
237b0 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54  o *pAmt..**.** T
237c0 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
237d0 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ned is ephemeral
237e0 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20  .  The key/data 
237f0 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62  may move.** or b
23800 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74  e destroyed on t
23810 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
23820 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e  any Btree routin
23830 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  e,.** including 
23840 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72  calls from other
23850 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74   threads against
23860 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e   the same cache.
23870 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74  .** Hence, a mut
23880 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
23890 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  ed should be hel
238a0 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
238b0 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ng.** this routi
238c0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
238d0 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
238e0 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
238f0 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
23900 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
23910 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
23920 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
23930 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
23940 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
23950 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68  te3BtreeKeyFetch
23960 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
23970 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72   u32 *pAmt){.  r
23980 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f  eturn fetchPaylo
23990 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a  ad(pCur, pAmt);.
239a0 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  }.const void *sq
239b0 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65  lite3BtreeDataFe
239c0 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
239d0 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a  ur, u32 *pAmt){.
239e0 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61    return fetchPa
239f0 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
23a00 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  );.}.../*.** Mov
23a10 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
23a20 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64  n to a new child
23a30 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50   page.  The newP
23a40 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20  gno argument is 
23a50 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  the.** page numb
23a60 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
23a70 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
23a80 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
23a90 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
23aa0 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74  ITE_CORRUPT if t
23ab0 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66  he page-header f
23ac0 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a  lags field of.**
23ad0 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70   the new child p
23ae0 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  age does not mat
23af0 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65  ch the flags fie
23b00 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ld of the parent
23b10 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20   (i.e..** if an 
23b20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65  intkey page appe
23b30 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61  ars to be the pa
23b40 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e  rent of a non-in
23b50 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a  tkey page, or.**
23b60 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f   vice-versa)..*/
23b70 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
23b80 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72  ToChild(BtCursor
23b90 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50   *pCur, u32 newP
23ba0 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
23bb0 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e    int i = pCur->
23bc0 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65  iPage;.  MemPage
23bd0 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74   *pNewPage;.  Bt
23be0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
23bf0 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65  ur->pBt;..  asse
23c00 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
23c10 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
23c20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
23c30 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
23c40 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
23c50 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55  pCur->iPage<BTCU
23c60 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29  RSOR_MAX_DEPTH )
23c70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23c80 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20  ->iPage>=0 );.  
23c90 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
23ca0 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  =(BTCURSOR_MAX_D
23cb0 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72  EPTH-1) ){.    r
23cc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
23cd0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
23ce0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
23cf0 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e  Page(pBt, newPgn
23d00 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c 0a 20 20  o, &pNewPage,.  
23d10 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43               (pC
23d20 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
23d30 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d  TCF_WriteFlag)==
23d40 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  0 ? PAGER_GET_RE
23d50 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 69  ADONLY : 0);.  i
23d60 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
23d70 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67  c;.  pCur->apPag
23d80 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67  e[i+1] = pNewPag
23d90 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  e;.  pCur->aiIdx
23da0 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75  [i+1] = 0;.  pCu
23db0 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70  r->iPage++;..  p
23dc0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
23dd0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
23de0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
23df0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
23e00 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28  alidOvfl);.  if(
23e10 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c   pNewPage->nCell
23e20 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e  <1 || pNewPage->
23e30 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70  intKey!=pCur->ap
23e40 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20  Page[i]->intKey 
23e50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
23e60 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
23e70 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
23e80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
23e90 66 20 30 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70  f 0./*.** Page p
23ea0 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74  Parent is an int
23eb0 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29  ernal (non-leaf)
23ec0 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73   tree page. This
23ed0 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73   function .** as
23ee0 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20  serts that page 
23ef0 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
23f00 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20   the left-child 
23f10 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a  if the iIdx'th.*
23f20 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70  * cell in page p
23f30 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69  Parent. Or, if i
23f40 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20  Idx is equal to 
23f50 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
23f60 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20   of.** cells in 
23f70 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61  pParent, that pa
23f80 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
23f90 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
23fa0 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61  ild of.** the pa
23fb0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
23fc0 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  id assertParentI
23fd0 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50  ndex(MemPage *pP
23fe0 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c  arent, int iIdx,
23ff0 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20   Pgno iChild){. 
24000 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70   assert( iIdx<=p
24010 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b  Parent->nCell );
24020 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61  .  if( iIdx==pPa
24030 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
24040 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
24050 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
24060 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
24070 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69  Offset+8])==iChi
24080 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ld );.  }else{. 
24090 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
240a0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
240b0 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43  rent, iIdx))==iC
240c0 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  hild );.  }.}.#e
240d0 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73  lse.#  define as
240e0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
240f0 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a  x,y,z) .#endif..
24100 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
24110 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20  ursor up to the 
24120 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a  parent page..**.
24130 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  ** pCur->idx is 
24140 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
24150 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
24160 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  ins the pointer.
24170 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77  ** to the page w
24180 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
24190 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f  m.  If we are co
241a0 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ming from the.**
241b0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c   right-most chil
241c0 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72  d page then pCur
241d0 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
241e0 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a  one more than.**
241f0 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c   the largest cel
24200 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  l index..*/.stat
24210 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61  ic void moveToPa
24220 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70  rent(BtCursor *p
24230 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
24240 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
24250 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
24260 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
24270 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
24280 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
24290 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61  ->iPage>0 );.  a
242a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
242b0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
242c0 20 29 3b 0a 0a 20 20 2f 2a 20 55 50 44 41 54 45   );..  /* UPDATE
242d0 3a 20 49 74 20 69 73 20 61 63 74 75 61 6c 6c 79  : It is actually
242e0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
242f0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 74 65 73 74  e condition test
24300 65 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74  ed by the assert
24310 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 74 6f 20 62  .  ** below to b
24320 65 20 75 6e 74 72 75 65 20 69 66 20 74 68 65 20  e untrue if the 
24330 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
24340 20 63 6f 72 72 75 70 74 2e 20 54 68 69 73 20 63   corrupt. This c
24350 61 6e 20 6f 63 63 75 72 20 69 66 0a 20 20 2a 2a  an occur if.  **
24360 20 6f 6e 65 20 63 75 72 73 6f 72 20 68 61 73 20   one cursor has 
24370 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20 70 50  modified page pP
24380 61 72 65 6e 74 20 77 68 69 6c 65 20 61 20 72 65  arent while a re
24390 66 65 72 65 6e 63 65 20 74 6f 20 69 74 20 69 73  ference to it is
243a0 20 68 65 6c 64 20 0a 20 20 2a 2a 20 62 79 20 61   held .  ** by a
243b0 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 2e 20   second cursor. 
243c0 57 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  Which can only h
243d0 61 70 70 65 6e 20 69 66 20 61 20 73 69 6e 67 6c  appen if a singl
243e0 65 20 70 61 67 65 20 69 73 20 6c 69 6e 6b 65 64  e page is linked
243f0 0a 20 20 2a 2a 20 69 6e 74 6f 20 6d 6f 72 65 20  .  ** into more 
24400 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20  than one b-tree 
24410 73 74 72 75 63 74 75 72 65 20 69 6e 20 61 20 63  structure in a c
24420 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e  orrupt database.
24430 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73    */.#if 0.  ass
24440 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a  ertParentIndex(.
24450 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
24460 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
24470 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64   .    pCur->aiId
24480 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
24490 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  , .    pCur->apP
244a0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
244b0 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 23 65 6e 64  ->pgno.  );.#end
244c0 69 66 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  if.  testcase( p
244d0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
244e0 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72  >iPage-1] > pCur
244f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24500 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29  Page-1]->nCell )
24510 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  ;..  releasePage
24520 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
24530 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70  ur->iPage]);.  p
24540 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
24550 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
24560 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
24570 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
24580 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
24590 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 7d 0a 0a 2f  ValidOvfl);.}../
245a0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
245b0 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
245c0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
245d0 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72  f its b-tree str
245e0 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
245f0 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
24600 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
24610 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ge, then the cur
24620 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
24630 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20  point.** to the 
24640 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
24650 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  e instead of the
24660 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
24670 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61  e. A table has a
24680 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  .** virtual root
24690 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61   page when the a
246a0 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  ctual root page 
246b0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
246c0 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67  s and a .** sing
246d0 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54  le child page. T
246e0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
246f0 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62  pen with the tab
24700 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  le rooted at pag
24710 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e 1..**.** If th
24720 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
24730 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  re is empty, the
24740 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73   cursor state is
24750 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53   set to .** CURS
24760 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65  OR_INVALID. Othe
24770 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f  rwise, the curso
24780 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  r is set to poin
24790 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a  t to the first.*
247a0 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f  * cell located o
247b0 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76  n the root (or v
247c0 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67  irtual root) pag
247d0 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  e and the cursor
247e0 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74   state.** is set
247f0 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44   to CURSOR_VALID
24800 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
24810 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
24820 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69   successfully, i
24830 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64  t may be assumed
24840 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67   that the.** pag
24850 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69  e-header flags i
24860 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
24870 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d   [virtual] root-
24880 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65  page is the expe
24890 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66  cted .** kind of
248a0 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e   b-tree page (i.
248b0 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69  e. if when openi
248c0 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68  ng the cursor th
248d0 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74  e caller did not
248e0 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65  .** specify a Ke
248f0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
24900 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
24910 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72  s set to 0x05 or
24920 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61   0x0D,.** indica
24930 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74  ting a table b-t
24940 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63  ree, or if the c
24950 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66  aller did specif
24960 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20  y a KeyInfo .** 
24970 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
24980 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
24990 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c  to 0x02 or 0x0A,
249a0 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69   indicating an i
249b0 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e  ndex.** b-tree).
249c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
249d0 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
249e0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
249f0 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
24a00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
24a10 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  K;..  assert( cu
24a20 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
24a30 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
24a40 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
24a50 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
24a60 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
24a70 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  t( CURSOR_VALID 
24a80 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49    < CURSOR_REQUI
24a90 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
24aa0 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  rt( CURSOR_FAULT
24ab0 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55     > CURSOR_REQU
24ac0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
24ad0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
24ae0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
24af0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
24b00 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
24b10 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20  R_FAULT ){.     
24b20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
24b30 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f  kipNext!=SQLITE_
24b40 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  OK );.      retu
24b50 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
24b60 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  t;.    }.    sql
24b70 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
24b80 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a  rsor(pCur);.  }.
24b90 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
24ba0 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 77 68 69  ge>=0 ){.    whi
24bb0 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20  le( pCur->iPage 
24bc0 29 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43  ) releasePage(pC
24bd0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24be0 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 7d 65  >iPage--]);.  }e
24bf0 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67  lse if( pCur->pg
24c00 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20  noRoot==0 ){.   
24c10 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
24c20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
24c30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24c40 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
24c50 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
24c60 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74  itPage(pCur->pBt
24c70 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e  ree->pBt, pCur->
24c80 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
24c90 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20  >apPage[0],.    
24ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43               (pC
24cb0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
24cc0 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d  TCF_WriteFlag)==
24cd0 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  0 ? PAGER_GET_RE
24ce0 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20  ADONLY : 0);.   
24cf0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24d00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  OK ){.      pCur
24d10 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
24d20 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
24d30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
24d40 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  }.    pCur->iPag
24d50 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 52 6f  e = 0;.  }.  pRo
24d60 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ot = pCur->apPag
24d70 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  e[0];.  assert( 
24d80 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75  pRoot->pgno==pCu
24d90 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a  r->pgnoRoot );..
24da0 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b    /* If pCur->pK
24db0 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55  eyInfo is not NU
24dc0 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  LL, then the cal
24dd0 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20  ler that opened 
24de0 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a  this cursor.  **
24df0 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65   expected to ope
24e00 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78  n it on an index
24e10 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69   b-tree. Otherwi
24e20 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20  se, if pKeyInfo 
24e30 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68  is.  ** NULL, th
24e40 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73  e caller expects
24e50 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e   a table b-tree.
24e60 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
24e70 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72  the case,.  ** r
24e80 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
24e90 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a  CORRUPT error. .
24ea0 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65    **.  ** Earlie
24eb0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
24ec0 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61  Lite assumed tha
24ed0 74 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c  t this test coul
24ee0 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20  d not fail.  ** 
24ef0 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  if the root page
24f00 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61   was already loa
24f10 64 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  ded when this fu
24f20 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
24f30 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20  d (i.e..  ** if 
24f40 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e  pCur->iPage>=0).
24f50 20 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74   But this is not
24f60 20 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62   so if the datab
24f70 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ase is corrupted
24f80 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61   .  ** in such a
24f90 20 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70   way that page p
24fa0 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69  Root is linked i
24fb0 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74  nto a second b-t
24fc0 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20  ree table .  ** 
24fd0 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74  (or the freelist
24fe0 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ).  */.  assert(
24ff0 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
25000 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b  1 || pRoot->intK
25010 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ey==0 );.  if( p
25020 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  Root->isInit==0 
25030 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  || (pCur->pKeyIn
25040 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69  fo==0)!=pRoot->i
25050 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74  ntKey ){.    ret
25060 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
25070 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
25080 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d  pCur->aiIdx[0] =
25090 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
250a0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
250b0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
250c0 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54  ~(BTCF_AtLast|BT
250d0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
250e0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20  F_ValidOvfl);.. 
250f0 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c   if( pRoot->nCel
25100 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  l>0 ){.    pCur-
25110 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
25120 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20  _VALID;.  }else 
25130 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66  if( !pRoot->leaf
25140 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62   ){.    Pgno sub
25150 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52  page;.    if( pR
25160 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72  oot->pgno!=1 ) r
25170 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
25180 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73  RUPT_BKPT;.    s
25190 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74  ubpage = get4byt
251a0 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
251b0 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
251c0 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
251d0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
251e0 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
251f0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
25200 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65  , subpage);.  }e
25210 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  lse{.    pCur->e
25220 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
25230 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65  NVALID;.  }.  re
25240 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25250 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
25260 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65  r down to the le
25270 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ft-most leaf ent
25280 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
25290 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  * entry to which
252a0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
252b0 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
252c0 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   The left-most l
252d0 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77  eaf is the one w
252e0 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
252f0 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74   key - the first
25300 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
25310 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
25320 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74  c int moveToLeft
25330 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
25340 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
25350 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
25360 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
25370 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
25380 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25390 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
253a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
253b0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
253c0 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
253d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
253e0 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
253f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25400 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
25410 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
25420 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
25430 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
25440 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
25450 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
25460 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61  l(pPage, pCur->a
25470 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
25480 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ]));.    rc = mo
25490 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
254a0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
254b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
254c0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
254d0 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67   down to the rig
254e0 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ht-most leaf ent
254f0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
25500 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20  * page to which 
25510 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
25520 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63  pointing.  Notic
25530 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
25540 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65  .** between move
25550 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64  ToLeftmost() and
25560 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
25570 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ().  moveToLeftm
25580 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
25590 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74  he left-most ent
255a0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
255b0 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d  entry* whereas m
255c0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
255d0 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69  .** finds the ri
255e0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  ght-most entry b
255f0 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65  eneath the *page
25600 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  *..**.** The rig
25610 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73  ht-most entry is
25620 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
25630 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20  e largest key - 
25640 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20  the last.** key 
25650 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
25660 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
25670 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
25680 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
25690 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
256a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
256b0 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
256c0 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  *pPage = 0;..  a
256d0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
256e0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
256f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
25700 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
25710 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
25720 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  ( !(pPage = pCur
25730 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25740 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
25750 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
25760 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
25770 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
25780 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
25790 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
257a0 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
257b0 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ell;.    rc = mo
257c0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
257d0 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
257e0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
257f0 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78   }.  pCur->aiIdx
25800 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
25810 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
25820 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25830 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
25840 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
25850 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
25860 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20  F_ValidNKey)==0 
25870 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
25880 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  TE_OK;.}../* Mov
25890 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
258a0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
258b0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
258c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
258d0 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
258e0 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
258f0 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
25900 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
25910 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
25920 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
25930 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
25940 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
25950 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
25960 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
25970 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
25980 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
25990 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
259a0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
259b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
259c0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
259d0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
259e0 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
259f0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
25a00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25a10 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
25a20 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
25a30 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
25a40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
25a50 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
25a60 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
25a70 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
25a80 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
25a90 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
25aa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25ab0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
25ac0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
25ad0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
25ae0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
25af0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
25b00 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
25b10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25b20 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
25b30 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
25b40 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
25b50 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
25b60 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
25b70 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
25b80 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
25b90 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
25ba0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
25bb0 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
25bc0 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
25bd0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
25be0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
25bf0 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
25c00 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
25c10 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
25c20 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25c30 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25c40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
25c50 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
25c60 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
25c70 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
25c80 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72  f the cursor alr
25c90 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  eady points to t
25ca0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74  he last entry, t
25cb0 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  his is a no-op. 
25cc0 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  */.  if( CURSOR_
25cd0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
25ce0 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75  ate && (pCur->cu
25cf0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74  rFlags & BTCF_At
25d00 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64  Last)!=0 ){.#ifd
25d10 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
25d20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
25d30 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65  k serves to asse
25d40 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75  rt() that the cu
25d50 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73  rsor really does
25d60 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74   point .    ** t
25d70 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
25d80 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20   in the b-tree. 
25d90 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
25da0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
25db0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b  pCur->iPage; ii+
25dc0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
25dd0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69  ( pCur->aiIdx[ii
25de0 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
25df0 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ii]->nCell );.  
25e00 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
25e10 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
25e20 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e  ->iPage]==pCur->
25e30 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
25e40 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a  ge]->nCell-1 );.
25e50 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
25e60 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25e70 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23  Page]->leaf );.#
25e80 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
25e90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
25ea0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
25eb0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
25ec0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25ed0 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
25ee0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
25ef0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61  State ){.      a
25f00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
25f10 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
25f20 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25f30 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
25f40 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
25f50 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
25f60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
25f70 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
25f80 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20  R_VALID );.     
25f90 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
25fa0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
25fb0 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
25fc0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25fd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25fe0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
25ff0 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a  |= BTCF_AtLast;.
26000 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26010 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
26020 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c  ags &= ~BTCF_AtL
26030 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ast;.      }.   
26040 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
26050 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
26060 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f  ve the cursor so
26070 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
26080 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72  to an entry near
26090 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65   the key .** spe
260a0 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65  cified by pIdxKe
260b0 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52  y or intKey.   R
260c0 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20  eturn a success 
260d0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  code..**.** For 
260e0 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74  INTKEY tables, t
260f0 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65  he intKey parame
26100 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49  ter is used.  pI
26110 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62  dxKey .** must b
26120 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64  e NULL.  For ind
26130 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b  ex tables, pIdxK
26140 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69  ey is used and i
26150 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  ntKey.** is igno
26160 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
26170 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20   exact match is 
26180 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
26190 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
261a0 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69  ways.** left poi
261b0 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20  nting at a leaf 
261c0 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64  page which would
261d0 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20   hold the entry 
261e0 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72  if it.** were pr
261f0 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73  esent.  The curs
26200 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  or might point t
26210 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  o an entry that 
26220 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20  comes.** before 
26230 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79  or after the key
26240 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67  ..**.** An integ
26250 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  er is written in
26260 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69  to *pRes which i
26270 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  s the result of.
26280 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  ** comparing the
26290 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e   key with the en
262a0 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65  try to which the
262b0 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70   cursor is .** p
262c0 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65  ointing.  The me
262d0 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74  aning of the int
262e0 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74  eger written int
262f0 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73  o.** *pRes is as
26300 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
26310 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20      *pRes<0     
26320 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
26330 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
26340 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
26350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26360 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61    is smaller tha
26370 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
26380 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65   or if the table
26390 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20   is empty.**    
263a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
263b0 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  d the cursor is 
263c0 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70  therefore left p
263d0 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e  oint to nothing.
263e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
263f0 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73  ==0     The curs
26400 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
26410 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
26420 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
26430 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79           exactly
26440 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f   matches intKey/
26450 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20  pIdxKey..**.**  
26460 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20     *pRes>0      
26470 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
26480 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
26490 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
264a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264b0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
264c0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
264d0 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  **.*/.int sqlite
264e0 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
264f0 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
26500 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
26510 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
26520 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20  o be moved */.  
26530 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
26540 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61  pIdxKey, /* Unpa
26550 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
26560 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20  /.  i64 intKey, 
26570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26580 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f  The table key */
26590 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
265a0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
265b0 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
265c0 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
265d0 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
265e0 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
265f0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
26600 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
26610 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
26620 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61  c;.  RecordCompa
26630 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  re xRecordCompar
26640 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
26650 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
26660 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
26670 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
26680 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
26690 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
266a0 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20  .  assert( pRes 
266b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  );.  assert( (pI
266c0 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  dxKey==0)==(pCur
266d0 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29  ->pKeyInfo==0) )
266e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
266f0 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
26700 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
26710 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
26720 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
26730 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
26740 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
26750 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
26760 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  */.  if( pCur->e
26770 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
26780 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75  LID && (pCur->cu
26790 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
267a0 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 20 26  lidNKey)!=0.   &
267b0 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  & pCur->apPage[0
267c0 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a  ]->intKey .  ){.
267d0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
267e0 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
267f0 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
26800 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
26810 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
26820 7d 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  }.    if( (pCur-
26830 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
26840 5f 41 74 4c 61 73 74 29 21 3d 30 20 26 26 20 70  _AtLast)!=0 && p
26850 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
26860 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
26870 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
26880 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26890 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
268a0 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20  if( pIdxKey ){. 
268b0 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
268c0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46  e = sqlite3VdbeF
268d0 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b  indCompare(pIdxK
268e0 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  ey);.    pIdxKey
268f0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
26900 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b     assert( pIdxK
26910 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
26920 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  1 .         || p
26930 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
26940 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  rc==0 .         
26950 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
26960 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29  ult_rc==-1.    )
26970 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78  ;.  }else{.    x
26980 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
26990 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61  0; /* All keys a
269a0 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20  re integers */. 
269b0 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
269c0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
269d0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
269e0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
269f0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
26a00 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
26a10 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26a20 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
26a30 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
26a40 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
26a50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
26a60 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
26a70 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
26a80 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
26a90 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  ID || pCur->apPa
26aa0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
26ab0 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66  >nCell>0 );.  if
26ac0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
26ad0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
26ae0 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
26af0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
26b00 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
26b10 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
26b20 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
26b30 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ell==0 );.    re
26b40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26b50 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
26b60 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
26b70 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79  ntKey || pIdxKey
26b80 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20   );.  for(;;){. 
26b90 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c     int lwr, upr,
26ba0 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e   idx, c;.    Pgn
26bb0 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65  o chldPg;.    Me
26bc0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
26bd0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
26be0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38  ->iPage];.    u8
26bf0 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
26c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c10 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
26c20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
26c30 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pPage */..    /*
26c40 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75   pPage->nCell mu
26c50 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  st be greater th
26c60 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73  an zero. If this
26c70 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   is the root-pag
26c80 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  e.    ** the cur
26c90 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62  sor would have b
26ca0 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76  een INVALID abov
26cb0 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b  e and this for(;
26cc0 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e  ;) loop.    ** n
26cd0 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20  ot run. If this 
26ce0 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d  is not the root-
26cf0 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d  page, then the m
26d00 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75  oveToChild() rou
26d10 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  tine.    ** woul
26d20 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
26d30 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75  etected db corru
26d40 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79  ption. Similarly
26d50 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20  , pPage must.   
26d60 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74   ** be the right
26d70 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20   kind (index or 
26d80 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65  table) of b-tree
26d90 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
26da0 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f  .    ** a moveTo
26db0 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54  Child() or moveT
26dc0 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75  oRoot() call wou
26dd0 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
26de0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
26df0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
26e00 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
26e10 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
26e20 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b  ->intKey==(pIdxK
26e30 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77  ey==0) );.    lw
26e40 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
26e50 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
26e60 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61  .    assert( bia
26e70 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61  sRight==0 || bia
26e80 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20  sRight==1 );.   
26e90 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62   idx = upr>>(1-b
26ea0 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64  iasRight); /* id
26eb0 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20  x = biasRight ? 
26ec0 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f  upr : (lwr+upr)/
26ed0 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e  2; */.    pCur->
26ee0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
26ef0 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
26f00 20 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f     if( xRecordCo
26f10 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mpare==0 ){.    
26f20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
26f30 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
26f40 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
26f50 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
26f60 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63   idx) + pPage->c
26f70 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
26f80 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
26f90 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
26fa0 20 20 20 20 20 77 68 69 6c 65 28 20 30 78 38 30       while( 0x80
26fb0 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29   <= *(pCell++) )
26fc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
26fd0 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e  ( pCell>=pPage->
26fe0 61 44 61 74 61 45 6e 64 20 29 20 72 65 74 75 72  aDataEnd ) retur
26ff0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
27000 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
27010 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
27020 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
27030 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65  Cell, (u64*)&nCe
27040 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
27050 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74  if( nCellKey<int
27060 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
27070 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
27080 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
27090 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62  upr ){ c = -1; b
270a0 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20  reak; }.        
270b0 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b  }else if( nCellK
270c0 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey>intKey ){.   
270d0 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78         upr = idx
270e0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  -1;.          if
270f0 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d  ( lwr>upr ){ c =
27100 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20   +1; break; }.  
27110 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27120 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
27130 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  CellKey==intKey 
27140 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  );.          pCu
27150 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
27160 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
27170 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
27180 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
27190 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
271a0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
271b0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
271c0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
271d0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
271e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 77  {.            lw
271f0 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20  r = idx;.       
27200 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
27210 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20  _next_layer;.   
27220 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
27230 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
27240 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
27250 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27260 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
27270 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
27280 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
272a0 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
272b0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
272c0 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
272d0 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
272e0 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20  upr)/2; */.     
272f0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
27300 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
27310 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a       int nCell;.
27320 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
27330 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
27340 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68  idx) + pPage->ch
27350 69 6c 64 50 74 72 53 69 7a 65 3b 0a 0a 20 20 20  ildPtrSize;..   
27360 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69       /* The maxi
27370 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61  mum supported pa
27380 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36  ge-size is 65536
27390 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61   bytes. This mea
273a0 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ns that.        
273b0 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** the maximum n
273c0 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20  umber of record 
273d0 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20  bytes stored on 
273e0 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a  an index B-Tree.
273f0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
27400 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33  is less than 163
27410 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79  84 bytes and may
27420 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20   be stored as a 
27430 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a  2-byte.        *
27440 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69  * varint. This i
27450 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
27460 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  ed to attempt to
27470 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a   avoid parsing .
27480 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65          ** the e
27490 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68  ntire cell by ch
274a0 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63  ecking for the c
274b0 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72  ases where the r
274c0 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20  ecord is .      
274d0 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69    ** stored enti
274e0 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20  rely within the 
274f0 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69  b-tree page by i
27500 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69  nspecting the fi
27510 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  rst .        ** 
27520 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63  2 bytes of the c
27530 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ell..        */.
27540 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
27550 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  pCell[0];.      
27560 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61    if( nCell<=pPa
27570 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
27580 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oad ){.         
27590 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
275a0 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f  runs if the reco
275b0 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  rd-size field of
275c0 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20   the cell is a. 
275d0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67           ** sing
275e0 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61  le byte varint a
275f0 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69  nd the record fi
27600 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
27610 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20  he main.        
27620 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65    ** b-tree page
27630 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
27640 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b  testcase( pCell+
27650 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e  nCell+1==pPage->
27660 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20  aDataEnd );.    
27670 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72        c = xRecor
27680 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
27690 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d  (void*)&pCell[1]
276a0 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
276b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28      }else if( !(
276c0 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29  pCell[1] & 0x80)
276d0 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
276e0 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26  nCell = ((nCell&
276f0 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c  0x7f)<<7) + pCel
27700 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61  l[1])<=pPage->ma
27710 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29  xLocal.        )
27720 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
27730 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
27740 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65  ield is a 2 byte
27750 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
27760 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20  record .        
27770 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65    ** fits entire
27780 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62  ly on the main b
27790 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
277a0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
277b0 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
277c0 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  2==pPage->aDataE
277d0 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
277e0 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
277f0 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
27800 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78  )&pCell[2], pIdx
27810 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
27820 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
27830 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f  * The record flo
27840 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65  ws over onto one
27850 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
27860 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20  w pages. In.    
27870 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
27880 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c  se the whole cel
27890 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61  l needs to be pa
278a0 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61  rsed, a buffer a
278b0 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20  llocated.       
278c0 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73     ** and access
278d0 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74  Payload() used t
278e0 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72  o retrieve the r
278f0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20  ecord into the. 
27900 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66           ** buff
27910 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65  er before VdbeRe
27920 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61  cordCompare() ca
27930 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a  n be called. */.
27940 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
27950 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
27960 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
27970 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
27980 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
27990 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
279a0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
279b0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
279c0 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
279d0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
279e0 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
279f0 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
27a00 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
27a10 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
27a20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20  nCell );.       
27a30 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
27a40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
27a50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
27a60 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
27a70 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
27a80 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
27a90 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
27aa0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
27ab0 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
27ac0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61            rc = a
27ad0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
27ae0 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e  r, 0, nCell, (un
27af0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65  signed char*)pCe
27b00 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20 20  llKey, 2);.     
27b10 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
27b20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
27b30 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
27b40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
27b50 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
27b60 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
27b70 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
27b80 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
27b90 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64  l, pCellKey, pId
27ba0 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  xKey);.         
27bb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
27bc0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
27bd0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
27be0 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t( .            
27bf0 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
27c00 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e!=SQLITE_CORRUP
27c10 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20  T || c==0).     
27c20 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d      && (pIdxKey-
27c30 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
27c40 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e  _NOMEM || pCur->
27c50 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pBtree->db->mall
27c60 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20  ocFailed).      
27c70 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
27c80 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
27c90 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
27ca0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
27cb0 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c>0 ){.        
27cc0 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
27cd0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
27ce0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27cf0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  c==0 );.        
27d00 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
27d10 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
27d20 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
27d30 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
27d40 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
27d50 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
27d60 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72  if( pIdxKey->err
27d70 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49  Code ) rc = SQLI
27d80 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
27d90 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
27da0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
27db0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
27dc0 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b  lwr>upr ) break;
27dd0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27de0 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
27df0 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
27e00 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
27e10 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
27e20 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
27e30 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
27e40 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61  r==upr+1 || (pPa
27e50 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
27e60 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20  Page->leaf) );. 
27e70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
27e80 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
27e90 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
27ea0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
27eb0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
27ec0 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
27ed0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27ee0 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
27ef0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
27f00 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
27f10 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a  u16)idx;.      *
27f20 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
27f30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27f40 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
27f50 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
27f60 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
27f70 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d  r:.    if( lwr>=
27f80 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
27f90 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
27fa0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
27fb0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
27fc0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
27fd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
27fe0 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
27ff0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
28000 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
28010 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
28020 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
28030 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  lwr;.    rc = mo
28040 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
28050 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
28060 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d   rc ) break;.  }
28070 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a  .moveto_finish:.
28080 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
28090 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
280a0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
280b0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
280c0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
280d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
280e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
280f0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
28100 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
28110 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
28120 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
28130 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
28140 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
28150 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
28160 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
28170 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
28180 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
28190 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
281a0 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
281b0 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
281c0 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
281d0 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
281e0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
281f0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
28200 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
28210 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
28220 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
28230 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
28240 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
28250 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
28260 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
28270 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
28280 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
28290 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
282a0 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
282b0 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
282c0 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
282d0 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
282e0 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
282f0 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
28300 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
28310 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
28320 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
28330 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
28340 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
28350 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
28360 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
28370 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
28380 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
28390 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
283a0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
283b0 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
283c0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
283d0 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
283e0 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a   set *pRes=1..**
283f0 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74  .** The main ent
28400 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69  ry point is sqli
28410 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20  te3BtreeNext(). 
28420 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
28430 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
28440 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
28450 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72  e of merely incr
28460 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
28470 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
28480 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
28490 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20  he next cell on 
284a0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
284b0 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20  .  The (slower) 
284c0 62 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70  btreeNext() help
284d0 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  er.** routine is
284e0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
284f0 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
28500 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
28510 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  ent page or.** t
28520 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
28530 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rsor..**.** The 
28540 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
28550 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20   will set *pRes 
28560 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20  to 0 or 1.  The 
28570 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
28580 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31  lue.** will be 1
28590 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62   if the cursor b
285a0 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72  eing stepped cor
285b0 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53  responds to an S
285c0 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20  QL index and.** 
285d0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
285e0 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
285f0 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20  skipped if that 
28600 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
28610 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69  en.** a unique i
28620 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65  ndex.  Otherwise
28630 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
28640 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20   have set *pRes 
28650 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f  to zero..** Zero
28660 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   is the common c
28670 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69  ase. The btree i
28680 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
28690 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65   free to use the
286a0 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  .** initial *pRe
286b0 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e  s value as a hin
286c0 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72  t to improve per
286d0 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68  formance, but th
286e0 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c  e current.** SQL
286f0 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
28700 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
28710 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68  t. (Note that th
28720 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a  e comdb2 btree.*
28730 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
28740 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68   does use this h
28750 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a  int, however.).*
28760 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
28770 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72  NOINLINE int btr
28780 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
28790 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
287a0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
287b0 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
287c0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
287d0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
287e0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
287f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
28800 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
28810 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
28820 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
28830 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29  sert( *pRes==0 )
28840 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
28850 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
28860 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ID ){.    assert
28870 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
28880 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
28890 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  fl)==0 );.    rc
288a0 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
288b0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
288c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
288d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
288e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
288f0 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
28900 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
28910 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70  tate ){.      *p
28920 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  Res = 1;.      r
28930 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28940 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
28950 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b  Cur->skipNext ){
28960 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
28970 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28980 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
28990 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
289a0 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20  R_SKIPNEXT );.  
289b0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
289c0 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
289d0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
289e0 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20  >skipNext>0 ){. 
289f0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69         pCur->ski
28a00 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20  pNext = 0;.     
28a10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28a20 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
28a30 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
28a40 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
28a50 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
28a60 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28a70 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b  Page];.  idx = +
28a80 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  +pCur->aiIdx[pCu
28a90 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
28aa0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
28ab0 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  it );..  /* If t
28ac0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28ad0 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20   is corrupt, it 
28ae0 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
28af0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78  the value of idx
28b00 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76   .  ** to be inv
28b10 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20  alid here. This 
28b20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  can only occur i
28b30 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f  f a second curso
28b40 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20  r modifies.  ** 
28b50 74 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63  the page while c
28b60 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f  ursor pCur is ho
28b70 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63  lding a referenc
28b80 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63  e to it. Which c
28b90 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70  an.  ** only hap
28ba0 70 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62  pen if the datab
28bb0 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69  ase is corrupt i
28bc0 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20  n such a way as 
28bd0 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a  to link the.  **
28be0 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20   page into more 
28bf0 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20  than one b-tree 
28c00 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
28c10 74 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50  testcase( idx>pP
28c20 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  age->nCell );.. 
28c30 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d   if( idx>=pPage-
28c40 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
28c50 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
28c60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
28c70 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
28c80 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
28c90 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
28ca0 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
28cb0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
28cc0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74  rn rc;.      ret
28cd0 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
28ce0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
28cf0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
28d00 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
28d10 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
28d20 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  s = 1;.        p
28d30 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
28d40 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
28d50 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
28d60 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
28d70 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
28d80 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
28d90 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
28da0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28db0 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  ];.    }while( p
28dc0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
28dd0 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e  >iPage]>=pPage->
28de0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28  nCell );.    if(
28df0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
28e00 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  {.      return s
28e10 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
28e20 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
28e30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
28e40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28e50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
28e60 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
28e70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28e80 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
28e90 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c    return moveToL
28ea0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
28eb0 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33   }.}.int sqlite3
28ec0 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  BtreeNext(BtCurs
28ed0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
28ee0 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Res){.  MemPage 
28ef0 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  *pPage;.  assert
28f00 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
28f10 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
28f20 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
28f30 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
28f40 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20  ==0 || *pRes==1 
28f50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28f60 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
28f70 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
28f80 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
28f90 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
28fa0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
28fb0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
28fc0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
28fd0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
28fe0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  *pRes = 0;.  if(
28ff0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
29000 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65  URSOR_VALID ) re
29010 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70  turn btreeNext(p
29020 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 70 50  Cur, pRes);.  pP
29030 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
29040 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
29050 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e  .  if( (++pCur->
29060 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29070 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  e])>=pPage->nCel
29080 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61  l ){.    pCur->a
29090 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
290a0 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]--;.    return 
290b0 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  btreeNext(pCur, 
290c0 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pRes);.  }.  if(
290d0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
290e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
290f0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
29100 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
29110 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
29120 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65    }.}../*.** Ste
29130 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
29140 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
29150 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
29160 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
29170 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
29180 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
29190 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
291a0 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
291b0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
291c0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
291d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
291e0 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
291f0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
29200 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
29210 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  1..**.** The mai
29220 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
29230 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
29240 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72  vious().  That r
29250 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
29260 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
29270 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
29280 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e  rely decrementin
29290 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
292a0 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
292b0 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76  x.** to the prev
292c0 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65  ious cell on the
292d0 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
292e0 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
292f0 65 65 50 72 65 76 69 6f 75 73 28 29 20 68 65 6c  eePrevious() hel
29300 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  per.** routine i
29310 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
29320 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
29330 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
29340 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20  rent page or.** 
29350 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
29360 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
29370 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
29380 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73  n will set *pRes
29390 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65   to 0 or 1.  The
293a0 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
293b0 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  alue.** will be 
293c0 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  1 if the cursor 
293d0 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f  being stepped co
293e0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
293f0 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a  SQL index and.**
29400 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
29410 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
29420 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74   skipped if that
29430 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62   SQL index had b
29440 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20  een.** a unique 
29450 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73  index.  Otherwis
29460 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  e the caller wil
29470 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73  l have set *pRes
29480 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72   to zero..** Zer
29490 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o is the common 
294a0 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20  case. The btree 
294b0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
294c0 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68  s free to use th
294d0 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52  e.** initial *pR
294e0 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69  es value as a hi
294f0 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65  nt to improve pe
29500 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74  rformance, but t
29510 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51  he current.** SQ
29520 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
29530 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
29540 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74  ot. (Note that t
29550 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a  he comdb2 btree.
29560 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
29570 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20  n does use this 
29580 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a  hint, however.).
29590 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
295a0 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
295b0 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
295c0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
295d0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
295e0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
295f0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
29600 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
29610 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
29620 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
29630 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
29640 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
29650 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
29660 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
29670 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
29680 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
29690 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54  ->curFlags & (BT
296a0 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
296b0 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61  alidOvfl|BTCF_Va
296c0 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a  lidNKey))==0 );.
296d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
296e0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
296f0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
29700 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
29710 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
29720 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
29730 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
29740 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  K );.    rc = bt
29750 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
29760 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
29770 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29780 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
29790 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
297a0 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
297b0 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
297c0 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70  tate ){.      *p
297d0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  Res = 1;.      r
297e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
297f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
29800 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b  Cur->skipNext ){
29810 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29820 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
29830 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
29840 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
29850 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20  R_SKIPNEXT );.  
29860 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
29870 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
29880 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
29890 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20  >skipNext<0 ){. 
298a0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69         pCur->ski
298b0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20  pNext = 0;.     
298c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
298d0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
298e0 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
298f0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
29900 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
29910 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29920 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
29930 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
29940 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
29950 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  leaf ){.    int 
29960 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
29970 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
29980 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
29990 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
299a0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
299b0 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20  ge, idx)));.    
299c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
299d0 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  rc;.    rc = mov
299e0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
299f0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
29a00 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69   while( pCur->ai
29a10 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
29a20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
29a30 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
29a40 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
29a50 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
29a60 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
29a70 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
29a80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
29a90 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
29aa0 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
29ab0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
29ac0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
29ad0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
29ae0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
29af0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
29b00 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
29b10 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29  BTCF_ValidOvfl))
29b20 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72  ==0 );..    pCur
29b30 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
29b40 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67  age]--;.    pPag
29b50 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
29b60 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
29b70 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
29b80 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
29b90 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
29ba0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
29bb0 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
29bc0 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
29bd0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
29be0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
29bf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
29c00 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
29c10 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
29c20 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
29c30 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  s){.  assert( cu
29c40 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
29c50 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
29c60 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
29c70 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
29c80 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20  || *pRes==1 );. 
29c90 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
29ca0 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
29cb0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
29cc0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70  OR_VALID );.  *p
29cd0 52 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Res = 0;.  pCur-
29ce0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
29cf0 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
29d00 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56  ValidOvfl|BTCF_V
29d10 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75  alidNKey);.  pCu
29d20 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
29d30 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  0;.  if( pCur->e
29d40 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
29d50 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e  LID.   || pCur->
29d60 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29d70 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72  e]==0.   || pCur
29d80 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29d90 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20  Page]->leaf==0. 
29da0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
29db0 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
29dc0 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20  r, pRes);.  }.  
29dd0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
29de0 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65  ->iPage]--;.  re
29df0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29e00 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
29e10 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f  e a new page fro
29e20 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
29e30 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ile..**.** The n
29e40 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  ew page is marke
29e50 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e  d as dirty.  (In
29e60 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71   other words, sq
29e70 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
29e80 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
29e90 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
29ea0 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
29eb0 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
29ec0 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
29ed0 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
29ee0 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
29ef0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
29f00 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
29f10 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
29f20 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  () on the new pa
29f30 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
29f40 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ne..**.** SQLITE
29f50 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
29f60 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79  on success.  Any
29f70 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
29f80 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  lue indicates.**
29f90 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50   an error.  *ppP
29fa0 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61  age and *pPgno a
29fb0 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  re undefined in 
29fc0 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
29fd0 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  error..** Do not
29fe0 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50   invoke sqlite3P
29ff0 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a  agerUnref() on *
2a000 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72  ppPage if an err
2a010 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  or is returned..
2a020 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
2a030 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
2a040 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
2a050 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  n effort is made
2a060 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61   to .** locate a
2a070 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74   page close to t
2a080 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22  he page number "
2a090 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63  nearby".  This c
2a0a0 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e  an be used in an
2a0b0 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b  .** attempt to k
2a0c0 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65  eep related page
2a0d0 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20  s close to each 
2a0e0 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74  other in the dat
2a0f0 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77  abase file,.** w
2a100 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e  hich in turn can
2a110 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61   make database a
2a120 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a  ccess faster..**
2a130 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65  .** If the eMode
2a140 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 42 54   parameter is BT
2a150 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20  ALLOC_EXACT and 
2a160 74 68 65 20 6e 65 61 72 62 79 20 70 61 67 65 20  the nearby page 
2a170 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65  exists.** anywhe
2a180 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
2a190 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ist, then it is 
2a1a0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
2a1b0 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a   returned.  If.*
2a1c0 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c  * eMode is BTALL
2a1d0 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70  OC_LT then the p
2a1e0 61 67 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c  age returned wil
2a1f0 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f  l be less than o
2a200 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65  r equal.** to ne
2a210 61 72 62 79 20 69 66 20 61 6e 79 20 73 75 63 68  arby if any such
2a220 20 70 61 67 65 20 65 78 69 73 74 73 2e 20 20 49   page exists.  I
2a230 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c  f eMode is BTALL
2a240 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72  OC_ANY then ther
2a250 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74  e.** are no rest
2a260 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63  rictions on whic
2a270 68 20 70 61 67 65 20 69 73 20 72 65 74 75 72 6e  h page is return
2a280 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2a290 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
2a2a0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
2a2b0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pBt,         /*
2a2c0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
2a2d0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
2a2e0 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ,      /* Store 
2a2f0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
2a300 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 65  llocated page he
2a310 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  re */.  Pgno *pP
2a320 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
2a330 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61 67 65  * Store the page
2a340 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a   number here */.
2a350 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20    Pgno nearby,  
2a360 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72           /* Sear
2a370 63 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65  ch for a page ne
2a380 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  ar this one */. 
2a390 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20   u8 eMode       
2a3a0 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c          /* BTALL
2a3b0 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f  OC_EXACT, BTALLO
2a3c0 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43  C_LT, or BTALLOC
2a3d0 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  _ANY */.){.  Mem
2a3e0 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
2a3f0 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b  int rc;.  u32 n;
2a400 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2a410 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
2a420 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32  reelist */.  u32
2a430 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   k;     /* Numbe
2a440 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74  r of leaves on t
2a450 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20  he trunk of the 
2a460 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65  freelist */.  Me
2a470 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
2a480 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
2a490 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
2a4a0 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20  Pgno mxPage;    
2a4b0 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
2a4c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2a4d0 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ile */..  assert
2a4e0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2a4f0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
2a500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d   );.  assert( eM
2a510 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59  ode==BTALLOC_ANY
2a520 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26   || (nearby>0 &&
2a530 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74   IfNotOmitAV(pBt
2a540 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29  ->autoVacuum)) )
2a550 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74  ;.  pPage1 = pBt
2a560 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61  ->pPage1;.  mxPa
2a570 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ge = btreePageco
2a580 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20  unt(pBt);.  n = 
2a590 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2a5a0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
2a5b0 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50  testcase( n==mxP
2a5c0 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e  age-1 );.  if( n
2a5d0 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  >=mxPage ){.    
2a5e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2a5f0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
2a600 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
2a610 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61   /* There are pa
2a620 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2a630 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20  ist.  Reuse one 
2a640 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20  of those pages. 
2a650 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75  */.    Pgno iTru
2a660 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63  nk;.    u8 searc
2a670 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66  hList = 0; /* If
2a680 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d   the free-list m
2a690 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20  ust be searched 
2a6a0 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a  for 'nearby' */.
2a6b0 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65      .    /* If e
2a6c0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
2a6d0 41 43 54 20 61 6e 64 20 61 20 71 75 65 72 79 20  ACT and a query 
2a6e0 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  of the pointer-m
2a6f0 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20  ap.    ** shows 
2a700 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e  that the page 'n
2a710 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68  earby' is somewh
2a720 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
2a730 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a  list, then.    *
2a740 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73  * the entire-lis
2a750 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  t will be search
2a760 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ed for that page
2a770 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
2a780 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2a790 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
2a7a0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
2a7b0 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66  XACT ){.      if
2a7c0 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65  ( nearby<=mxPage
2a7d0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65   ){.        u8 e
2a7e0 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73  Type;.        as
2a7f0 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29  sert( nearby>0 )
2a800 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2a810 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2a820 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  m );.        rc 
2a830 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
2a840 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c   nearby, &eType,
2a850 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
2a860 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2a870 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54 79  .        if( eTy
2a880 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
2a890 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AGE ){.         
2a8a0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
2a8b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a8c0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
2a8d0 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2a8e0 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72  LE ){.      sear
2a8f0 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
2a900 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
2a910 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Decrement the f
2a920 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62  ree-list count b
2a930 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20  y 1. Set iTrunk 
2a940 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
2a950 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
2a960 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
2a970 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e   page. iPrevTrun
2a980 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31  k is initially 1
2a990 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2a9a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2a9b0 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
2a9c0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2a9d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2a9e0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2a9f0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
2aa00 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  -1);..    /* The
2aa10 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69   code within thi
2aa20 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e  s loop is run on
2aa30 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27  ly once if the '
2aa40 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69  searchList' vari
2aa50 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  able.    ** is n
2aa60 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69  ot true. Otherwi
2aa70 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65  se, it runs once
2aa80 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d   for each trunk-
2aa90 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20  page on the.    
2aaa0 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74  ** free-list unt
2aab0 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  il the page 'nea
2aac0 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
2aad0 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
2aae0 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72  EXACT).    ** or
2aaf0 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65   until a page le
2ab00 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27  ss than 'nearby'
2ab10 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f   is located (eMo
2ab20 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a  de==BTALLOC_LT).
2ab30 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a      */.    do {.
2ab40 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
2ab50 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
2ab60 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20   if( pPrevTrunk 
2ab70 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  ){.        iTrun
2ab80 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
2ab90 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
2aba0 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
2abb0 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  {.        iTrunk
2abc0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2abd0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
2abe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
2abf0 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d  estcase( iTrunk=
2ac00 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
2ac10 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61   if( iTrunk>mxPa
2ac20 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ge ){.        rc
2ac30 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2ac40 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65  T_BKPT;.      }e
2ac50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
2ac60 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
2ac70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
2ac80 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  unk, 0);.      }
2ac90 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
2aca0 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
2acb0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
2acc0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2acd0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
2ace0 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
2acf0 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  k!=0 );.      as
2ad00 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44  sert( pTrunk->aD
2ad10 61 74 61 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20  ata!=0 );..     
2ad20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   k = get4byte(&p
2ad30 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
2ad40 3b 20 2f 2a 20 23 20 6f 66 20 6c 65 61 76 65 73  ; /* # of leaves
2ad50 20 6f 6e 20 74 68 69 73 20 74 72 75 6e 6b 20 70   on this trunk p
2ad60 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
2ad70 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
2ad80 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
2ad90 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
2ada0 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
2adb0 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
2adc0 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
2add0 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
2ade0 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
2adf0 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
2ae00 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
2ae10 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
2ae20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
2ae30 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
2ae40 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
2ae50 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2ae60 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2ae70 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
2ae80 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2ae90 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2aea0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2aeb0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2aec0 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
2aed0 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
2aee0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2aef0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
2af00 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2af10 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
2af20 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
2af30 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
2af40 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
2af50 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
2af60 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
2af70 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
2af80 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
2af90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
2afa0 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
2afb0 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
2afc0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
2afd0 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
2afe0 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
2aff0 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
2b000 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2b010 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2b020 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
2b030 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2b040 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b050 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2b060 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2b070 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20  searchList .    
2b080 20 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72          && (near
2b090 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69  by==iTrunk || (i
2b0a0 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20  Trunk<nearby && 
2b0b0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2b0c0 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  E)) .      ){.  
2b0d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73        /* The lis
2b0e0 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  t is being searc
2b0f0 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75  hed and this tru
2b100 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nk page is the p
2b110 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  age.        ** t
2b120 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61  o allocate, rega
2b130 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
2b140 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e  r it has leaves.
2b150 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2b160 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
2b170 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  unk;.        *pp
2b180 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
2b190 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
2b1a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
2b1b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2b1c0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2b1d0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2b1e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2b1f0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2b200 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2b210 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2b220 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( k==0 ){.      
2b230 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
2b240 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
2b250 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2b260 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
2b270 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2b280 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
2b290 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2b2a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2b2b0 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
2b2c0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2b2d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2b2e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
2b300 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2b310 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2b320 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2b330 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75  memcpy(&pPrevTru
2b340 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
2b350 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2b360 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
2b370 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2b380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b390 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72   trunk page is r
2b3a0 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63  equired by the c
2b3b0 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e  aller but it con
2b3c0 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20  tains .         
2b3d0 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   ** pointers to 
2b3e0 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73  free-list leaves
2b3f0 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66  . The first leaf
2b400 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b   becomes a trunk
2b410 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
2b420 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
2b430 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
2b440 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
2b450 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20  *pNewTrunk;.    
2b460 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54        Pgno iNewT
2b470 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2b480 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
2b490 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
2b4a0 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61  ( iNewTrunk>mxPa
2b4b0 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  ge ){ .         
2b4c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2b4d0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2b4e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2b4f0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2b500 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b510 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2b520 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61   iNewTrunk==mxPa
2b530 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge );.          
2b540 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2b550 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
2b560 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
2b570 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2b580 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2b590 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2b5a0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2b5b0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
2b5c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2b5d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2b5e0 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
2b5f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2b600 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b610 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2b620 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
2b630 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
2b640 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2b650 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2b660 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b670 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
2b680 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2b690 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2b6a0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
2b6b0 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
2b6c0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
2b6d0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
2b6e0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
2b6f0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
2b700 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
2b710 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
2b720 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2b730 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
2b740 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
2b750 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
2b760 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
2b770 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2b780 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
2b790 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
2b7a0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2b7b0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2b7c0 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
2b7d0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2b7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2b7f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2b800 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
2b810 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2b820 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2b830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
2b840 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2b850 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2b860 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2b870 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
2b880 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2b890 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
2b8a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b8b0 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
2b8c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
2b8d0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
2b8e0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
2b8f0 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
2b900 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
2b910 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
2b920 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20  lse if( k>0 ){. 
2b930 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
2b940 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
2b950 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
2b960 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a     u32 closest;.
2b970 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
2b980 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
2b990 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
2b9a0 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
2b9b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
2b9c0 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
2b9d0 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
2b9e0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
2b9f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ba00 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2ba10 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
2ba20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
2ba30 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2ba40 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
2ba50 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
2ba60 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
2ba70 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61    if( iPage<=nea
2ba80 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
2ba90 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
2baa0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
2bab0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2bac0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2bad0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2baf0 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a        int dist;.
2bb00 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
2bb10 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
2bb20 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
2bb30 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29  ta[8]) - nearby)
2bb40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
2bb50 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
2bb60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2bb70 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
2bb80 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
2bb90 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
2bba0 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
2bbb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
2bbc0 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
2bbd0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
2bbe0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
2bbf0 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
2bc00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2bc10 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2bc20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2bc30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bc40 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
2bc50 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2bc60 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
2bc70 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
2bc80 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
2bc90 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
2bca0 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
2bcb0 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
2bcc0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
2bcd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2bce0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2bcf0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2bd00 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2bd10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bd20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
2bd30 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
2bd40 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
2bd50 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c  List .         |
2bd60 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  | (iPage==nearby
2bd70 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62   || (iPage<nearb
2bd80 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
2bd90 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
2bda0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
2bdb0 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
2bdc0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
2bdd0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
2bde0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2bdf0 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
2be00 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
2be10 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
2be20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
2be30 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
2be40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2be50 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
2be60 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
2be70 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
2be80 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2be90 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2bea0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2beb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2bec0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f   ) goto end_allo
2bed0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2bee0 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
2bef0 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
2bf00 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
2bf10 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
2bf20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
2bf30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2bf40 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
2bf50 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
2bf60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
2bf70 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
2bf80 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
2bf90 2c 20 2a 70 50 67 6e 6f 29 20 3f 20 50 41 47 45  , *pPgno) ? PAGE
2bfa0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
2bfb0 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  : 0;.          r
2bfc0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2bfd0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
2bfe0 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
2bff0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c000 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c010 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2c020 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2c030 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
2c040 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2c050 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2c060 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c070 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2c080 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
2c090 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c0a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c0b0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
2c0c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c0d0 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
2c0e0 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
2c0f0 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
2c100 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
2c110 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
2c120 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2c130 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
2c140 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2c150 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64  elist, so append
2c160 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
2c170 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2c180 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
2c190 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  .    ** Normally
2c1a0 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f  , new pages allo
2c1b0 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  cated by this bl
2c1c0 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65  ock can be reque
2c1d0 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20  sted from the.  
2c1e0 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72    ** pager layer
2c1f0 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
2c200 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
2c210 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74   This prevents t
2c220 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
2c230 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72  from trying to r
2c240 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f  ead the pages co
2c250 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e  ntent from disk.
2c260 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
2c270 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
2c280 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
2c290 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20  already run one 
2c2a0 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e  or more incremen
2c2b0 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a  tal-vacuum.    *
2c2c0 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68  * steps, then th
2c2d0 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62  e page we are ab
2c2e0 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  out to allocate 
2c2f0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74  may contain cont
2c300 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ent.    ** that 
2c310 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  is required in t
2c320 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f  he event of a ro
2c330 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  llback. In this 
2c340 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20  case, do.    ** 
2c350 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63  not set the no-c
2c360 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69  ontent flag. Thi
2c370 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67  s causes the pag
2c380 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a  er to load and j
2c390 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68  ournal.    ** th
2c3a0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
2c3b0 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76  ontent before ov
2c3c0 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  erwriting it..  
2c3d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
2c3e0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
2c3f0 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c  will not actuall
2c400 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  y attempt to loa
2c410 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  d or journal .  
2c420 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72    ** content for
2c430 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72   any page that r
2c440 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70  eally does lie p
2c450 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2c460 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
2c470 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  ** file on disk.
2c480 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20   So the effects 
2c490 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  of disabling the
2c4a0 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69   no-content opti
2c4b0 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  mization.    ** 
2c4c0 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65  here are confine
2c4d0 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73  d to those pages
2c4e0 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65   that lie betwee
2c4f0 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  n the end of the
2c500 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2c510 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65   image and the e
2c520 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
2c530 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
2c540 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65      int bNoConte
2c550 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d  nt = (0==IfNotOm
2c560 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
2c570 6e 63 61 74 65 29 29 20 3f 20 50 41 47 45 52 5f  ncate)) ? PAGER_
2c580 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20  GET_NOCONTENT : 
2c590 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0;..    rc = sql
2c5a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2c5b0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
2c5c0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2c5d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2c5e0 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
2c5f0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
2c600 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
2c610 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74  _PAGE(pBt) ) pBt
2c620 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e  ->nPage++;..#ifn
2c630 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c640 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
2c650 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2c660 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
2c670 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  AGE(pBt, pBt->nP
2c680 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  age) ){.      /*
2c690 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72   If *pPgno refer
2c6a0 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d  s to a pointer-m
2c6b0 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74  ap page, allocat
2c6c0 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a  e two new pages.
2c6d0 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20        ** at the 
2c6e0 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
2c6f0 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20  instead of one. 
2c700 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61  The first alloca
2c710 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ted page.      *
2c720 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20  * becomes a new 
2c730 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2c740 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  , the second is 
2c750 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  used by the call
2c760 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
2c770 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20     MemPage *pPg 
2c780 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45  = 0;.      TRACE
2c790 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
2c7a0 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
2c7b0 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61   (pointer-map pa
2c7c0 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61  ge)\n", pBt->nPa
2c7d0 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ge));.      asse
2c7e0 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  rt( pBt->nPage!=
2c7f0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2c800 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20  E(pBt) );.      
2c810 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2c820 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  e(pBt, pBt->nPag
2c830 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74  e, &pPg, bNoCont
2c840 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ent);.      if( 
2c850 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c860 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2c870 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2c880 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pPg->pDbPage);. 
2c890 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2c8a0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  ge(pPg);.      }
2c8b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2c8c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2c8d0 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
2c8e0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
2c8f0 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
2c900 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 70  E_PAGE(pBt) ){ p
2c910 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20  Bt->nPage++; }. 
2c920 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2c930 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28 75  put4byte(28 + (u
2c940 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  8*)pBt->pPage1->
2c950 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67  aData, pBt->nPag
2c960 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d  e);.    *pPgno =
2c970 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20   pBt->nPage;..  
2c980 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
2c990 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
2c9a0 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
2c9b0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2c9c0 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
2c9d0 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e  pPage, bNoConten
2c9e0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
2c9f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ca00 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2ca10 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
2ca20 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2ca30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ca40 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
2ca50 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
2ca60 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
2ca70 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
2ca80 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
2ca90 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
2caa0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
2cab0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
2cac0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
2cad0 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61  .end_allocate_pa
2cae0 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ge:.  releasePag
2caf0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c  e(pTrunk);.  rel
2cb00 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
2cb10 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  unk);.  if( rc==
2cb20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2cb30 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
2cb40 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a  rPageRefcount((*
2cb50 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
2cb60 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  )>1 ){.      rel
2cb70 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
2cb80 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  );.      *ppPage
2cb90 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
2cba0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2cbb0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
2cbc0 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49    (*ppPage)->isI
2cbd0 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nit = 0;.  }else
2cbe0 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
2cbf0 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
2cc00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
2cc10 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2cc20 77 72 69 74 65 61 62 6c 65 28 28 2a 70 70 50 61  writeable((*ppPa
2cc30 67 65 29 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge)->pDbPage) );
2cc40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2cc50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2cc60 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2cc70 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
2cc80 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2cc90 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
2cca0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
2ccb0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
2ccc0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
2ccd0 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
2cce0 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
2ccf0 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
2cd00 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
2cd10 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
2cd20 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
2cd30 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
2cd40 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
2cd50 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
2cd60 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
2cd70 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
2cd80 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
2cd90 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
2cda0 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
2cdb0 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
2cdc0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
2cdd0 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
2cde0 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
2cdf0 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
2ce00 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
2ce10 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
2ce20 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
2ce30 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
2ce40 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
2ce50 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
2ce60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2ce70 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
2ce80 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
2ce90 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
2cea0 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
2ceb0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
2cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ced0 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
2cee0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
2cef0 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
2cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cf10 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
2cf20 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
2cf30 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
2cf40 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
2cf50 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
2cf60 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
2cf70 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
2cf80 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2cf90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cfa0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
2cfb0 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
2cfc0 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
2cfd0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cff0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
2d000 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
2d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d020 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
2d030 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
2d040 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
2d050 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
2d060 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2d070 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
2d080 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65  .  assert( iPage
2d090 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
2d0a0 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
2d0b0 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
2d0c0 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65  ge );..  if( pMe
2d0d0 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  mPage ){.    pPa
2d0e0 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20  ge = pMemPage;. 
2d0f0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
2d100 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
2d110 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
2d120 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
2d130 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50  geLookup(pBt, iP
2d140 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
2d150 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
2d160 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
2d170 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
2d180 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2d190 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
2d1a0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
2d1b0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2d1c0 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65  ut;.  nFree = ge
2d1d0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2d1e0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
2d1f0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2d200 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65  aData[36], nFree
2d210 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d  +1);..  if( pBt-
2d220 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
2d230 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
2d240 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
2d250 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74  ecure_delete opt
2d260 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
2d270 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61  then.    ** alwa
2d280 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
2d290 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
2d2a0 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
2d2b0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
2d2c0 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72  ( (!pPage && ((r
2d2d0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2d2e0 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
2d2f0 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20  age, 0))!=0) ). 
2d300 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20      ||          
2d310 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33    ((rc = sqlite3
2d320 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2d330 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a  ->pDbPage))!=0).
2d340 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
2d350 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2d360 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
2d370 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
2d380 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
2d390 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
2d3a0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
2d3b0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
2d3c0 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61  -vacuum, write a
2d3d0 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  n entry in the p
2d3e0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20  ointer-map.  ** 
2d3f0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
2d400 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65   the page is fre
2d410 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53  e..  */.  if( IS
2d420 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2d430 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
2d440 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
2d450 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29  REEPAGE, 0, &rc)
2d460 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2d470 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2d480 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
2d490 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61  manipulate the a
2d4a0 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66  ctual database f
2d4b0 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75  ree-list structu
2d4c0 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  re. There are tw
2d4d0 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69  o.  ** possibili
2d4e0 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65  ties. If the fre
2d4f0 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e  e-list is curren
2d500 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66  tly empty, or if
2d510 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
2d520 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
2d530 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
2d540 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ull, then this p
2d550 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
2d560 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d  a.  ** new free-
2d570 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
2d580 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77   Otherwise, it w
2d590 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61  ill become a lea
2d5a0 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69  f of the.  ** fi
2d5b0 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
2d5c0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  n the current fr
2d5d0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c  ee-list. This bl
2d5e0 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a  ock tests if it.
2d5f0 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
2d600 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65   to add the page
2d610 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c   as a new free-l
2d620 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20  ist leaf..  */. 
2d630 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b   if( nFree!=0 ){
2d640 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20  .    u32 nLeaf; 
2d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d660 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
2d670 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f   of leaf cells o
2d680 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  n trunk page */.
2d690 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65  .    iTrunk = ge
2d6a0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2d6b0 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
2d6c0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2d6d0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
2d6e0 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
2d6f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2d700 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
2d710 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2d720 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d    }..    nLeaf =
2d730 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
2d740 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
2d750 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
2d760 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a  sableSize>32 );.
2d770 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20      if( nLeaf > 
2d780 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
2d790 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20  Size/4 - 2 ){.  
2d7a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2d7b0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2d7c0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
2d7d0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
2d7e0 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33   if( nLeaf < (u3
2d7f0 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  2)pBt->usableSiz
2d800 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
2d810 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
2d820 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f   there is room o
2d830 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  n the trunk page
2d840 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70   to insert the p
2d850 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  age.      ** bei
2d860 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65  ng freed as a ne
2d870 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a  w leaf..      **
2d880 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  .      ** Note t
2d890 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  hat the trunk pa
2d8a0 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  ge is not really
2d8b0 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63   full until it c
2d8c0 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
2d8d0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
2d8e0 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75  2 entries, not u
2d8f0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
2d900 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61  entries as we ha
2d910 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  ve.      ** code
2d920 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61  d.  But due to a
2d930 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e   coding error in
2d940 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
2d950 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  ite prior to.   
2d960 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74     ** 3.6.0, dat
2d970 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65  abases with free
2d980 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73  list trunk pages
2d990 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68   holding more th
2d9a0 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  an.      ** usab
2d9b0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
2d9c0 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70  ries will be rep
2d9d0 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74  orted as corrupt
2d9e0 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20  .  In order.    
2d9f0 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e    ** to maintain
2da00 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
2da10 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c  tibility with ol
2da20 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
2da30 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a  SQLite,.      **
2da40 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
2da50 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68  e to restrict th
2da60 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
2da70 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a  ies to usableSiz
2da80 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a  e/4 - 8.      **
2da90 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f   for now.  At so
2daa0 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
2dab0 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65  future (once eve
2dac0 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64  ryone has upgrad
2dad0 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33  ed.      ** to 3
2dae0 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77  .6.0 or later) w
2daf0 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65  e should conside
2db00 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e  r fixing the con
2db10 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20  ditional above. 
2db20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20       ** to read 
2db30 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22  "usableSize/4-2"
2db40 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61   instead of "usa
2db50 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20  bleSize/4-8"..  
2db60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2db70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2db80 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
2db90 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
2dba0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2dbb0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
2dbc0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2dbd0 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20  [4], nLeaf+1);. 
2dbe0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2dbf0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
2dc00 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65  +nLeaf*4], iPage
2dc10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2dc20 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74  Page && (pBt->bt
2dc30 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
2dc40 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29  URE_DELETE)==0 )
2dc50 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2dc60 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
2dc70 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2dc80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2dc90 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53       rc = btreeS
2dca0 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
2dcb0 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
2dcc0 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
2dcd0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
2dce0 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
2dcf0 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
2dd00 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
2dd10 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  );.      goto fr
2dd20 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
2dd30 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63  }.  }..  /* If c
2dd40 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20  ontrol flows to 
2dd50 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
2dd60 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73   it was not poss
2dd70 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a  ible to add the.
2dd80 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65    ** the page be
2dd90 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c  ing freed as a l
2dda0 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20  eaf page of the 
2ddb0 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
2ddc0 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
2ddd0 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61  ** Possibly beca
2dde0 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73  use the free-lis
2ddf0 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70  t is empty, or p
2de00 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
2de10 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20  the .  ** first 
2de20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
2de30 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20  e-list is full. 
2de40 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
2de50 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
2de60 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d  .  ** will becom
2de70 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20  e the new first 
2de80 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
2de90 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
2dea0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30  /.  if( pPage==0
2deb0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
2dec0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2ded0 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
2dee0 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20  Page, 0)) ){.   
2def0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2df00 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  ut;.  }.  rc = s
2df10 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2df20 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2df30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2df40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
2df50 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2df60 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70    }.  put4byte(p
2df70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72  Page->aData, iTr
2df80 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65  unk);.  put4byte
2df90 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34  (&pPage->aData[4
2dfa0 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74  ], 0);.  put4byt
2dfb0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2dfc0 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  [32], iPage);.  
2dfd0 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
2dfe0 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20  E: %d new trunk 
2dff0 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25  page replacing %
2e000 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
2e010 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72  o, iTrunk));..fr
2e020 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  eepage_out:.  if
2e030 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70  ( pPage ){.    p
2e040 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
2e050 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
2e060 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
2e070 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
2e080 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2e090 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  }.static void fr
2e0a0 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  eePage(MemPage *
2e0b0 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29  pPage, int *pRC)
2e0c0 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d  {.  if( (*pRC)==
2e0d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e0e0 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67 65   *pRC = freePage
2e0f0 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50  2(pPage->pBt, pP
2e100 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  age, pPage->pgno
2e110 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2e120 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f  Free any overflo
2e130 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74  w pages associat
2e140 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
2e150 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  n Cell..*/.stati
2e160 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28  c int clearCell(
2e170 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2e180 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2e190 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65  Cell){.  BtShare
2e1a0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
2e1b0 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  pBt;.  CellInfo 
2e1c0 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66  info;.  Pgno ovf
2e1d0 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b  lPgno;.  int rc;
2e1e0 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20  .  int nOvfl;.  
2e1f0 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  u32 ovflPageSize
2e200 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
2e210 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2e220 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2e230 78 29 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72  x) );.  btreePar
2e240 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
2e250 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
2e260 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
2e270 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72  flow==0 ){.    r
2e280 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e290 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
2e2a0 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
2e2b0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
2e2c0 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  thing */.  }.  i
2e2d0 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f  f( pCell+info.iO
2e2e0 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67  verflow+3 > pPag
2e2f0 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
2e300 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20  maskPage ){.    
2e310 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2e320 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20  RRUPT_BKPT;  /* 
2e330 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73  Cell extends pas
2e340 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f  t end of page */
2e350 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20  .  }.  ovflPgno 
2e360 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
2e370 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
2e380 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  ]);.  assert( pB
2e390 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20  t->usableSize > 
2e3a0 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53  4 );.  ovflPageS
2e3b0 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
2e3c0 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76  eSize - 4;.  nOv
2e3d0 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c  fl = (info.nPayl
2e3e0 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  oad - info.nLoca
2e3f0 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  l + ovflPageSize
2e400 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69   - 1)/ovflPageSi
2e410 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76  ze;.  assert( ov
2e420 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76  flPgno==0 || nOv
2e430 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  fl>0 );.  while(
2e440 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20   nOvfl-- ){.    
2e450 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a  Pgno iNext = 0;.
2e460 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
2e470 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  fl = 0;.    if( 
2e480 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76  ovflPgno<2 || ov
2e490 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  flPgno>btreePage
2e4a0 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
2e4b0 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20      /* 0 is not 
2e4c0 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  a legal page num
2e4d0 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63  ber and page 1 c
2e4e0 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20  annot be an .   
2e4f0 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
2e500 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69  age. Therefore i
2e510 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20  f ovflPgno<2 or 
2e520 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
2e530 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  the .      ** fi
2e540 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  le the database 
2e550 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
2e560 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
2e570 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2e580 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2e590 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20  if( nOvfl ){.   
2e5a0 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
2e5b0 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66  lowPage(pBt, ovf
2e5c0 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26  lPgno, &pOvfl, &
2e5d0 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66  iNext);.      if
2e5e0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2e5f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2e600 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f   ( pOvfl || ((pO
2e610 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c  vfl = btreePageL
2e620 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50  ookup(pBt, ovflP
2e630 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20  gno))!=0) ).    
2e640 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
2e650 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76  PageRefcount(pOv
2e660 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a  fl->pDbPage)!=1.
2e670 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
2e680 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73  There is no reas
2e690 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68  on any cursor sh
2e6a0 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74  ould have an out
2e6b0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
2e6c0 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ce .      ** to 
2e6d0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2e6e0 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20   belonging to a 
2e6f0 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69  cell that is bei
2e700 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74  ng deleted/updat
2e710 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20  ed..      ** So 
2e720 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
2e730 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65  more than one re
2e740 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20  ference to this 
2e750 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20  page, then it . 
2e760 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74       ** must not
2e770 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76   really be an ov
2e780 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20  erflow page and 
2e790 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
2e7a0 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20  t be corrupt. . 
2e7b0 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65       ** It is he
2e7c0 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20  lpful to detect 
2e7d0 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c  this before call
2e7e0 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c  ing freePage2(),
2e7f0 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72   as .      ** fr
2e800 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65  eePage2() may ze
2e810 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  ro the page cont
2e820 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64  ents if secure-d
2e830 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20  elete mode is.  
2e840 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20      ** enabled. 
2e850 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f  If this 'overflo
2e860 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  w' page happens 
2e870 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61  to be a page tha
2e880 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  t the.      ** c
2e890 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69  aller is iterati
2e8a0 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73  ng through or us
2e8b0 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  ing in some othe
2e8c0 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20  r way, this.    
2e8d0 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62    ** can be prob
2e8e0 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a  lematic..      *
2e8f0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
2e900 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2e910 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e920 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
2e930 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76  2(pBt, pOvfl, ov
2e940 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a  flPgno);.    }..
2e950 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b      if( pOvfl ){
2e960 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
2e970 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e  gerUnref(pOvfl->
2e980 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
2e990 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2e9a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c  urn rc;.    ovfl
2e9b0 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20  Pgno = iNext;.  
2e9c0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2e9d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
2e9e0 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73  reate the byte s
2e9f0 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20  equence used to 
2ea00 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c  represent a cell
2ea10 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a   on page pPage.*
2ea20 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  * and write that
2ea30 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69   byte sequence i
2ea40 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76  nto pCell[].  Ov
2ea50 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
2ea60 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  .** allocated an
2ea70 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e  d filled in as n
2ea80 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63  ecessary.  The c
2ea90 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
2eaa0 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
2eab0 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
2eac0 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  re sufficient sp
2ead0 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  ace has been all
2eae0 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43  ocated.** for pC
2eaf0 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ell[]..**.** Not
2eb00 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65  e that pCell doe
2eb10 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
2eb20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  need to point to
2eb30 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
2eb40 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c  a.** area.  pCel
2eb50 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  l might point to
2eb60 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20   some temporary 
2eb70 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65  storage.  The ce
2eb80 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f  ll will.** be co
2eb90 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69  nstructed in thi
2eba0 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61  s temporary area
2ebb0 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74   then copied int
2ebc0 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  o pPage->aData.*
2ebd0 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  * later..*/.stat
2ebe0 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c  ic int fillInCel
2ebf0 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
2ec00 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
2ec10 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
2ec20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
2ec30 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e cell */.  unsi
2ec40 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
2ec50 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
2ec60 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
2ec70 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e  he cell */.  con
2ec80 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  st void *pKey, i
2ec90 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54  64 nKey,    /* T
2eca0 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73  he key */.  cons
2ecb0 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e  t void *pData,in
2ecc0 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68  t nData,   /* Th
2ecd0 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
2ece0 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20  nZero,          
2ecf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2ed00 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74  tra zero bytes t
2ed10 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74  o append to pDat
2ed20 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69  a */.  int *pnSi
2ed30 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
2ed40 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
2ed50 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f  ell size here */
2ed60 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f  .){.  int nPaylo
2ed70 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ad;.  const u8 *
2ed80 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63  pSrc;.  int nSrc
2ed90 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73  , n, rc;.  int s
2eda0 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50  paceLeft;.  MemP
2edb0 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
2edc0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65    MemPage *pToRe
2edd0 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73  lease = 0;.  uns
2ede0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69  igned char *pPri
2edf0 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  or;.  unsigned c
2ee00 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20  har *pPayload;. 
2ee10 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2ee20 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
2ee30 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30  gno pgnoOvfl = 0
2ee40 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b  ;.  int nHeader;
2ee50 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2ee60 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2ee70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2ee80 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  ) );..  /* pPage
2ee90 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
2eea0 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69  ily writeable si
2eeb0 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  nce pCell might 
2eec0 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  be auxiliary.  *
2eed0 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74  * buffer space t
2eee0 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20  hat is separate 
2eef0 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62  from the pPage b
2ef00 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  uffer area */.  
2ef10 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50  assert( pCell<pP
2ef20 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43  age->aData || pC
2ef30 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ell>=&pPage->aDa
2ef40 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
2ef50 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
2ef60 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2ef70 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2ef80 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
2ef90 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65  * Fill in the he
2efa0 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64  ader. */.  nHead
2efb0 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c  er = pPage->chil
2efc0 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79  dPtrSize;.  nPay
2efd0 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e  load = nData + n
2efe0 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67  Zero;.  if( pPag
2eff0 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
2f000 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2f010 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 6e  >intKey );.    n
2f020 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
2f030 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65  int32(&pCell[nHe
2f040 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29  ader], nPayload)
2f050 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2f060 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 30 20  ssert( nData==0 
2f070 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2f080 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20  Zero==0 );.  }. 
2f090 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
2f0a0 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
2f0b0 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e  ader], *(u64*)&n
2f0c0 4b 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69  Key);.  .  /* Fi
2f0d0 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
2f0e0 64 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28 20  d size */.  if( 
2f0f0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
2f100 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74  .    pSrc = pDat
2f110 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  a;.    nSrc = nD
2f120 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d  ata;.    nData =
2f130 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20   0;.  }else{ .  
2f140 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79    if( NEVER(nKey
2f150 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70  >0x7fffffff || p
2f160 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  Key==0) ){.     
2f170 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2f180 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2f190 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
2f1a0 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20  = (int)nKey;.   
2f1b0 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20   pSrc = pKey;.  
2f1c0 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b    nSrc = (int)nK
2f1d0 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  ey;.  }.  if( nP
2f1e0 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
2f1f0 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e  axLocal ){.    n
2f200 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61   = nHeader + nPa
2f210 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63  yload;.    testc
2f220 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20  ase( n==3 );.   
2f230 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20   testcase( n==4 
2f240 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29  );.    if( n<4 )
2f250 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53   n = 4;.    *pnS
2f260 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61  ize = n;.    spa
2f270 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61  ceLeft = nPayloa
2f280 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  d;.    pPrior = 
2f290 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCell;.  }else{.
2f2a0 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61      int mn = pPa
2f2b0 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
2f2c0 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79    n = mn + (nPay
2f2d0 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50  load - mn) % (pP
2f2e0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2f2f0 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
2f300 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67  estcase( n==pPag
2f310 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
2f320 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
2f330 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
2f340 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e  1 );.    if( n >
2f350 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
2f360 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73   ) n = mn;.    s
2f370 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20  paceLeft = n;.  
2f380 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20    *pnSize = n + 
2f390 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 20  nHeader + 4;.   
2f3a0 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
2f3b0 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d  [nHeader+n];.  }
2f3c0 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70  .  pPayload = &p
2f3d0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a  Cell[nHeader];..
2f3e0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
2f3f0 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f  nt variables sho
2f400 75 6c 64 20 62 65 20 73 65 74 20 61 73 20 66 6f  uld be set as fo
2f410 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
2f420 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20     nPayload     
2f430 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c        Total payl
2f440 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65  oad size in byte
2f450 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61  s.  **   pPayloa
2f460 64 20 20 20 20 20 20 20 20 20 20 20 42 65 67 69  d           Begi
2f470 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61  n writing payloa
2f480 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70  d here.  **   sp
2f490 61 63 65 4c 65 66 74 20 20 20 20 20 20 20 20 20  aceLeft         
2f4a0 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   Space available
2f4b0 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49   at pPayload.  I
2f4c0 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65  f nPayload>space
2f4d0 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20  Left,.  **      
2f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4f0 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65  that means conte
2f500 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e  nt must spill in
2f510 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
2f520 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a  s..  **   *pnSiz
2f530 65 20 20 20 20 20 20 20 20 20 20 20 20 53 69 7a  e            Siz
2f540 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63  e of the local c
2f550 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ell (not countin
2f560 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  g overflow pages
2f570 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20  ).  **   pPrior 
2f580 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65 72              Wher
2f590 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 70  e to write the p
2f5a0 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74  gno of the first
2f5b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
2f5c0 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63   **.  ** Use a c
2f5d0 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73  all to btreePars
2f5e0 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65  eCellPtr() to ve
2f5f0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 76 61  rify that the va
2f600 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20  lues above.  ** 
2f610 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f  were computed co
2f620 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69  rrectly..  */.#i
2f630 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2f640 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20   {.    CellInfo 
2f650 69 6e 66 6f 3b 0a 20 20 20 20 62 74 72 65 65 50  info;.    btreeP
2f660 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
2f670 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
2f680 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 48  ;.    assert( nH
2f690 65 61 64 65 72 3d 28 69 6e 74 29 28 69 6e 66 6f  eader=(int)(info
2f6a0 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c  .pPayload - pCel
2f6b0 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  l) );.    assert
2f6c0 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65  ( info.nKey==nKe
2f6d0 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  y );.    assert(
2f6e0 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f   *pnSize == info
2f6f0 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  .nSize );.    as
2f700 73 65 72 74 28 20 73 70 61 63 65 4c 65 66 74 20  sert( spaceLeft 
2f710 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  == info.nLocal )
2f720 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2f730 72 69 6f 72 20 3d 3d 20 26 70 43 65 6c 6c 5b 69  rior == &pCell[i
2f740 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 20 29  nfo.iOverflow] )
2f750 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2f760 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 79  /* Write the pay
2f770 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f  load into the lo
2f780 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79  cal Cell and any
2f790 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72   extra into over
2f7a0 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20  flow pages */.  
2f7b0 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
2f7c0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
2f7d0 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
2f7e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2f7f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2f800 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
2f810 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
2f820 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
2f830 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
2f840 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
2f850 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2f860 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
2f870 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
2f880 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
2f890 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
2f8a0 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
2f8b0 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
2f8c0 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
2f8d0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2f8e0 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
2f8f0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2f900 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
2f910 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2f920 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
2f930 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
2f940 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2f950 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2f960 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
2f970 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
2f980 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
2f990 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
2f9a0 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
2f9b0 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
2f9c0 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
2f9d0 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
2f9e0 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
2f9f0 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
2fa00 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
2fa10 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
2fa20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
2fa30 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
2fa40 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
2fa50 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
2fa60 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
2fa70 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
2fa80 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
2fa90 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
2faa0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
2fab0 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
2fac0 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
2fad0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
2fae0 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
2faf0 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
2fb00 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
2fb10 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
2fb20 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ized values and 
2fb30 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
2fb40 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
2fb50 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2fb60 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
2fb70 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2fb80 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
2fb90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2fba0 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
2fbb0 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
2fbc0 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
2fbd0 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
2fbe0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
2fbf0 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
2fc00 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c  ype, pgnoPtrmap,
2fc10 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
2fc20 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2fc30 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2fc40 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
2fc50 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2fc60 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2fc70 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2fc80 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
2fc90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2fca0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
2fcb0 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
2fcc0 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
2fcd0 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e  than pPrior poin
2fce0 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
2fcf0 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f   area.      ** o
2fd00 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
2fd10 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
2fd20 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
2fd30 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  teable. */.     
2fd40 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
2fd50 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
2fd60 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2fd70 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
2fd80 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
2fd90 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73   /* If pPrior is
2fda0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
2fdb0 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
2fdc0 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
2fdd0 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69  pPage.      ** i
2fde0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
2fdf0 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
2fe00 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d  t( pPrior<pPage-
2fe10 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72  >aData || pPrior
2fe20 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
2fe30 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
2fe40 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
2fe50 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2fe60 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2fe70 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
2fe80 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
2fe90 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
2fea0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2feb0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
2fec0 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
2fed0 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
2fee0 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
2fef0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
2ff00 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
2ff10 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
2ff20 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
2ff30 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
2ff40 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
2ff50 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
2ff60 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
2ff70 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
2ff80 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
2ff90 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
2ffa0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
2ffb0 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
2ffc0 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
2ffd0 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
2ffe0 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
2fff0 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
30000 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
30010 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
30020 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
30030 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
30040 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
30050 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
30060 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
30070 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
30080 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
30090 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
300a0 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
300b0 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
300c0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
300d0 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
300e0 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
300f0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
30100 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
30110 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
30120 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
30130 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
30140 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
30150 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
30160 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a    if( nSrc>0 ){.
30170 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63        if( n>nSrc
30180 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
30190 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
301a0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
301b0 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
301c0 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
301d0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
301e0 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
301f0 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
30200 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
30210 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
30220 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
30230 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
30240 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
30250 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( nSrc==0 ){.  
30260 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
30270 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  ;.      pSrc = p
30280 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
30290 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
302a0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
302b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
302c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
302d0 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
302e0 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
302f0 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
30300 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
30310 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
30320 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
30330 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
30340 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
30350 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
30360 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
30370 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
30380 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
30390 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
303a0 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
303b0 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
303c0 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
303d0 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
303e0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
303f0 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
30400 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
30410 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
30420 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
30430 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a   sz, int *pRC){.
30440 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20    u32 pc;       
30450 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
30460 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
30470 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
30480 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
30490 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
304a0 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
304b0 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
304c0 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
304d0 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
304e0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
304f0 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
30500 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
30510 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
30520 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
30530 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20   of the header. 
30540 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20   0 most pages.  
30550 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20  100 page 1 */.. 
30560 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
30570 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rn;..  assert( i
30580 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
30590 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
305a0 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
305b0 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
305c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
305d0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
305e0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
305f0 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
30600 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
30610 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
30620 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
30630 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
30640 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65  ;.  ptr = &pPage
30650 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78  ->aCellIdx[2*idx
30660 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
30670 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d  te(ptr);.  hdr =
30680 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
30690 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  t;.  testcase( p
306a0 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  c==get2byte(&dat
306b0 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74  a[hdr+5]) );.  t
306c0 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
306d0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
306e0 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  leSize );.  if( 
306f0 70 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79  pc < (u32)get2by
30700 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
30710 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67   || pc+sz > pPag
30720 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
30730 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  ze ){.    *pRC =
30740 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
30750 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
30760 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65  ;.  }.  rc = fre
30770 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
30780 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20  , sz);.  if( rc 
30790 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63  ){.    *pRC = rc
307a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
307b0 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
307c0 2d 2d 3b 0a 20 20 6d 65 6d 6d 6f 76 65 28 70 74  --;.  memmove(pt
307d0 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61  r, ptr+2, 2*(pPa
307e0 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29  ge->nCell - idx)
307f0 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
30800 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
30810 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61  e->nCell);.  pPa
30820 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a  ge->nFree += 2;.
30830 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
30840 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50  a new cell on pP
30850 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65  age at cell inde
30860 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f  x "i".  pCell po
30870 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ints to the.** c
30880 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65  ontent of the ce
30890 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
308a0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69   cell content wi
308b0 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  ll fit on the pa
308c0 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20  ge, then put it 
308d0 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a  there.  If it.**
308e0 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74   will not fit, t
308f0 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  hen make a copy 
30900 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
30910 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69  ent into pTemp i
30920 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f  f.** pTemp is no
30930 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c  t null.  Regardl
30940 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c  ess of pTemp, al
30950 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74  locate a new ent
30960 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e  ry.** in pPage->
30970 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b  apOvfl[] and mak
30980 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  e it point to th
30990 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28  e cell content (
309a0 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65  either.** in pTe
309b0 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  mp or the origin
309c0 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c  al pCell) and al
309d0 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e  so record its in
309e0 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74  dex. .** Allocat
309f0 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ing a new entry 
30a00 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b  in pPage->aCell[
30a10 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a  ] implies that .
30a20 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ** pPage->nOverf
30a30 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  low is increment
30a40 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b  ed..**.** If nSk
30a50 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
30a60 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79  then do not copy
30a70 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
30a80 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a   bytes of the.**
30a90 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65   cell. The calle
30aa0 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65  r will overwrite
30ab0 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69 73   them after this
30ac0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
30ad0 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69  s. If.** nSkip i
30ae0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
30af0 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70   pCell may not p
30b00 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c  oint to an inval
30b10 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  id memory locati
30b20 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c  on .** (but pCel
30b30 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79  l+nSkip is alway
30b40 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61  s valid)..*/.sta
30b50 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43  tic void insertC
30b60 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
30b70 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
30b80 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
30b90 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
30ba0 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
30bb0 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
30bc0 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
30bd0 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
30be0 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
30bf0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
30c00 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
30c10 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
30c20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
30c30 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
30c40 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
30c50 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
30c60 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
30c70 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
30c80 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e   needed */.  Pgn
30c90 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f  o iChild,      /
30ca0 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72  * If non-zero, r
30cb0 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62  eplace first 4 b
30cc0 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76  ytes with this v
30cd0 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
30ce0 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  RC          /* R
30cf0 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65  ead and write re
30d00 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68  turn code from h
30d10 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
30d20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  idx = 0;      /*
30d30 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
30d40 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
30d50 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
30d60 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
30d70 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
30d80 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20  r */.  int end; 
30d90 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
30da0 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
30db0 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  last cell pointe
30dc0 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
30dd0 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20   int ins;       
30de0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64     /* Index in d
30df0 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20  ata[] where new 
30e00 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20  cell pointer is 
30e10 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
30e20 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
30e30 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69  /* Address of fi
30e40 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
30e50 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
30e60 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
30e70 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74    /* The content
30e80 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61   of the whole pa
30e90 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6b 69  ge */.  int nSki
30ea0 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20 34 20  p = (iChild ? 4 
30eb0 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52  : 0);..  if( *pR
30ec0 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
30ed0 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
30ee0 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
30ef0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
30f00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f  );.  assert( MX_
30f10 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
30f20 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73  <=10921 );.  ass
30f30 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
30f40 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
30f50 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50  ->pBt) || CORRUP
30f60 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
30f70 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
30f80 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50  ow<=ArraySize(pP
30f90 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a  age->apOvfl) );.
30fa0 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53    assert( ArrayS
30fb0 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
30fc0 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50  l)==ArraySize(pP
30fd0 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a  age->aiOvfl) );.
30fe0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
30ff0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
31000 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
31010 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c  );.  /* The cell
31020 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
31030 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63   be sized correc
31040 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77  tly.  However, w
31050 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a  hen moving a.  *
31060 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c  * malformed cell
31070 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67   from a leaf pag
31080 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72  e to an interior
31090 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65   page, if the ce
310a0 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e  ll size.  ** wan
310b0 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  ted to be less t
310c0 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f  han 4 but got ro
310d0 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e  unded up to 4 on
310e0 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20   the leaf, then 
310f0 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20  size.  ** might 
31100 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28  be less than 8 (
31110 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e  leaf-size + poin
31120 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65  ter) on the inte
31130 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63  rior node.  Henc
31140 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20  e.  ** the term 
31150 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20  after the || in 
31160 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
31170 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73  sert(). */.  ass
31180 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
31190 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
311a0 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20  l) || (sz==8 && 
311b0 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69  iChild>0) );.  i
311c0 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
311d0 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67  low || sz+2>pPag
311e0 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
311f0 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20  if( pTemp ){.   
31200 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b     memcpy(pTemp+
31210 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b  nSkip, pCell+nSk
31220 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
31230 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
31240 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  mp;.    }.    if
31250 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
31260 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
31270 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d  , iChild);.    }
31280 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e  .    j = pPage->
31290 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  nOverflow++;.   
312a0 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29   assert( j<(int)
312b0 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  (sizeof(pPage->a
312c0 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50  pOvfl)/sizeof(pP
312d0 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29  age->apOvfl[0]))
312e0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
312f0 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c  pOvfl[j] = pCell
31300 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f  ;.    pPage->aiO
31310 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b  vfl[j] = (u16)i;
31320 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
31330 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
31340 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
31350 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
31360 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31370 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
31380 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
31390 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
313a0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
313b0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
313c0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
313d0 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
313e0 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c  >aData;.    cell
313f0 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
31400 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20  cellOffset;.    
31410 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  end = cellOffset
31420 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
31430 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c  l;.    ins = cel
31440 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20  lOffset + 2*i;. 
31450 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
31460 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c  Space(pPage, sz,
31470 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20   &idx);.    if( 
31480 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b  rc ){ *pRC = rc;
31490 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f   return; }.    /
314a0 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70  * The allocateSp
314b0 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75  ace() routine gu
314c0 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c  arantees the fol
314d0 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70 65  lowing two prope
314e0 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20  rties.    ** if 
314f0 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  it returns succe
31500 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ss */.    assert
31510 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29  ( idx >= end+2 )
31520 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
31530 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61  x+sz <= (int)pPa
31540 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
31550 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ize );.    pPage
31560 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70  ->nCell++;.    p
31570 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
31580 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20  u16)(2 + sz);.  
31590 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69    memcpy(&data[i
315a0 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c  dx+nSkip], pCell
315b0 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70  +nSkip, sz-nSkip
315c0 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c  );.    if( iChil
315d0 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
315e0 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  yte(&data[idx], 
315f0 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
31600 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61     memmove(&data
31610 5b 69 6e 73 2b 32 5d 2c 20 26 64 61 74 61 5b 69  [ins+2], &data[i
31620 6e 73 5d 2c 20 65 6e 64 2d 69 6e 73 29 3b 0a 20  ns], end-ins);. 
31630 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
31640 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20  a[ins], idx);.  
31650 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
31660 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
31670 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  t+3], pPage->nCe
31680 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ll);.#ifndef SQL
31690 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
316a0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
316b0 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
316c0 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
316d0 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
316e0 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
316f0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
31700 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
31710 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
31720 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
31730 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
31740 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
31750 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74       */.      pt
31760 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
31770 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43  Page, pCell, pRC
31780 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
31790 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
317a0 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73   a list of cells
317b0 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65   to a page.  The
317c0 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20   page should be 
317d0 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e  initially empty.
317e0 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72  .** The cells ar
317f0 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
31800 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  fit on the page.
31810 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
31820 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20  assemblePage(.  
31830 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
31840 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f    /* The page to
31850 20 62 65 20 61 73 73 65 6d 62 6c 65 64 20 2a 2f   be assembled */
31860 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
31870 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
31880 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  er of cells to a
31890 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20  dd to this page 
318a0 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
318b0 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
318c0 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65  rs to cell bodie
318d0 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a  s */.  u16 *aSiz
318e0 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  e        /* Size
318f0 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a  s of the cells *
31900 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
31910 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
31920 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38   counter */.  u8
31930 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 20   *pCellptr;     
31940 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
31950 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  xt cell pointer 
31960 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64  */.  int cellbod
31970 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  y;     /* Addres
31980 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62  s of next cell b
31990 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  ody */.  u8 * co
319a0 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
319b0 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20  ->aData;        
319c0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
319d0 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  to data for pPag
319e0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
319f0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
31a00 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
31a10 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
31a20 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67 65 20  header on pPage 
31a30 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  */.  const int n
31a40 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e  Usable = pPage->
31a50 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
31a60 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
31a70 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73  of page */..  as
31a80 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
31a90 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
31aa0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
31ab0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
31ac0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
31ad0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e    assert( nCell>
31ae0 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 28 69 6e  =0 && nCell<=(in
31af0 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  t)MX_CELL(pPage-
31b00 3e 70 42 74 29 0a 20 20 20 20 20 20 20 20 20 20  >pBt).          
31b10 20 20 26 26 20 28 69 6e 74 29 4d 58 5f 43 45 4c    && (int)MX_CEL
31b20 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31  L(pPage->pBt)<=1
31b30 30 39 32 31 29 3b 0a 20 20 61 73 73 65 72 74 28  0921);.  assert(
31b40 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
31b50 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
31b60 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
31b70 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
31b80 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20 62   page has just b
31b90 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65  een zeroed by ze
31ba0 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73  roPage() */.  as
31bb0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
31bc0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll==0 );.  asser
31bd0 74 28 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  t( get2byteNotZe
31be0 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
31bf0 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20  ==nUsable );..  
31c00 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 61 67  pCellptr = &pPag
31c10 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c  e->aCellIdx[nCel
31c20 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79  l*2];.  cellbody
31c30 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f   = nUsable;.  fo
31c40 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d  r(i=nCell-1; i>=
31c50 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 75 31 36  0; i--){.    u16
31c60 20 73 7a 20 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a   sz = aSize[i];.
31c70 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20      pCellptr -= 
31c80 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20  2;.    cellbody 
31c90 2d 3d 20 73 7a 3b 0a 20 20 20 20 70 75 74 32 62  -= sz;.    put2b
31ca0 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65  yte(pCellptr, ce
31cb0 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d  llbody);.    mem
31cc0 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f  cpy(&data[cellbo
31cd0 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20  dy], apCell[i], 
31ce0 73 7a 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62  sz);.  }.  put2b
31cf0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
31d00 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32  , nCell);.  put2
31d10 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
31d20 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20  ], cellbody);.  
31d30 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
31d40 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62  (nCell*2 + nUsab
31d50 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a  le - cellbody);.
31d60 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
31d70 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a   (u16)nCell;.}..
31d80 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
31d90 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64  ing parameters d
31da0 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e  etermine how man
31db0 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73  y adjacent pages
31dc0 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a   get involved.**
31dd0 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20   in a balancing 
31de0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69  operation.  NN i
31df0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
31e00 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
31e10 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74  her side.** of t
31e20 68 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72  he page that par
31e30 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20  ticipate in the 
31e40 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74  balancing operat
31e50 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a  ion.  NB is the.
31e60 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  ** total number 
31e70 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61  of pages that pa
31e80 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75  rticipate, inclu
31e90 64 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20  ding the target 
31ea0 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e  page and.** NN n
31eb0 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
31ec0 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  er side..**.** T
31ed0 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65  he minimum value
31ee0 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20   of NN is 1 (of 
31ef0 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61  course).  Increa
31f00 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a  sing NN above 1.
31f10 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67  ** (to 2 or 3) g
31f20 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d  ives a modest im
31f30 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c  provement in SEL
31f40 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70  ECT and DELETE p
31f50 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e  erformance.** in
31f60 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20   exchange for a 
31f70 6c 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69  larger degradati
31f80 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64  on in INSERT and
31f90 20 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61   UPDATE performa
31fa0 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75  nce..** The valu
31fb0 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20  e of NN appears 
31fc0 74 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74  to give the best
31fd0 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c   results overall
31fe0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20  ..*/.#define NN 
31ff0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1             /*
32000 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   Number of neigh
32010 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
32020 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a  ide of pPage */.
32030 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32  #define NB (NN*2
32040 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61  +1)      /* Tota
32050 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64  l pages involved
32060 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20   in the balance 
32070 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
32080 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
32090 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LANCE./*.** This
320a0 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61   version of bala
320b0 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68  nce() handles th
320c0 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c  e common special
320d0 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61   case where.** a
320e0 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65   new entry is be
320f0 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20  ing inserted on 
32100 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68  the extreme righ
32110 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  t-end of the.** 
32120 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77  tree, in other w
32130 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e  ords, when the n
32140 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65  ew entry will be
32150 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74  come the largest
32160 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65  .** entry in the
32170 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73   tree..**.** Ins
32180 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 74  tead of trying t
32190 6f 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20  o balance the 3 
321a0 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
321b0 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a  pages, just add.
321c0 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  ** a new page to
321d0 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
321e0 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65  side and put the
321f0 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69   one new entry i
32200 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20  n.** that page. 
32210 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65   This leaves the
32220 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74   right side of t
32230 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74  he tree somewhat
32240 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20  .** unbalanced. 
32250 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68   But odds are th
32260 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e  at we will be in
32270 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72  serting new entr
32280 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ies.** at the en
32290 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64  d soon afterward
322a0 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20  s so the nearly 
322b0 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20  empty page will 
322c0 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20  quickly.** fill 
322d0 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e  up.  On average.
322e0 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20  .**.** pPage is 
322f0 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68  the leaf page wh
32300 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74  ich is the right
32310 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68  -most page in th
32320 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65  e tree..** pPare
32330 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74  nt is its parent
32340 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61  .  pPage must ha
32350 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72  ve a single over
32360 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68  flow entry.** wh
32370 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20  ich is also the 
32380 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
32390 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   on the page..**
323a0 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20 62  .** The pSpace b
323b0 75 66 66 65 72 20 69 73 20 75 73 65 64 20 74 6f  uffer is used to
323c0 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61   store a tempora
323d0 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64  ry copy of the d
323e0 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74  ivider.** cell t
323f0 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65  hat will be inse
32400 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e  rted into pParen
32410 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63  t. Such a cell c
32420 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a  onsists of a 4.*
32430 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  * byte page numb
32440 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  er followed by a
32450 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
32460 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68   integer. In oth
32470 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20  er.** words, at 
32480 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20 48  most 13 bytes. H
32490 65 6e 63 65 20 74 68 65 20 70 53 70 61 63 65 20  ence the pSpace 
324a0 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 61  buffer must be a
324b0 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79  t.** least 13 by
324c0 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  tes in size..*/.
324d0 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
324e0 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65  ce_quick(MemPage
324f0 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61   *pParent, MemPa
32500 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
32510 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72  Space){.  BtShar
32520 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20  ed *const pBt = 
32530 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f  pPage->pBt;    /
32540 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62 61 73  * B-Tree Databas
32550 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
32560 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
32570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
32580 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70  ewly allocated p
32590 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
325a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
325b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
325c0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
325d0 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20    Pgno pgnoNew; 
325e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
325f0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
32600 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f  umber of pNew */
32610 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
32620 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
32630 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
32640 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
32650 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
32660 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
32670 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
32680 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
32690 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20  erflow==1 );..  
326a0 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 63 6f  /* This error co
326b0 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63  ndition is now c
326c0 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72  aught prior to r
326d0 65 61 63 68 69 6e 67 20 74 68 69 73 20 66 75 6e  eaching this fun
326e0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70  ction */.  if( p
326f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
32700 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
32710 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20  ORRUPT_BKPT;..  
32720 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
32730 77 20 70 61 67 65 2e 20 54 68 69 73 20 70 61 67  w page. This pag
32740 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  e will become th
32750 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20  e right-sibling 
32760 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20  of .  ** pPage. 
32770 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20  Make the parent 
32780 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73  page writable, s
32790 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 64  o that the new d
327a0 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a  ivider cell.  **
327b0 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65 64   may be inserted
327c0 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73 65 20  . If both these 
327d0 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73  operations are s
327e0 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65  uccessful, proce
327f0 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ed..  */.  rc = 
32800 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
32810 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70  e(pBt, &pNew, &p
32820 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a  gnoNew, 0, 0);..
32830 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32840 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a  _OK ){..    u8 *
32850 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34  pOut = &pSpace[4
32860 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ];.    u8 *pCell
32870 20 3d 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c   = pPage->apOvfl
32880 5b 30 5d 3b 0a 20 20 20 20 75 31 36 20 73 7a 43  [0];.    u16 szC
32890 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ell = cellSizePt
328a0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
328b0 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a  .    u8 *pStop;.
328c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
328d0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
328e0 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  able(pNew->pDbPa
328f0 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge) );.    asser
32900 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  t( pPage->aData[
32910 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c  0]==(PTF_INTKEY|
32920 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
32930 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65  _LEAF) );.    ze
32940 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46  roPage(pNew, PTF
32950 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
32960 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a  DATA|PTF_LEAF);.
32970 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
32980 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c  (pNew, 1, &pCell
32990 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20  , &szCell);..   
329a0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
329b0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
329c0 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
329d0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20  he pointer map. 
329e0 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69     ** with entri
329f0 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70  es for the new p
32a00 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69  age, and any poi
32a10 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20  nter from the . 
32a20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68     ** cell on th
32a30 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65  e page to an ove
32a40 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65  rflow page. If e
32a50 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20  ither of these. 
32a60 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73     ** operations
32a70 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75   fails, the retu
32a80 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20  rn code is set, 
32a90 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  but the contents
32aa0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
32ab0 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73  arent page are s
32ac0 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64  till manipulated
32ad0 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c   by thh code bel
32ae0 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20  ow..    ** That 
32af0 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70  is Ok, at this p
32b00 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20  oint the parent 
32b10 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65  page is guarante
32b20 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
32b30 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
32b40 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
32b50 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61  ror code will ca
32b60 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c  use a.    ** rol
32b70 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61  lback, undoing a
32b80 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  ny changes made 
32b90 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
32ba0 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
32bb0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
32bc0 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
32bd0 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
32be0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
32bf0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72  Parent->pgno, &r
32c00 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  c);.      if( sz
32c10 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f  Cell>pNew->minLo
32c20 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  cal ){.        p
32c30 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
32c40 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63  pNew, pCell, &rc
32c50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
32c60 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  .  .    /* Creat
32c70 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  e a divider cell
32c80 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
32c90 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76  pParent. The div
32ca0 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a  ider cell.    **
32cb0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
32cc0 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65  -byte page numbe
32cd0 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62  r (the page numb
32ce0 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64  er of pPage) and
32cf0 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62  .    ** a variab
32d00 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61  le length key va
32d10 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74 20  lue (which must 
32d20 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  be the same valu
32d30 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  e as the.    ** 
32d40 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70  largest key on p
32d50 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  Page)..    **.  
32d60 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65    ** To find the
32d70 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c   largest key val
32d80 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72  ue on pPage, fir
32d90 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 68  st find the righ
32da0 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63  t-most .    ** c
32db0 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68  ell on pPage. Th
32dc0 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c  e first two fiel
32dd0 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20  ds of this cell 
32de0 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  are the .    ** 
32df0 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61  record-length (a
32e00 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
32e10 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74   integer at most
32e20 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65   32-bits in size
32e30 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65  ).    ** and the
32e40 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76 61   key value (a va
32e50 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
32e60 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20  teger, may have 
32e70 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20  any value)..    
32e80 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20  ** The first of 
32e90 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  the while(...) l
32ea0 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73  oops below skips
32eb0 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64   over the record
32ec0 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66  -length.    ** f
32ed0 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64  ield. The second
32ee0 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
32ef0 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20   copies the key 
32f00 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20  value from the. 
32f10 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50     ** cell on pP
32f20 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70  age into the pSp
32f30 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20  ace buffer..    
32f40 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  */.    pCell = f
32f50 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
32f60 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a  Page->nCell-1);.
32f70 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65      pStop = &pCe
32f80 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  ll[9];.    while
32f90 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78  ( (*(pCell++)&0x
32fa0 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
32fb0 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  op );.    pStop 
32fc0 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
32fd0 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74   while( ((*(pOut
32fe0 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  ++) = *(pCell++)
32ff0 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c  )&0x80) && pCell
33000 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f  <pStop );..    /
33010 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
33020 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
33030 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20  to pParent. */. 
33040 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50     insertCell(pP
33050 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e  arent, pParent->
33060 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28  nCell, pSpace, (
33070 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65  int)(pOut-pSpace
33080 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
33090 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f    0, pPage->pgno
330a0 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20  , &rc);..    /* 
330b0 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63 68  Set the right-ch
330c0 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70  ild pointer of p
330d0 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20  Parent to point 
330e0 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
330f0 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
33100 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
33110 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
33120 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29  set+8], pgnoNew)
33130 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65  ;.  .    /* Rele
33140 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
33150 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  e to the new pag
33160 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73  e. */.    releas
33170 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d  ePage(pNew);.  }
33180 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
33190 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
331a0 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
331b0 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a  NCE */..#if 0./*
331c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
331d0 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  n does not contr
331e0 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74  ibute anything t
331f0 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
33200 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74  of SQLite..** it
33210 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63   is sometimes ac
33220 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72  tivated temporar
33230 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67 67  ily while debugg
33240 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73  ing code respons
33250 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74  ible .** for set
33260 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70  ting pointer-map
33270 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
33280 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68  tic int ptrmapCh
33290 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65  eckPages(MemPage
332a0 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e   **apPage, int n
332b0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Page){.  int i, 
332c0 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  j;.  for(i=0; i<
332d0 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nPage; i++){.   
332e0 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20   Pgno n;.    u8 
332f0 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  e;.    MemPage *
33300 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69  pPage = apPage[i
33310 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ];.    BtShared 
33320 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
33330 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
33340 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
33350 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
33360 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b  pPage->nCell; j+
33370 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e  +){.      CellIn
33380 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75  fo info;.      u
33390 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20  8 *z;.     .    
333a0 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70    z = findCell(p
333b0 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20  Page, j);.      
333c0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
333d0 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66  r(pPage, z, &inf
333e0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  o);.      if( in
333f0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
33400 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66          Pgno ovf
33410 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b  l = get4byte(&z[
33420 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
33430 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
33440 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  Get(pBt, ovfl, &
33450 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  e, &n);.        
33460 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
33470 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
33480 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b  MAP_OVERFLOW1 );
33490 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
334a0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
334b0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
334c0 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
334d0 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  (z);.        ptr
334e0 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
334f0 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
33500 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
33510 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
33520 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b  =PTRMAP_BTREE );
33530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
33540 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
33550 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
33560 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79  o child = get4by
33570 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
33580 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
33590 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72  t+8]);.      ptr
335a0 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
335b0 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
335c0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
335d0 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
335e0 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20  TRMAP_BTREE );. 
335f0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
33600 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 1;.}.#endif../
33610 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
33620 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  on is used to co
33630 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  py the contents 
33640 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f  of the b-tree no
33650 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e  de stored .** on
33660 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70   page pFrom to p
33670 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65  age pTo. If page
33680 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61   pFrom was not a
33690 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e   leaf page, then
336a0 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
336b0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
336c0 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20  each child page 
336d0 61 72 65 20 75 70 64 61 74 65 64 20 73 6f 20 74  are updated so t
336e0 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e  hat the.** paren
336f0 74 20 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e  t page stored in
33700 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
33710 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66   is page pTo. If
33720 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64   pFrom contained
33730 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69  .** any cells wi
33740 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  th overflow page
33750 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20   pointers, then 
33760 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
33770 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  g pointer.** map
33780 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73   entries are als
33790 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61  o updated so tha
337a0 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
337b0 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a  e is page pTo..*
337c0 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73  *.** If pFrom is
337d0 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79   currently carry
337e0 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ing any overflow
337f0 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20   cells (entries 
33800 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67  in the.** MemPag
33810 65 2e 61 70 4f 76 66 6c 5b 5d 20 61 72 72 61 79  e.apOvfl[] array
33820 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  ), they are not 
33830 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a  copied to pTo. .
33840 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
33850 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f  urning, page pTo
33860 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   is reinitialize
33870 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69  d using btreeIni
33880 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  tPage()..**.** T
33890 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  he performance o
338a0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
338b0 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e  is not critical.
338c0 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64   It is only used
338d0 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61   by .** the bala
338e0 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20  nce_shallower() 
338f0 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  and balance_deep
33900 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c  er() procedures,
33910 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77   neither of.** w
33920 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20  hich are called 
33930 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d  often under norm
33940 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  al circumstances
33950 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
33960 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
33970 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c  (MemPage *pFrom,
33980 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69   MemPage *pTo, i
33990 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
339a0 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
339b0 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  K ){.    BtShare
339c0 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20  d * const pBt = 
339d0 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20  pFrom->pBt;.    
339e0 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d  u8 * const aFrom
339f0 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b   = pFrom->aData;
33a00 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  .    u8 * const 
33a10 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61  aTo = pTo->aData
33a20 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20  ;.    int const 
33a30 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d  iFromHdr = pFrom
33a40 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
33a50 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64   int const iToHd
33a60 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d  r = ((pTo->pgno=
33a70 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a  =1) ? 100 : 0);.
33a80 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
33a90 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20  int iData;.  .  
33aa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
33ab0 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  om->isInit );.  
33ac0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
33ad0 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29  >nFree>=iToHdr )
33ae0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  ;.    assert( ge
33af0 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46  t2byte(&aFrom[iF
33b00 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28 69  romHdr+5]) <= (i
33b10 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
33b20 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ze );.  .    /* 
33b30 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65 20  Copy the b-tree 
33b40 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  node content fro
33b50 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  m page pFrom to 
33b60 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20  page pTo. */.   
33b70 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79 74   iData = get2byt
33b80 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  e(&aFrom[iFromHd
33b90 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r+5]);.    memcp
33ba0 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26  y(&aTo[iData], &
33bb0 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42  aFrom[iData], pB
33bc0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44  t->usableSize-iD
33bd0 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ata);.    memcpy
33be0 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26  (&aTo[iToHdr], &
33bf0 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c  aFrom[iFromHdr],
33c00 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73   pFrom->cellOffs
33c10 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43  et + 2*pFrom->nC
33c20 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ell);.  .    /* 
33c30 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  Reinitialize pag
33c40 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68  e pTo so that th
33c50 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
33c60 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
33c70 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68  ure.    ** match
33c80 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54   the new data. T
33c90 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
33ca0 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63 74  n of pTo can act
33cb0 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65 72  ually fail under
33cc0 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f  .    ** fairly o
33cd0 62 73 63 75 72 65 20 63 69 72 63 75 6d 73 74 61  bscure circumsta
33ce0 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75 67  nces, even thoug
33cf0 68 20 69 74 20 69 73 20 61 20 63 6f 70 79 20 6f  h it is a copy o
33d00 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f initialized . 
33d10 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d     ** page pFrom
33d20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f  ..    */.    pTo
33d30 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
33d40 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
33d50 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 69  Page(pTo);.    i
33d60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33d70 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
33d80 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
33d90 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  n;.    }.  .    
33da0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
33db0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
33dc0 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
33dd0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
33de0 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72  tries.    ** for
33df0 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f   any b-tree or o
33e00 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68  verflow pages th
33e10 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61  at pTo now conta
33e20 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73  ins the pointers
33e30 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   to..    */.    
33e40 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
33e50 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
33e60 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
33e70 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pTo);.    }.  }
33e80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
33e90 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62  outine redistrib
33ea0 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68  utes cells on th
33eb0 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20  e iParentIdx'th 
33ec0 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
33ed0 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22  .** (hereafter "
33ee0 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75  the page") and u
33ef0 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20  p to 2 siblings 
33f00 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  so that all page
33f10 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65  s have about the
33f20 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20  .** same amount 
33f30 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55  of free space. U
33f40 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20  sually a single 
33f50 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65  sibling on eithe
33f60 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a  r side of the.**
33f70 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69   page are used i
33f80 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  n the balancing,
33f90 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62   though both sib
33fa0 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65  lings might come
33fb0 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64   from one.** sid
33fc0 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
33fd0 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61   the first or la
33fe0 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20  st child of its 
33ff0 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70  parent. If the p
34000 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65  age .** has fewe
34010 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67  r than 2 sibling
34020 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69  s (something whi
34030 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
34040 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a  en if the page.*
34050 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65  * is a root page
34060 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61   or a child of a
34070 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e   root page) then
34080 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73   all available s
34090 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69  iblings.** parti
340a0 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
340b0 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  lancing..**.** T
340c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  he number of sib
340d0 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67  lings of the pag
340e0 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65  e might be incre
340f0 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65  ased or decrease
34100 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20  d by .** one or 
34110 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74  two in an effort
34120 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e   to keep pages n
34130 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e  early full but n
34140 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a  ot over full. .*
34150 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
34160 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
34170 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65   is called, some
34180 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
34190 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67   the page.** mig
341a0 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ht not actually 
341b0 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d  be stored in Mem
341c0 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68  Page.aData[]. Th
341d0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a  is can happen.**
341e0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
341f0 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72  overfull. This r
34200 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
34210 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c  hat all cells al
34220 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  located.** to th
34230 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73  e page and its s
34240 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f  iblings fit into
34250 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d   MemPage.aData[]
34260 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
34270 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  g..**.** In the 
34280 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63  course of balanc
34290 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e 64  ing the page and
342a0 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63   its siblings, c
342b0 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69  ells may be.** i
342c0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20  nserted into or 
342d0 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
342e0 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70 50   parent page (pP
342f0 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f  arent). Doing so
34300 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68  .** may cause th
34310 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f  e parent page to
34320 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
34330 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49   or underfull. I
34340 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e  f this.** happen
34350 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  s, it is the res
34360 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
34370 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76  he caller to inv
34380 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  oke the correct.
34390 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75  ** balancing rou
343a0 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73  tine to fix this
343b0 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68   problem (see th
343c0 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74  e balance() rout
343d0 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ine). .**.** If 
343e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
343f0 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
34400 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76  n, it might leav
34410 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  e the database.*
34420 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64  * in a corrupted
34430 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68   state. So if th
34440 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
34450 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
34460 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c  hould.** be roll
34470 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
34480 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
34490 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
344a0 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20  on, aOvflSpace, 
344b0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
344c0 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20  a.** buffer big 
344d0 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f  enough to hold o
344e0 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c  ne page. If whil
344f0 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c  e inserting cell
34500 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
34510 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65  t.** page (pPare
34520 6e 74 29 20 74 68 65 20 70 61 72 65 6e 74 20 70  nt) the parent p
34530 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72  age becomes over
34540 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65  full, this buffe
34550 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  r is.** used to 
34560 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74  store the parent
34570 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  's overflow cell
34580 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20  s. Because this 
34590 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73  function inserts
345a0 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  .** a maximum of
345b0 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65   four divider ce
345c0 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
345d0 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68  ent page, and th
345e0 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a  e maximum.** siz
345f0 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72  e of a cell stor
34600 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74  ed within an int
34610 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c  ernal node is al
34620 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31  ways less than 1
34630 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  /4.** of the pag
34640 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66  e-size, the aOvf
34650 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20  lSpace[] buffer 
34660 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
34670 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f   be large.** eno
34680 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72  ugh for all over
34690 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a  flow cells..**.*
346a0 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20  * If aOvflSpace 
346b0 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c  is set to a null
346c0 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
346d0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
346e0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
346f0 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
34700 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d  (_MSC_VER) && _M
34710 53 43 5f 56 45 52 20 3e 3d 20 31 37 30 30 20 26  SC_VER >= 1700 &
34720 26 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52 4d  & defined(_M_ARM
34730 29 0a 23 70 72 61 67 6d 61 20 6f 70 74 69 6d 69  ).#pragma optimi
34740 7a 65 28 22 22 2c 20 6f 66 66 29 0a 23 65 6e 64  ze("", off).#end
34750 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  if.static int ba
34760 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20  lance_nonroot(. 
34770 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
34780 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
34790 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20   /* Parent page 
347a0 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e  of siblings bein
347b0 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  g balanced */.  
347c0 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20  int iParentIdx, 
347d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
347e0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65  /* Index of "the
347f0 20 70 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e   page" in pParen
34800 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c  t */.  u8 *aOvfl
34810 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20  Space,          
34820 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73         /* page-s
34830 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
34840 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76  ce for parent ov
34850 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f  fl */.  int isRo
34860 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ot,             
34870 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
34880 69 66 20 70 50 61 72 65 6e 74 20 69 73 20 61 20  if pParent is a 
34890 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 69  root-page */.  i
348a0 6e 74 20 62 42 75 6c 6b 20 20 20 20 20 20 20 20  nt bBulk        
348b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
348c0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 63  * True if this c
348d0 61 6c 6c 20 69 73 20 70 61 72 74 20 6f 66 20 61  all is part of a
348e0 20 62 75 6c 6b 20 6c 6f 61 64 20 2a 2f 0a 29 7b   bulk load */.){
348f0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
34900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34910 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74  /* The whole dat
34920 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
34930 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
34940 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
34950 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
34960 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
34970 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20  nMaxCells = 0;  
34980 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
34990 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70  cated size of ap
349a0 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46  Cell, szCell, aF
349b0 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  rom. */.  int nN
349c0 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
349d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
349e0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e   of pages in apN
349f0 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ew[] */.  int nO
34a00 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
34a10 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
34a20 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f   of pages in apO
34a30 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ld[] */.  int i,
34a40 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
34a50 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
34a60 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
34a70 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20   nxDiv;         
34a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
34a90 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69  t divider slot i
34aa0 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c  n pParent->aCell
34ab0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  [] */.  int rc =
34ac0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
34ad0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
34ae0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  rn code */.  u16
34af0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
34b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69            /* 4 i
34b10 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
34b20 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a  f.  0 if not */.
34b30 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20    int leafData; 
34b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34b50 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20  * True if pPage 
34b60 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c  is a leaf of a L
34b70 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a  EAFDATA tree */.
34b80 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63    int usableSpac
34b90 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
34ba0 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65  * Bytes in pPage
34bb0 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64   beyond the head
34bc0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  er */.  int page
34bd0 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
34be0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
34bf0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
34c00 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74   */.  int subtot
34c10 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
34c20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f     /* Subtotal o
34c30 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73  f bytes in cells
34c40 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a   on one page */.
34c50 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20    int iSpace1 = 
34c60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
34c70 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
34c80 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d  yte of aSpace1[]
34c90 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53   */.  int iOvflS
34ca0 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20  pace = 0;       
34cb0 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
34cc0 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c  ed byte of aOvfl
34cd0 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74  Space[] */.  int
34ce0 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20   szScratch;     
34cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
34d00 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d  e of scratch mem
34d10 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f  ory requested */
34d20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c  .  MemPage *apOl
34d30 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  d[NB];          
34d40 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
34d50 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20  to two siblings 
34d60 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
34d70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20  Copy[NB];       
34d80 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70    /* Private cop
34d90 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70  ies of apOld[] p
34da0 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ages */.  MemPag
34db0 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20  e *apNew[NB+2]; 
34dc0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
34dd0 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62  and up to NB sib
34de0 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61  lings after bala
34df0 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70  ncing */.  u8 *p
34e00 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20  Right;          
34e10 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74          /* Locat
34e20 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66  ion in parent of
34e30 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70   right-sibling p
34e40 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ointer */.  u8 *
34e50 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20  apDiv[NB-1];    
34e60 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69           /* Divi
34e70 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  der cells in pPa
34e80 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  rent */.  int cn
34e90 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  tNew[NB+2];     
34ea0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
34eb0 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65  in aCell[] of ce
34ec0 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61  ll after i-th pa
34ed0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65  ge */.  int szNe
34ee0 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
34ef0 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
34f00 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70   size of cells p
34f10 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67  lace on i-th pag
34f20 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
34f30 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
34f40 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
34f50 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
34f60 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
34f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34f80 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
34f90 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
34fa0 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38  apCell[] */.  u8
34fb0 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20   *aSpace1;      
34fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
34fd0 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f  ace for copies o
34fe0 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  f dividers cells
34ff0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
35000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35010 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74     /* Temp var t
35020 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e  o store a page n
35030 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70  umber in */..  p
35040 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42  Bt = pParent->pB
35050 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
35060 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
35070 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
35080 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
35090 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
350a0 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
350b0 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54  e) );..#if 0.  T
350c0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
350d0 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68  begin page %d ch
350e0 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50  ild of %d\n", pP
350f0 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65  age->pgno, pPare
35100 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64  nt->pgno));.#end
35110 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  if..  /* At this
35120 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d   point pParent m
35130 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  ay have at most 
35140 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  one overflow cel
35150 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74  l. And if.  ** t
35160 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  his overflow cel
35170 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74  l is present, it
35180 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 65 6c   must be the cel
35190 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64  l with .  ** ind
351a0 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54  ex iParentIdx. T
351b0 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d  his scenario com
351c0 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68  es about when th
351d0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
351e0 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69   is called (indi
351f0 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c  rectly) from sql
35200 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
35210 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
35220 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  ( pParent->nOver
35230 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65  flow==0 || pPare
35240 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  nt->nOverflow==1
35250 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
35260 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
35270 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
35280 61 69 4f 76 66 6c 5b 30 5d 3d 3d 69 50 61 72 65  aiOvfl[0]==iPare
35290 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20  ntIdx );..  if( 
352a0 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20  !aOvflSpace ){. 
352b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
352c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
352d0 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69  * Find the sibli
352e0 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61  ng pages to bala
352f0 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65  nce. Also locate
35300 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50   the cells in pP
35310 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74  arent .  ** that
35320 20 64 69 76 69 64 65 20 74 68 65 20 73 69 62 6c   divide the sibl
35330 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74  ings. An attempt
35340 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64   is made to find
35350 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
35360 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64  .  ** either sid
35370 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65  e of pPage. More
35380 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61   siblings are ta
35390 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64  ken from one sid
353a0 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a  e, however, .  *
353b0 2a 20 69 66 20 74 68 65 72 65 20 61 72 65 20 66  * if there are f
353c0 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62  ewer than NN sib
353d0 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68  lings on the oth
353e0 65 72 20 73 69 64 65 2e 20 49 66 20 70 50 61 72  er side. If pPar
353f0 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20  ent.  ** has NB 
35400 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65  or fewer childre
35410 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64  n then all child
35420 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61  ren of pParent a
35430 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a  re taken.  .  **
35440 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
35450 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64  also drops the d
35460 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f  ivider cells fro
35470 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  m the parent pag
35480 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79  e. This.  ** way
35490 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  , the remainder 
354a0 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
354b0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
354c0 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20   deal with any. 
354d0 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c   ** overflow cel
354e0 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ls in the parent
354f0 20 70 61 67 65 2c 20 73 69 6e 63 65 20 69 66 20   page, since if 
35500 61 6e 79 20 65 78 69 73 74 65 64 20 74 68 65 79  any existed they
35510 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20   will.  ** have 
35520 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 6d  already been rem
35530 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d  oved..  */.  i =
35540 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
35550 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e  low + pParent->n
35560 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20  Cell;.  if( i<2 
35570 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30  ){.    nxDiv = 0
35580 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
35590 73 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20  ssert( bBulk==0 
355a0 7c 7c 20 62 42 75 6c 6b 3d 3d 31 20 29 3b 0a 20  || bBulk==1 );. 
355b0 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 49 64     if( iParentId
355c0 78 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  x==0 ){         
355d0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e          .      n
355e0 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65  xDiv = 0;.    }e
355f0 6c 73 65 20 69 66 28 20 69 50 61 72 65 6e 74 49  lse if( iParentI
35600 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e  dx==i ){.      n
35610 78 44 69 76 20 3d 20 69 2d 32 2b 62 42 75 6c 6b  xDiv = i-2+bBulk
35620 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
35630 20 20 20 61 73 73 65 72 74 28 20 62 42 75 6c 6b     assert( bBulk
35640 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 78 44  ==0 );.      nxD
35650 69 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d  iv = iParentIdx-
35660 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  1;.    }.    i =
35670 20 32 2d 62 42 75 6c 6b 3b 0a 20 20 7d 0a 20 20   2-bBulk;.  }.  
35680 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 69 66  nOld = i+1;.  if
35690 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  ( (i+nxDiv-pPare
356a0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d  nt->nOverflow)==
356b0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
356c0 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 26  {.    pRight = &
356d0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
356e0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
356f0 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  t+8];.  }else{. 
35700 20 20 20 70 52 69 67 68 74 20 3d 20 66 69 6e 64     pRight = find
35710 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b  Cell(pParent, i+
35720 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
35730 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20  Overflow);.  }. 
35740 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
35750 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68 69 6c  (pRight);.  whil
35760 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  e( 1 ){.    rc =
35770 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
35780 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c  pBt, pgno, &apOl
35790 64 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66  d[i], 0);.    if
357a0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6d 65  ( rc ){.      me
357b0 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28  mset(apOld, 0, (
357c0 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50  i+1)*sizeof(MemP
357d0 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f  age*));.      go
357e0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
357f0 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d  up;.    }.    nM
35800 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f  axCells += 1+apO
35810 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f  ld[i]->nCell+apO
35820 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ld[i]->nOverflow
35830 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d  ;.    if( (i--)=
35840 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  =0 ) break;..   
35850 20 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50   if( i+nxDiv==pP
35860 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d  arent->aiOvfl[0]
35870 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76   && pParent->nOv
35880 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
35890 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61 72 65  apDiv[i] = pPare
358a0 6e 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20  nt->apOvfl[0];. 
358b0 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34       pgno = get4
358c0 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
358d0 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d        szNew[i] =
358e0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
358f0 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
35900 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
35910 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
35920 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35930 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43  apDiv[i] = findC
35940 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e  ell(pParent, i+n
35950 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
35960 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20  verflow);.      
35970 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
35980 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
35990 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c   szNew[i] = cell
359a0 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
359b0 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20   apDiv[i]);..   
359c0 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63     /* Drop the c
359d0 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ell from the par
359e0 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b  ent page. apDiv[
359f0 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20  i] still points 
35a00 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
35a10 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20  cell within the 
35a20 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f  parent, even tho
35a30 75 67 68 20 69 74 20 68 61 73 20 62 65 65 6e 20  ugh it has been 
35a40 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  dropped..      *
35a50 2a 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62  * This is safe b
35a60 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20  ecause dropping 
35a70 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72  a cell only over
35a80 77 72 69 74 65 73 20 74 68 65 20 66 69 72 73 74  writes the first
35a90 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62  .      ** four b
35aa0 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20  ytes of it, and 
35ab0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
35ac0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  es not need the 
35ad0 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66  first.      ** f
35ae0 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74 68 65  our bytes of the
35af0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53   divider cell. S
35b00 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73  o the pointer is
35b10 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20   safe to use.   
35b20 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20     ** later on. 
35b30 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
35b40 20 2a 2a 20 42 75 74 20 6e 6f 74 20 69 66 20 77   ** But not if w
35b50 65 20 61 72 65 20 69 6e 20 73 65 63 75 72 65 2d  e are in secure-
35b60 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20  delete mode. In 
35b70 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
35b80 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  de,.      ** the
35b90 20 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74   dropCell() rout
35ba0 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69  ine will overwri
35bb0 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  te the entire ce
35bc0 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a  ll with zeroes..
35bd0 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
35be0 20 63 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69   case, temporari
35bf0 6c 79 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c  ly copy the cell
35c00 20 69 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53   into the aOvflS
35c10 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20  pace[].      ** 
35c20 62 75 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20  buffer. It will 
35c30 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67  be copied out ag
35c40 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ain as soon as t
35c50 68 65 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66  he aSpace[] buff
35c60 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  er.      ** is a
35c70 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20  llocated.  */.  
35c80 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73      if( pBt->bts
35c90 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
35ca0 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
35cb0 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a       int iOff;..
35cc0 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 53          iOff = S
35cd0 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
35ce0 28 61 70 44 69 76 5b 69 5d 29 20 2d 20 53 51 4c  (apDiv[i]) - SQL
35cf0 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
35d00 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a  Parent->aData);.
35d10 20 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 66          if( (iOf
35d20 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e 74  f+szNew[i])>(int
35d30 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
35d40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
35d50 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
35d60 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
35d70 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20    memset(apOld, 
35d80 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28  0, (i+1)*sizeof(
35d90 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20  MemPage*));.    
35da0 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
35db0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
35dc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35dd0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76       memcpy(&aOv
35de0 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20 61  flSpace[iOff], a
35df0 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69  pDiv[i], szNew[i
35e00 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  ]);.          ap
35e10 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53  Div[i] = &aOvflS
35e20 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50  pace[apDiv[i]-pP
35e30 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20  arent->aData];. 
35e40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35e50 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  .      dropCell(
35e60 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
35e70 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
35e80 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26  low, szNew[i], &
35e90 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
35ea0 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65    /* Make nMaxCe
35eb0 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  lls a multiple o
35ec0 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  f 4 in order to 
35ed0 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a  preserve 8-byte.
35ee0 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a    ** alignment *
35ef0 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  /.  nMaxCells = 
35f00 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26  (nMaxCells + 3)&
35f10 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ~3;..  /*.  ** A
35f20 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
35f30 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  r memory structu
35f40 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70  res.  */.  k = p
35f50 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52  Bt->pageSize + R
35f60 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
35f70 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61  Page));.  szScra
35f80 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61  tch =.       nMa
35f90 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38  xCells*sizeof(u8
35fa0 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
35fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65           /* apCe
35fc0 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61  ll */.     + nMa
35fd0 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31  xCells*sizeof(u1
35fe0 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6)              
35ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65           /* szCe
36000 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74  ll */.     + pBt
36010 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20  ->pageSize      
36020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36030 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
36040 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a  ce1 */.     + k*
36050 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
36060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
36080 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79  e copies (apCopy
36090 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20  ) */.  apCell = 
360a0 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61  sqlite3ScratchMa
360b0 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20  lloc( szScratch 
360c0 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c  ); .  if( apCell
360d0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
360e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
360f0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
36100 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a  leanup;.  }.  sz
36110 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70  Cell = (u16*)&ap
36120 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
36130 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28 75 38  .  aSpace1 = (u8
36140 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&szCell[nMaxCe
36150 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  lls];.  assert( 
36160 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
36170 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b  MENT(aSpace1) );
36180 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64  ..  /*.  ** Load
36190 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
361a0 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e   cells on siblin
361b0 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20  g pages and the 
361c0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
361d0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ** into the loca
361e0 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79  l apCell[] array
361f0 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  .  Make copies o
36200 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
36210 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70  lls.  ** into sp
36220 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
36230 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20  m aSpace1[] and 
36240 72 65 6d 6f 76 65 20 74 68 65 20 64 69 76 69 64  remove the divid
36250 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 66 72  er cells.  ** fr
36260 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a  om pParent..  **
36270 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62  .  ** If the sib
36280 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61  lings are on lea
36290 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68  f pages, then th
362a0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
362b0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76   of the.  ** div
362c0 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73  ider cells are s
362d0 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65  tripped from the
362e0 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68   cells before th
362f0 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20  ey are copied.  
36300 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b  ** into aSpace1[
36310 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  ].  In this way,
36320 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
36330 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f  Cell[] are witho
36340 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f  ut.  ** child po
36350 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c  inters.  If sibl
36360 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
36370 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65  ves, then all ce
36380 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c  ll in.  ** apCel
36390 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c  l[] include chil
363a0 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74  d pointers.  Eit
363b0 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  her way, all cel
363c0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20  ls in apCell[]. 
363d0 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20   ** are alike.. 
363e0 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72   **.  ** leafCor
363f0 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70  rection:  4 if p
36400 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
36410 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e   0 if pPage is n
36420 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20  ot a leaf..  ** 
36430 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20        leafData: 
36440 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64   1 if pPage hold
36450 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70  s key+data and p
36460 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c  Parent holds onl
36470 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c  y keys..  */.  l
36480 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20  eafCorrection = 
36490 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34  apOld[0]->leaf*4
364a0 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20 61  ;.  leafData = a
364b0 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61 74 61  pOld[0]->hasData
364c0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
364d0 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Old; i++){.    i
364e0 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20 0a 20  nt limit;.    . 
364f0 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69     /* Before doi
36500 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ng anything else
36510 2c 20 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  , take a copy of
36520 20 74 68 65 20 69 27 74 68 20 6f 72 69 67 69 6e   the i'th origin
36530 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a  al sibling.    *
36540 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74 68  * The rest of th
36550 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
36560 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74   use data from t
36570 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65 72  he copies rather
36580 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
36590 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
365a0 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e  since the origin
365b0 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65  al pages will be
365c0 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
365d0 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
365e0 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f  overwritten.  */
365f0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
36600 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d  ld = apCopy[i] =
36610 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 53 70 61   (MemPage*)&aSpa
36620 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ce1[pBt->pageSiz
36630 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65  e + k*i];.    me
36640 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f 6c 64  mcpy(pOld, apOld
36650 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50  [i], sizeof(MemP
36660 61 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c 64 2d  age));.    pOld-
36670 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29  >aData = (void*)
36680 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d 65  &pOld[1];.    me
36690 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61 74 61  mcpy(pOld->aData
366a0 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74  , apOld[i]->aDat
366b0 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  a, pBt->pageSize
366c0 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20 3d 20  );..    limit = 
366d0 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64  pOld->nCell+pOld
366e0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
366f0 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72   if( pOld->nOver
36700 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20  flow>0 ){.      
36710 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74  for(j=0; j<limit
36720 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
36730 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
36740 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
36750 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
36760 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43   = findOverflowC
36770 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20  ell(pOld, j);.  
36780 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
36790 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
367a0 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
367b0 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20  Cell]);.        
367c0 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d  nCell++;.      }
367d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
367e0 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70 4f    u8 *aData = pO
367f0 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  ld->aData;.     
36800 20 75 31 36 20 6d 61 73 6b 50 61 67 65 20 3d 20   u16 maskPage = 
36810 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67 65 3b 0a  pOld->maskPage;.
36820 20 20 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66        u16 cellOf
36830 66 73 65 74 20 3d 20 70 4f 6c 64 2d 3e 63 65 6c  fset = pOld->cel
36840 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 66  lOffset;.      f
36850 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b  or(j=0; j<limit;
36860 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   j++){.        a
36870 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
36880 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
36890 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
368a0 3d 20 66 69 6e 64 43 65 6c 6c 76 32 28 61 44 61  = findCellv2(aDa
368b0 74 61 2c 20 6d 61 73 6b 50 61 67 65 2c 20 63 65  ta, maskPage, ce
368c0 6c 6c 4f 66 66 73 65 74 2c 20 6a 29 3b 0a 20 20  llOffset, j);.  
368d0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
368e0 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
368f0 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
36900 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20  Cell]);.        
36910 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d  nCell++;.      }
36920 0a 20 20 20 20 7d 20 20 20 20 20 20 20 0a 20 20  .    }       .  
36930 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 26    if( i<nOld-1 &
36940 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a 20 20  & !leafData){.  
36950 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28 75 31      u16 sz = (u1
36960 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  6)szNew[i];.    
36970 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20    u8 *pTemp;.   
36980 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
36990 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
369a0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
369b0 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70 54  ] = sz;.      pT
369c0 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69  emp = &aSpace1[i
369d0 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 69  Space1];.      i
369e0 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20  Space1 += sz;.  
369f0 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
36a00 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33  pBt->maxLocal+23
36a10 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
36a20 28 20 69 53 70 61 63 65 31 20 3c 3d 20 28 69 6e  ( iSpace1 <= (in
36a30 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  t)pBt->pageSize 
36a40 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
36a50 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c  pTemp, apDiv[i],
36a60 20 73 7a 29 3b 0a 20 20 20 20 20 20 61 70 43 65   sz);.      apCe
36a70 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d  ll[nCell] = pTem
36a80 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  p+leafCorrection
36a90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
36aa0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
36ab0 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63 74  0 || leafCorrect
36ac0 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
36ad0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
36ae0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 20  szCell[nCell] - 
36af0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
36b00 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d        if( !pOld-
36b10 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
36b20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
36b30 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  rection==0 );.  
36b40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
36b50 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30  ld->hdrOffset==0
36b60 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   );.        /* T
36b70 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72  he right pointer
36b80 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
36b90 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20  ge pOld becomes 
36ba0 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20  the left.       
36bb0 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74   ** pointer of t
36bc0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  he divider cell 
36bd0 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  */.        memcp
36be0 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c  y(apCell[nCell],
36bf0 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 38 5d   &pOld->aData[8]
36c00 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 4);.      }els
36c10 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
36c20 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
36c30 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  n==4 );.        
36c40 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c  if( szCell[nCell
36c50 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ]<4 ){.         
36c60 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
36c70 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c   any cells small
36c80 65 72 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e  er than 4 bytes.
36c90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 7a   */.          sz
36ca0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b  Cell[nCell] = 4;
36cb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36cc0 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b   }.      nCell++
36cd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
36ce0 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75  *.  ** Figure ou
36cf0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
36d00 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20  pages needed to 
36d10 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63  hold all nCell c
36d20 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65  ells..  ** Store
36d30 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20   this number in 
36d40 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75  "k".  Also compu
36d50 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68  te szNew[] which
36d60 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20   is the total.  
36d70 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  ** size of all c
36d80 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68  ells on the i-th
36d90 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77   page and cntNew
36da0 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20  [] which is the 
36db0 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70  index.  ** in ap
36dc0 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65  Cell[] of the ce
36dd0 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73 20  ll that divides 
36de0 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65  page i from page
36df0 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74   i+1.  .  ** cnt
36e00 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71  New[k] should eq
36e10 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a  ual nCell..  **.
36e20 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70    ** Values comp
36e30 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f  uted by this blo
36e40 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ck:.  **.  **   
36e50 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74          k: The t
36e60 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
36e70 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a  ibling pages.  *
36e80 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53  *    szNew[i]: S
36e90 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68  paced used on th
36ea0 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
36eb0 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e  age..  **   cntN
36ec0 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20  ew[i]: Index in 
36ed0 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43  apCell[] and szC
36ee0 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69  ell[] for the fi
36ef0 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a  rst cell to.  **
36f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
36f10 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 69  e right of the i
36f20 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65  -th sibling page
36f30 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61  ..  ** usableSpa
36f40 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79  ce: Number of by
36f50 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76 61  tes of space ava
36f60 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73  ilable on each s
36f70 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20  ibling..  ** .  
36f80 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65  */.  usableSpace
36f90 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
36fa0 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f  ze - 12 + leafCo
36fb0 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28  rrection;.  for(
36fc0 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20  subtotal=k=i=0; 
36fd0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
36fe0 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61     assert( i<nMa
36ff0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75  xCells );.    su
37000 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c  btotal += szCell
37010 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28  [i] + 2;.    if(
37020 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62   subtotal > usab
37030 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  leSpace ){.     
37040 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
37050 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d  otal - szCell[i]
37060 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b  ;.      cntNew[k
37070 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28  ] = i;.      if(
37080 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d   leafData ){ i--
37090 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74  ; }.      subtot
370a0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b  al = 0;.      k+
370b0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3e 4e  +;.      if( k>N
370c0 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51 4c 49  B+1 ){ rc = SQLI
370d0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
370e0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
370f0 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d 0a 20  eanup; }.    }. 
37100 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20   }.  szNew[k] = 
37110 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e  subtotal;.  cntN
37120 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20  ew[k] = nCell;. 
37130 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   k++;..  /*.  **
37140 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d   The packing com
37150 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72 65  puted by the pre
37160 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62  vious block is b
37170 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68 65  iased toward the
37180 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f   siblings.  ** o
37190 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e  n the left side.
371a0 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69    The left sibli
371b0 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e  ngs are always n
371c0 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c  early full, whil
371d0 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74  e the.  ** right
371e0 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69  -most sibling mi
371f0 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d  ght be nearly em
37200 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b  pty.  This block
37210 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74   of code attempt
37220 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74  s.  ** to adjust
37230 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20   the packing of 
37240 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20  siblings to get 
37250 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65  a better balance
37260 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
37270 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d   adjustment is m
37280 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69  ore than an opti
37290 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70  mization.  The p
372a0 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67  acking above mig
372b0 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75  ht.  ** be so ou
372c0 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20  t of balance as 
372d0 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20  to be illegal.  
372e0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
372f0 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
37300 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
37310 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  e completely emp
37320 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74  ty.  This adjust
37330 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  ment is not opti
37340 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  onal..  */.  for
37350 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  (i=k-1; i>0; i--
37360 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67  ){.    int szRig
37370 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20  ht = szNew[i];  
37380 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
37390 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  ng on the right 
373a0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66  */.    int szLef
373b0 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20  t = szNew[i-1]; 
373c0 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
373d0 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  ng on the left *
373e0 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20  /.    int r;    
373f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
37400 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74  ex of right-most
37410 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69   cell in left si
37420 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  bling */.    int
37430 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   d;             
37440 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
37450 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c  st cell to the l
37460 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69 62  eft of right sib
37470 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d  ling */..    r =
37480 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
37490 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20  ;.    d = r + 1 
374a0 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
374b0 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65  assert( d<nMaxCe
374c0 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  lls );.    asser
374d0 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( r<nMaxCells )
374e0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52  ;.    while( szR
374f0 69 67 68 74 3d 3d 30 20 0a 20 20 20 20 20 20 20  ight==0 .       
37500 7c 7c 20 28 21 62 42 75 6c 6b 20 26 26 20 73 7a  || (!bBulk && sz
37510 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b  Right+szCell[d]+
37520 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c  2<=szLeft-(szCel
37530 6c 5b 72 5d 2b 32 29 29 20 0a 20 20 20 20 29 7b  l[r]+2)) .    ){
37540 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b  .      szRight +
37550 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b  = szCell[d] + 2;
37560 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d  .      szLeft -=
37570 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a   szCell[r] + 2;.
37580 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31        cntNew[i-1
37590 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63  ]--;.      r = c
375a0 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
375b0 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20        d = r + 1 
375c0 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
375d0 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d  }.    szNew[i] =
375e0 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a   szRight;.    sz
375f0 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66  New[i-1] = szLef
37600 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74  t;.  }..  /* Eit
37610 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65  her we found one
37620 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28   or more cells (
37630 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72  cntnew[0])>0) or
37640 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a 20 61   pPage is.  ** a
37650 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
37660 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72  ge.  A virtual r
37670 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65 6e  oot page is when
37680 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20   the real root. 
37690 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67 65   ** page is page
376a0 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74 68   1 and we are th
376b0 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20  e only child of 
376c0 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2a 0a  that page..  **.
376d0 20 20 2a 2a 20 55 50 44 41 54 45 3a 20 20 54 68    ** UPDATE:  Th
376e0 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
376f0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
37700 69 6c 79 20 74 72 75 65 20 69 66 20 74 68 65 20  ily true if the 
37710 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69  database.  ** fi
37720 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20  le is corrupt.  
37730 54 68 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  The corruption w
37740 69 6c 6c 20 62 65 20 64 65 74 65 63 74 65 64 20  ill be detected 
37750 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74  and reported lat
37760 65 72 0a 20 20 2a 2a 20 69 6e 20 74 68 69 73 20  er.  ** in this 
37770 70 72 6f 63 65 64 75 72 65 20 73 6f 20 74 68 65  procedure so the
37780 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
37790 20 61 63 74 20 75 70 6f 6e 20 69 74 20 6e 6f 77   act upon it now
377a0 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  ..  */.#if 0.  a
377b0 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d  ssert( cntNew[0]
377c0 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e  >0 || (pParent->
377d0 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65  pgno==1 && pPare
377e0 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b  nt->nCell==0) );
377f0 0a 23 65 6e 64 69 66 0a 0a 20 20 54 52 41 43 45  .#endif..  TRACE
37800 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a  (("BALANCE: old:
37810 20 25 64 20 25 64 20 25 64 20 20 22 2c 0a 20 20   %d %d %d  ",.  
37820 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f    apOld[0]->pgno
37830 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f  , .    nOld>=2 ?
37840 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20   apOld[1]->pgno 
37850 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33  : 0,.    nOld>=3
37860 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e   ? apOld[2]->pgn
37870 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f  o : 0.  ));..  /
37880 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
37890 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65  k new pages.  Re
378a0 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68  use old pages wh
378b0 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20  ere possible..  
378c0 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b 30  */.  if( apOld[0
378d0 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20  ]->pgno<=1 ){.  
378e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
378f0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
37900 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
37910 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65  anup;.  }.  page
37920 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d  Flags = apOld[0]
37930 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f  ->aData[0];.  fo
37940 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
37950 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
37960 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e  New;.    if( i<n
37970 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  Old ){.      pNe
37980 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61  w = apNew[i] = a
37990 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61  pOld[i];.      a
379a0 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pOld[i] = 0;.   
379b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
379c0 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e  agerWrite(pNew->
379d0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
379e0 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nNew++;.      if
379f0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
37a00 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
37a10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
37a20 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
37a30 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
37a40 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
37a50 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 28 62 42  pNew, &pgno, (bB
37a60 75 6c 6b 20 3f 20 31 20 3a 20 70 67 6e 6f 29 2c  ulk ? 1 : pgno),
37a70 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
37a80 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
37a90 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
37aa0 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b  apNew[i] = pNew;
37ab0 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a  .      nNew++;..
37ac0 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65        /* Set the
37ad0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
37ae0 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  ry for the new s
37af0 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
37b00 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f        if( ISAUTO
37b10 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
37b20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
37b30 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52   pNew->pgno, PTR
37b40 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
37b50 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  nt->pgno, &rc);.
37b60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
37b70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37b80 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
37b90 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
37ba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
37bb0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
37bc0 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65  ree any old page
37bd0 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20  s that were not 
37be0 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61  reused as new pa
37bf0 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ges..  */.  whil
37c00 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  e( i<nOld ){.   
37c10 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b   freePage(apOld[
37c20 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66  i], &rc);.    if
37c30 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
37c40 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
37c50 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
37c60 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c  ld[i]);.    apOl
37c70 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b  d[i] = 0;.    i+
37c80 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  +;.  }..  /*.  *
37c90 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61  * Put the new pa
37ca0 67 65 73 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ges in ascending
37cb0 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65   order.  This he
37cc0 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70  lps to.  ** keep
37cd0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
37ce0 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64  disk file in ord
37cf0 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61  er so that a sca
37d00 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61  n.  ** of the ta
37d10 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20  ble is a linear 
37d20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  scan through the
37d30 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a   file.  That.  *
37d40 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20  * in turn helps 
37d50 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
37d60 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20  stem to deliver 
37d70 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20  pages.  ** from 
37d80 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61  the disk more ra
37d90 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pidly..  **.  **
37da0 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72   An O(n^2) inser
37db0 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69  tion sort algori
37dc0 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74  thm is used, but
37dd0 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73   since.  ** n is
37de0 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e   never more than
37df0 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e   NB (a small con
37e00 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f  stant), that sho
37e10 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  uld.  ** not be 
37e20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a  a problem..  **.
37e30 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c    ** When NB==3,
37e40 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69   this one optimi
37e50 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65  zation makes the
37e60 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61   database.  ** a
37e70 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20  bout 25% faster 
37e80 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74  for large insert
37e90 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f  ions and deletio
37ea0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ns..  */.  for(i
37eb0 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b  =0; i<k-1; i++){
37ec0 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20  .    int minV = 
37ed0 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a  apNew[i]->pgno;.
37ee0 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69      int minI = i
37ef0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b  ;.    for(j=i+1;
37f00 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<k; j++){.    
37f10 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e    if( apNew[j]->
37f20 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d  pgno<(unsigned)m
37f30 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  inV ){.        m
37f40 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  inI = j;.       
37f50 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d   minV = apNew[j]
37f60 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  ->pgno;.      }.
37f70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69      }.    if( mi
37f80 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 4d 65  nI>i ){.      Me
37f90 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20  mPage *pT;.     
37fa0 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a   pT = apNew[i];.
37fb0 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
37fc0 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20   apNew[minI];.  
37fd0 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20      apNew[minI] 
37fe0 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pT;.    }.  }.
37ff0 20 20 54 52 41 43 45 28 28 22 6e 65 77 3a 20 25    TRACE(("new: %
38000 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
38010 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
38020 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b  )\n",.    apNew[
38030 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b  0]->pgno, szNew[
38040 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20  0],.    nNew>=2 
38050 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f  ? apNew[1]->pgno
38060 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20   : 0, nNew>=2 ? 
38070 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20  szNew[1] : 0,.  
38080 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65    nNew>=3 ? apNe
38090 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[2]->pgno : 0, 
380a0 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b  nNew>=3 ? szNew[
380b0 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  2] : 0,.    nNew
380c0 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e  >=4 ? apNew[3]->
380d0 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  pgno : 0, nNew>=
380e0 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30  4 ? szNew[3] : 0
380f0 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20  ,.    nNew>=5 ? 
38100 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a  apNew[4]->pgno :
38110 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a   0, nNew>=5 ? sz
38120 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20  New[4] : 0));.. 
38130 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
38140 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
38150 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
38160 65 29 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  e) );.  put4byte
38170 28 70 52 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e  (pRight, apNew[n
38180 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a  New-1]->pgno);..
38190 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79    /*.  ** Evenly
381a0 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20   distribute the 
381b0 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  data in apCell[]
381c0 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20   across the new 
381d0 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65  pages..  ** Inse
381e0 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  rt divider cells
381f0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73   into pParent as
38200 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
38210 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  j = 0;.  for(
38220 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
38230 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62  ){.    /* Assemb
38240 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  le the new sibli
38250 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
38260 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
38270 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73  apNew[i];.    as
38280 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
38290 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67  s );.    zeroPag
382a0 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67  e(pNew, pageFlag
382b0 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65  s);.    assemble
382c0 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65  Page(pNew, cntNe
382d0 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b  w[i]-j, &apCell[
382e0 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b  j], &szCell[j]);
382f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
38300 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e  w->nCell>0 || (n
38310 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77  New==1 && cntNew
38320 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61  [0]==0) );.    a
38330 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76  ssert( pNew->nOv
38340 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20  erflow==0 );..  
38350 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b    j = cntNew[i];
38360 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
38370 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73  sibling page ass
38380 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73  embled above was
38390 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d   not the right-m
383a0 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20  ost sibling,.   
383b0 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76   ** insert a div
383c0 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74  ider cell into t
383d0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
383e0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
383f0 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a  t( i<nNew-1 || j
38400 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69  ==nCell );.    i
38410 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20  f( j<nCell ){.  
38420 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
38430 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
38440 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20        int sz;.. 
38450 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
38460 4d 61 78 43