/ Hex Artifact Content
Login

Artifact 2087125172421c78fc0c02f953b7d660f2a2598e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e     iTab = pIdx->
1850: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20  pTable->tnum;.  
1860: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1870: 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20  lse{.    iTab = 
1880: 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iRoot;.  }..  /*
1890: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
18a0: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45  required lock. E
18b0: 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f  ither a write-lo
18c0: 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20  ck on root-page 
18d0: 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72  iTab, a .  ** wr
18e0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
18f0: 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72  schema table, or
1900: 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20   (if the client 
1910: 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20  is reading) a.  
1920: 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  ** read-lock on 
1930: 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63  iTab will suffic
1940: 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61  e. Return 1 if a
1950: 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ny of these are 
1960: 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72  found.  */.  for
1970: 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70  (pLock=pBtree->p
1980: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
1990: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
19a0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
19b0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42  Lock->pBtree==pB
19c0: 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70  tree .     && (p
19d0: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Lock->iTable==iT
19e0: 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c  ab || (pLock->eL
19f0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1a00: 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  && pLock->iTable
1a10: 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c  ==1)).     && pL
1a20: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ock->eLock>=eLoc
1a30: 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20  kType .    ){.  
1a40: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1a50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61    }.  }..  /* Fa
1a60: 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  iled to find the
1a70: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1a80: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
1a90: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1aa0: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64  E_DEBUG */..#ifd
1ab0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1ac0: 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e  /*.**** This fun
1ad0: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65  ction may be use
1ae0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
1af0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1b00: 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a   only. ****.**.*
1b10: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1b20: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c   it would be ill
1b30: 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20  egal for pBtree 
1b40: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
1b50: 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1b60: 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52  dex rooted at iR
1b70: 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65  oot because othe
1b80: 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  r shared connect
1b90: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75  ions are.** simu
1ba0: 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69  ltaneously readi
1bb0: 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62  ng that same tab
1bc0: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  le or index..**.
1bd0: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
1be0: 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77   for pBtree to w
1bf0: 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68  rite if some oth
1c00: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1c10: 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74  that.** shares t
1c20: 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64  he same BtShared
1c30: 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65   object is curre
1c40: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
1c50: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69  writing.** the i
1c60: 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63  Root table.  Exc
1c70: 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65  ept, if the othe
1c80: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68  r Btree object h
1c90: 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75  as the.** read-u
1ca0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1cb0: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
1cc0: 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  OK for the other
1cd0: 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61   object to.** ha
1ce0: 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  ve a read cursor
1cf0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1d00: 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74  ple, before writ
1d10: 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20  ing to any part 
1d20: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1d30: 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20  index.** rooted 
1d40: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f  at page iRoot, o
1d50: 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a  ne should call:.
1d60: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
1d70: 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1d80: 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74  ts(pBtree, iRoot
1d90: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
1da0: 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  nt hasReadConfli
1db0: 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cts(Btree *pBtre
1dc0: 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a  e, Pgno iRoot){.
1dd0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1de0: 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1df0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1e00: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1e10: 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1e20: 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26  ==iRoot .     &&
1e30: 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72   p->pBtree!=pBtr
1e40: 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70  ee.     && 0==(p
1e50: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c  ->pBtree->db->fl
1e60: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
1e70: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20  dUncommitted).  
1e80: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
1e90: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1ea0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1eb0: 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66  dif    /* #ifdef
1ec0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
1ed0: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
1ee0: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
1ef0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
1f00: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
1f10: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
1f20: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
1f30: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
1f40: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
1f50: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
1f60: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
1f70: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
1f80: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
1f90: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
1fa0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
1fb0: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
1fc0: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
1fd0: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
1fe0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1ff0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
2000: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
2010: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2020: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
2030: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
2040: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2050: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2060: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2070: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2080: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2090: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
20a0: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
20b0: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
20c0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
20d0: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c  eadUncommitted)|
20e0: 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  |eLock==WRITE_LO
20f0: 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20  CK||iTab==1 );. 
2100: 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73   .  /* If reques
2110: 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ting a write-loc
2120: 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65  k, then the Btre
2130: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f  e must have an o
2140: 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74  pen write.  ** t
2150: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2160: 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62  is file. And, ob
2170: 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69  viously, for thi
2180: 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65  s to be so there
2190: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61   .  ** must be a
21a0: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
21b0: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
21c0: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  file itself..  *
21d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  /.  assert( eLoc
21e0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
21f0: 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72  (p==pBt->pWriter
2200: 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
2210: 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a  TRANS_WRITE) );.
2220: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2230: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42  =READ_LOCK || pB
2240: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2250: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
2260: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  .  .  /* This ro
2270: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2280: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
2290: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
22a0: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d  led */.  if( !p-
22b0: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
22c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22d0: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
22e0: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
22f0: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
2300: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
2310: 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71  ck, the.  ** req
2320: 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20  uested lock may 
2330: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
2340: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2350: 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28  >pWriter!=p && (
2360: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2370: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  BTS_EXCLUSIVE)!=
2380: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2390: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
23a0: 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57  d(p->db, pBt->pW
23b0: 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20  riter->db);.    
23c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
23d0: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
23e0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74  ;.  }..  for(pIt
23f0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
2400: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
2410: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  r->pNext){.    /
2420: 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  * The condition 
2430: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
2440: 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c  Lock) in the fol
2450: 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a  lowing if(...) .
2460: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
2470: 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61   is a simplifica
2480: 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  tion of:.    **.
2490: 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d      **   (eLock=
24a0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70  =WRITE_LOCK || p
24b0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
24c0: 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a  TE_LOCK).    **.
24d0: 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
24e0: 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f  know that if eLo
24f0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20  ck==WRITE_LOCK, 
2500: 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f  then no other co
2510: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nnection.    ** 
2520: 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45  may hold a WRITE
2530: 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62  _LOCK on any tab
2540: 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  le in this file 
2550: 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e  (since there can
2560: 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20  .    ** only be 
2570: 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29  a single writer)
2580: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2590: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63  ert( pIter->eLoc
25a0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
25b0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
25c0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  ITE_LOCK );.    
25d0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
25e0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
25f0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20  r->pBtree==p || 
2600: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
2610: 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  AD_LOCK);.    if
2620: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
2630: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
2640: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74  ble==iTab && pIt
2650: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
2660: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2670: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2680: 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d  ed(p->db, pIter-
2690: 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
26a0: 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57      if( eLock==W
26b0: 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RITE_LOCK ){.   
26c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
26d0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
26e0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73          pBt->bts
26f0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e  Flags |= BTS_PEN
2700: 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DING;.      }.  
2710: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2720: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2730: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
2740: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2750: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2760: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2770: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2780: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2790: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
27a0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
27b0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
27c0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
27d0: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
27e0: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
27f0: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
2800: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
2810: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
2820: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
2830: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
2840: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2850: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2860: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2870: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2880: 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ed Btree object 
2890: 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  p is connected t
28a0: 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20  o a sharable.** 
28b0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
28c0: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53  one with the BtS
28d0: 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66  hared.sharable f
28e0: 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a  lag set), and.**
28f0: 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68  .**   (b) No oth
2900: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73  er Btree objects
2910: 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61   hold a lock tha
2920: 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20  t conflicts.**  
2930: 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65       with the re
2940: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e  quested lock (i.
2950: 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61  e. querySharedCa
2960: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68  cheTableLock() h
2970: 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65  as.**       alre
2980: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2990: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c  and returned SQL
29a0: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53  ITE_OK)..**.** S
29b0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
29c0: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
29d0: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
29e0: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e  sfully. SQLITE_N
29f0: 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75  OMEM .** is retu
2a00: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2a10: 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a   attempt fails..
2a20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2a30: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2a40: 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  eLock(Btree *p, 
2a50: 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20  Pgno iTable, u8 
2a60: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
2a70: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2a80: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
2a90: 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  k = 0;.  BtLock 
2aa0: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2ab0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2ac0: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2ad0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2ae0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
2af0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2b00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2b10: 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  db!=0 );..  /* A
2b20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
2b30: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
2b40: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77  itted flag set w
2b50: 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f  ill never try to
2b60: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72  .  ** obtain a r
2b70: 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74  ead-lock using t
2b80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  his function. Th
2b90: 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b  e only read-lock
2ba0: 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62   obtained.  ** b
2bb0: 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  y a connection i
2bc0: 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  n read-uncommitt
2bd0: 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68  ed mode is on th
2be0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2bf0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  .  ** table, and
2c00: 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62   that lock is ob
2c10: 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42  tained in BtreeB
2c20: 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f  eginTrans().  */
2c30: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70  .  assert( 0==(p
2c40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
2c50: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2c60: 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  ed) || eLock==WR
2c70: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  ITE_LOCK );..  /
2c80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2c90: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2ca0: 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61  alled on a shara
2cb0: 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72  ble b-tree after
2cc0: 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65   it .  ** has be
2cd0: 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  en determined th
2ce0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72  at no other b-tr
2cf0: 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c  ee holds a confl
2d00: 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f  icting lock.  */
2d10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2d20: 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  arable );.  asse
2d30: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
2d40: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2d50: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
2d60: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
2d70: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
2d80: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
2d90: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
2da0: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
2db0: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
2dc0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
2dd0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2de0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
2df0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2e00: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
2e10: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
2e20: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
2e30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2e40: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
2e50: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
2e60: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
2e70: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
2e80: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
2e90: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
2ea0: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
2eb0: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
2ec0: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
2ed0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
2ee0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
2ef0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
2f00: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
2f10: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
2f20: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
2f30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2f40: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2f50: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
2f60: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
2f70: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
2f80: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
2f90: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
2fa0: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
2fb0: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
2fc0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
2fd0: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
2fe0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
2ff0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
3000: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
3010: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
3020: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
3030: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
3040: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
3050: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
3060: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
3070: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
3080: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
3090: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
30a0: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
30b0: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
30c0: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
30d0: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
30e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
30f0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
3100: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
3110: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
3120: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
3130: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
3140: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
3150: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
3160: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
3170: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
3180: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
3190: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20  calls to.** the 
31a0: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
31b0: 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64  bleLock() proced
31c0: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
31d0: 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a  ee object p..**.
31e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
31f0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42 74   assumes that Bt
3200: 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65  ree p has an ope
3210: 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  n read or write 
3220: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
3230: 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c   If it does not,
3240: 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45   then the BTS_PE
3250: 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61  NDING flag.** ma
3260: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3270: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3280: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3290: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
32a0: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
32b0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
32c0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
32d0: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
32e0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
32f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
3300: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
3310: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
3320: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
3330: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3340: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3350: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3360: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3370: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3380: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3390: 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
33a0: 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49  gs & BTS_EXCLUSI
33b0: 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  VE)==0 || pBt->p
33c0: 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70  Writer==pLock->p
33d0: 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73  Btree );.    ass
33e0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  ert( pLock->pBtr
33f0: 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f  ee->inTrans>=pLo
3400: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck->eLock );.   
3410: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72   if( pLock->pBtr
3420: 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a  ee==p ){.      *
3430: 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e  ppIter = pLock->
3440: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73  pNext;.      ass
3450: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  ert( pLock->iTab
3460: 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d  le!=1 || pLock==
3470: 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20  &p->lock );.    
3480: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61    if( pLock->iTa
3490: 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ble!=1 ){.      
34a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
34b0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Lock);.      }. 
34c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34d0: 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d  ppIter = &pLock-
34e0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
34f0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  }..  assert( (pB
3500: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
3510: 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c  S_PENDING)==0 ||
3520: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b   pBt->pWriter );
3530: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3540: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42  ter==p ){.    pB
3550: 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a  t->pWriter = 0;.
3560: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
3570: 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55  s &= ~(BTS_EXCLU
3580: 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47  SIVE|BTS_PENDING
3590: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
35a0: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
35b0: 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==2 ){.    /* Th
35c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
35d0: 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65  alled when Btree
35e0: 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67   p is concluding
35f0: 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61   its .    ** tra
3600: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65  nsaction. If the
3610: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  re currently exi
3620: 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e  sts a writer, an
3630: 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  d p is not.    *
3640: 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74  * that writer, t
3650: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
3660: 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
3670: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
3680: 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68  r.    ** than th
3690: 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65  e writer must be
36a0: 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74   about to drop t
36b0: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
36c0: 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20  case.    ** set 
36d0: 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20  the BTS_PENDING 
36e0: 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a  flag to 0..    *
36f0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72  *.    ** If ther
3700: 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  e is not current
3710: 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65  ly a writer, the
3720: 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75  n BTS_PENDING mu
3730: 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72  st.    ** be zer
3740: 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68  o already. So th
3750: 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20  is next line is 
3760: 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74  harmless in that
3770: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
3780: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3790: 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b  &= ~BTS_PENDING;
37a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
37b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e  is function chan
37c0: 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f  ges all write-lo
37d0: 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72 65  cks held by Btre
37e0: 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f  e p into read-lo
37f0: 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  cks..*/.static v
3800: 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c  oid downgradeAll
3810: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
3820: 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b  Locks(Btree *p){
3830: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3840: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28   = p->pBt;.  if(
3850: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
3860: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3870: 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e  pLock;.    pBt->
3880: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3890: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
38a0: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
38b0: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
38c0: 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42      for(pLock=pB
38d0: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b  t->pLock; pLock;
38e0: 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e   pLock=pLock->pN
38f0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
3900: 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  rt( pLock->eLock
3910: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
3920: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3930: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  );.      pLock->
3940: 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
3950: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  K;.    }.  }.}..
3960: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3970: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3980: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
3990: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
39a0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
39b0: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
39c0: 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a  rence */../*.***
39d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
39e0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
39f0: 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20  f assert() only 
3a00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66  ****.**.** Verif
3a10: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
3a20: 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65  r holds the mute
3a30: 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65  x on its BtShare
3a40: 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d.*/.#ifdef SQLI
3a50: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
3a60: 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  int cursorHoldsM
3a70: 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70  utex(BtCursor *p
3a80: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
3a90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3aa0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ->pBt->mutex);.}
3ab0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
3ac0: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
3ad0: 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20  erflow cache of 
3ae0: 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65  the cursor passe
3af0: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
3b00: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74  rgument..** on t
3b10: 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  he shared btree 
3b20: 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a  structure pBt..*
3b30: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69  /.#define invali
3b40: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
3b50: 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63  e(pCur) (pCur->c
3b60: 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
3b70: 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a  _ValidOvfl)../*.
3b80: 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68  ** Invalidate th
3b90: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
3ba0: 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61  list cache for a
3bb0: 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
3bc0: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  d.** on the shar
3bd0: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
3be0: 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69  re pBt..*/.stati
3bf0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
3c00: 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
3c10: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
3c20: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3c30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3c40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
3c50: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  t->mutex) );.  f
3c60: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
3c70: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
3c80: 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
3c90: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
3ca0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
3cb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
3cc0: 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69  CRBLOB./*.** Thi
3cd0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
3ce0: 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69  lled before modi
3cf0: 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  fying the conten
3d00: 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a  ts of a table.**
3d10: 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
3d20: 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  ny incrblob curs
3d30: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65  ors that are ope
3d40: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20  n on the.** row 
3d50: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  or one of the ro
3d60: 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  ws being modifie
3d70: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  d..**.** If argu
3d80: 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c  ment isClearTabl
3d90: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
3da0: 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
3db0: 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61  nts of the.** ta
3dc0: 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ble is about to 
3dd0: 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  be deleted. In t
3de0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3df0: 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62  ate all incrblob
3e00: 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  .** cursors open
3e10: 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68   on any row with
3e20: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  in the table wit
3e30: 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f  h root-page pgno
3e40: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  Root..**.** Othe
3e50: 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65  rwise, if argume
3e60: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
3e70: 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74  is false, then t
3e80: 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72  he row with.** r
3e90: 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69  owid iRow is bei
3ea0: 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64  ng replaced or d
3eb0: 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20  eleted. In this 
3ec0: 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a  case invalidate.
3ed0: 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e  ** only those in
3ee0: 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f  crblob cursors o
3ef0: 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63  pen on that spec
3f00: 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  ific row..*/.sta
3f10: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
3f20: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
3f30: 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  rs(.  Btree *pBt
3f40: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ree,          /*
3f50: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
3f60: 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
3f70: 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20   i64 iRow,      
3f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3f90: 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74  rowid that might
3fa0: 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a   be changing */.
3fb0: 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62    int isClearTab
3fc0: 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  le        /* Tru
3fd0: 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72  e if all rows ar
3fe0: 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  e being deleted 
3ff0: 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  */.){.  BtCursor
4000: 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20   *p;.  BtShared 
4010: 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70  *pBt = pBtree->p
4020: 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
4030: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
4040: 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a  utex(pBtree) );.
4050: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
4060: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
4070: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ext){.    if( (p
4080: 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
4090: 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 0a 20  F_Incrblob)!=0. 
40a0: 20 20 20 20 26 26 20 28 69 73 43 6c 65 61 72 54      && (isClearT
40b0: 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e  able || p->info.
40c0: 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20  nKey==iRow).    
40d0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61  ){.      p->eSta
40e0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
40f0: 4c 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  LID;.    }.  }.}
4100: 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75  ..#else.  /* Stu
4110: 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20  b function when 
4120: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
4130: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
4140: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4150: 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a  lobCursors(x,y,z
4160: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
4170: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
4180: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62   */../*.** Set b
4190: 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42  it pgno of the B
41a0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
41b0: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
41c0: 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77   is called .** w
41d0: 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74 20  hen a page that 
41e0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61  previously conta
41f0: 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65  ined data become
4200: 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  s a free-list le
4210: 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a  af .** page..**.
4220: 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64 2e  ** The BtShared.
4230: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4240: 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72  ec exists to wor
4250: 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63  k around an obsc
4260: 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65  ure.** bug cause
4270: 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61 63  d by the interac
4280: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66  tion of two usef
4290: 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69  ul IO optimizati
42a0: 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a  ons surrounding.
42b0: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ** free-list lea
42c0: 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  f pages:.**.**  
42d0: 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74   1) When all dat
42e0: 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  a is deleted fro
42f0: 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68 65  m a page and the
4300: 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a   page becomes.**
4310: 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73        a free-lis
4320: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
4330: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69   page is not wri
4340: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
4350: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73  base.**      (as
4360: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4370: 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f  pages contain no
4380: 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61   meaningful data
4390: 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ). Sometimes.** 
43a0: 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67 65       such a page
43b0: 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75   is not even jou
43c0: 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77  rnalled (as it w
43d0: 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66  ill not be modif
43e0: 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79  ied,.**      why
43f0: 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c   bother journall
4400: 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ing it?)..**.** 
4410: 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65 65    2) When a free
4420: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4430: 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20 63  is reused, its c
4440: 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65  ontent is not re
4450: 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
4460: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
4470: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
4480: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79  ournal file (why
4490: 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20   should it.**   
44a0: 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73 20     be, if it is 
44b0: 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69  not at all meani
44c0: 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42  ngful?)..**.** B
44d0: 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68  y themselves, th
44e0: 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ese optimization
44f0: 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20  s work fine and 
4500: 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a  provide a handy.
4510: 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  ** performance b
4520: 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c  oost to bulk del
4530: 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70  ete or insert op
4540: 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65  erations. Howeve
4550: 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20  r, if.** a page 
4560: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
4570: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68  free-list and th
4580: 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69 6e  en reused within
4590: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61   the same.** tra
45a0: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62  nsaction, a prob
45b0: 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66  lem comes up. If
45c0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
45d0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
45e0: 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20  .** it is moved 
45f0: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
4600: 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20   and it is also 
4610: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
4620: 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74  hen it.** is ext
4630: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
4640: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65  free-list and re
4650: 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f  used, then the o
4660: 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20  riginal data.** 
4670: 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20  may be lost. In 
4680: 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
4690: 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20  ollback, it may 
46a0: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
46b0: 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
46c0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
46d0: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
46e0: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  guration..**.** 
46f0: 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
4700: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4710: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4720: 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67 65   Whenever a page
4730: 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f   is .** moved to
4740: 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c   become a free-l
4750: 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74  ist leaf page, t
4760: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
4770: 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69   bit is.** set i
4780: 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57 68  n the bitvec. Wh
4790: 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70 61  enever a leaf pa
47a0: 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ge is extracted 
47b0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
47c0: 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  st,.** optimizat
47d0: 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f  ion 2 above is o
47e0: 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63 6f  mitted if the co
47f0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4800: 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65  is already.** se
4810: 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48  t in BtShared.pH
4820: 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63  asContent. The c
4830: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
4840: 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72 65  itvec are cleare
4850: 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  d.** at the end 
4860: 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61 63  of every transac
4870: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
4880: 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73 43  int btreeSetHasC
4890: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
48a0: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
48b0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
48c0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
48d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
48e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
48f0: 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20  gno<=pBt->nPage 
4900: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61 73  );.    pBt->pHas
4910: 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65  Content = sqlite
4920: 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 42  3BitvecCreate(pB
4930: 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  t->nPage);.    i
4940: 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e  f( !pBt->pHasCon
4950: 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  tent ){.      rc
4960: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
4970: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4980: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4990: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
49a0: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
49b0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
49c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
49d0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
49e0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
49f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4a00: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4a10: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4a20: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4a30: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4a40: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4a50: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4a60: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4a70: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4a80: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4a90: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4aa0: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4ab0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4ac0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ad0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4ae0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4af0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4b00: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4b10: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4b20: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4b30: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4b40: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4b50: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4b60: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4b70: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4b80: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4b90: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4ba0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4bb0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4bc0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4bd0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4be0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4bf0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4c00: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4c10: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4c20: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
4c30: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4c40: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
4c50: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
4c60: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
4c70: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
4c80: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
4c90: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
4ca0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
4cb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
4cc0: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
4cd0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
4ce0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
4cf0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
4d00: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
4d10: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
4d20: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
4d30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
4d40: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
4d50: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
4d60: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
4d70: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
4d80: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
4d90: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
4da0: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  1;.}.../*.** Sav
4db0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
4dc0: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e  rsor position in
4dd0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42   the variables B
4de0: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a  tCursor.nKey .**
4df0: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b   and BtCursor.pK
4e00: 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73  ey. The cursor's
4e10: 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
4e20: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
4e30: 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  EEK..**.** The c
4e40: 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
4e50: 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
4e60: 72 20 69 73 20 76 61 6c 69 64 20 28 68 61 73 20  r is valid (has 
4e70: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
4e80: 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74  ALID).** prior t
4e90: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
4ea0: 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61  outine.  .*/.sta
4eb0: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
4ec0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
4ed0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
4ee0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
4ef0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
4f00: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
4f10: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
4f20: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
4f30: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
4f40: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
4f50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
4f60: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
4f70: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20  &pCur->nKey);.  
4f80: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
4f90: 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65 79  TE_OK );  /* Key
4fa0: 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61  Size() cannot fa
4fb0: 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  il */..  /* If t
4fc0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
4fd0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
4fe0: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
4ff0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
5000: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
5010: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
5020: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
5030: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
5040: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
5050: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
5060: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
5070: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
5080: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
5090: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
50a0: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
50b0: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
50c0: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
50d0: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
50e0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43 75   */.  if( 0==pCu
50f0: 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
5100: 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f 69 64  tKey ){.    void
5110: 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   *pKey = sqlite3
5120: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
5130: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
5140: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
5150: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
5160: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
5170: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
5180: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5190: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
51a0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
51b0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
51c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
51d0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
51e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
51f0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5200: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5210: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
5220: 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   !pCur->apPage[0
5230: 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  ]->intKey || !pC
5240: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
5250: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5260: 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c   ){.    btreeRel
5270: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5280: 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43  es(pCur);.    pC
5290: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
52a0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
52b0: 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61  .  }..  invalida
52c0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
52d0: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
52e0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
52f0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
5300: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
5310: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
5320: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
5330: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
5340: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
5350: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
5360: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
5370: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
5380: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5390: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
53a0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
53b0: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
53c0: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
53d0: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
53e0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
53f0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
5400: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
5410: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
5420: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
5430: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
5440: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
5450: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
5460: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
5470: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
5480: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
5490: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
54a0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
54b0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
54c0: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
54d0: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
54e0: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
54f0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
5500: 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f  n note:  This ro
5510: 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65  utine merely che
5520: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
5530: 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65  y cursors.** nee
5540: 64 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20  d to be saved.  
5550: 49 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20  It calls out to 
5560: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
5570: 74 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73  t() in the (unus
5580: 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68  ual).** event th
5590: 61 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69  at cursors are i
55a0: 6e 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20  n need to being 
55b0: 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  saved..*/.static
55c0: 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73   int saveAllCurs
55d0: 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
55e0: 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42  t, Pgno iRoot, B
55f0: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
5600: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
5610: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5620: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5630: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5640: 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d  assert( pExcept=
5650: 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70  =0 || pExcept->p
5660: 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72  Bt==pBt );.  for
5670: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
5680: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
5690: 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63  .    if( p!=pExc
56a0: 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74  ept && (0==iRoot
56b0: 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   || p->pgnoRoot=
56c0: 3d 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b  =iRoot) ) break;
56d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 20  .  }.  return p 
56e0: 3f 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  ? saveCursorsOnL
56f0: 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45  ist(p, iRoot, pE
5700: 78 63 65 70 74 29 20 3a 20 53 51 4c 49 54 45 5f  xcept) : SQLITE_
5710: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68  OK;.}../* This h
5720: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f  elper routine to
5730: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20   saveAllCursors 
5740: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20  does the actual 
5750: 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a  work of saving.*
5760: 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66  * the cursors if
5770: 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73   and when a curs
5780: 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  or is found that
5790: 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
57a0: 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68  es saving..** Th
57b0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73  e common case is
57c0: 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73   that no cursors
57d0: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
57e0: 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  d, so this routi
57f0: 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20  ne is.** broken 
5800: 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c  out from its cal
5810: 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ler to avoid unn
5820: 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70  ecessary stack p
5830: 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e  ointer movement.
5840: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
5850: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
5860: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5870: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c  (.  BtCursor *p,
5880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5890: 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61  first cursor tha
58a0: 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a  t needs saving *
58b0: 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  /.  Pgno iRoot, 
58c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
58d0: 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74   save cursor wit
58e0: 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61  h this iRoot. Sa
58f0: 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a  ve all if zero *
5900: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45  /.  BtCursor *pE
5910: 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e  xcept    /* Do n
5920: 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72  ot save this cur
5930: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a  sor */.){.  do{.
5940: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
5950: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
5960: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
5970: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
5980: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
5990: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
59a0: 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
59b0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
59c0: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  on(p);.        i
59d0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
59e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
59f0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
5a00: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
5a10: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
5a20: 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  ( p->iPage>0 );.
5a30: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c          btreeRel
5a40: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5a50: 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  es(p);.      }. 
5a60: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
5a70: 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28  pNext;.  }while(
5a80: 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53   p );.  return S
5a90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5aa0: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72  ** Clear the cur
5ab0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
5ac0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
5ad0: 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
5ae0: 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
5af0: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
5b00: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5b10: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
5b20: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
5b30: 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70  pKey);.  pCur->p
5b40: 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Key = 0;.  pCur-
5b50: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5b60: 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  _INVALID;.}../*.
5b70: 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69  ** In this versi
5b80: 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74  on of BtreeMovet
5b90: 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63  o, pKey is a pac
5ba0: 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ked index record
5bb0: 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67  .** such as is g
5bc0: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
5bd0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
5be0: 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68  code.  Unpack th
5bf0: 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20  e.** record and 
5c00: 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d  then call BtreeM
5c10: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
5c20: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a  to do the work..
5c30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
5c40: 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43  reeMoveto(.  BtC
5c50: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
5c60: 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20   /* Cursor open 
5c70: 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20  on the btree to 
5c80: 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  be searched */. 
5c90: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
5ca0: 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b  y,   /* Packed k
5cb0: 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20  ey if the btree 
5cc0: 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20  is an index */. 
5cd0: 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20   i64 nKey,      
5ce0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
5cf0: 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20  key for tables. 
5d00: 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f   Size of pKey fo
5d10: 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  r indices */.  i
5d20: 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20  nt bias,        
5d30: 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63     /* Bias searc
5d40: 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
5d50: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
5d60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
5d70: 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
5d80: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
5d90: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
5da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
5db0: 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55  atus code */.  U
5dc0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
5dd0: 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70  IdxKey;   /* Unp
5de0: 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
5df0: 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63 65  */.  char aSpace
5e00: 5b 32 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20  [200];          
5e10: 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f  /* Temp space fo
5e20: 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61  r pIdxKey - to a
5e30: 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f  void a malloc */
5e40: 0a 20 20 63 68 61 72 20 2a 70 46 72 65 65 20 3d  .  char *pFree =
5e50: 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20   0;..  if( pKey 
5e60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
5e70: 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e  Key==(i64)(int)n
5e80: 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b  Key );.    pIdxK
5e90: 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
5ea0: 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
5eb0: 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70 43 75  ord(.        pCu
5ec0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70  r->pKeyInfo, aSp
5ed0: 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61  ace, sizeof(aSpa
5ee0: 63 65 29 2c 20 26 70 46 72 65 65 0a 20 20 20 20  ce), &pFree.    
5ef0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
5f00: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
5f10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5f20: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
5f30: 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70  rdUnpack(pCur->p
5f40: 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b  KeyInfo, (int)nK
5f50: 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65  ey, pKey, pIdxKe
5f60: 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  y);.    if( pIdx
5f70: 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29  Key->nField==0 )
5f80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
5f90: 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  bFree(pCur->pKey
5fa0: 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29  Info->db, pFree)
5fb0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
5fc0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
5fd0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  PT;.    }.  }els
5fe0: 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  e{.    pIdxKey =
5ff0: 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   0;.  }.  rc = s
6000: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
6010: 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20  oUnpacked(pCur, 
6020: 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62  pIdxKey, nKey, b
6030: 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66  ias, pRes);.  if
6040: 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73  ( pFree ){.    s
6050: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75  qlite3DbFree(pCu
6060: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  r->pKeyInfo->db,
6070: 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72   pFree);.  }.  r
6080: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6090: 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  ** Restore the c
60a0: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73  ursor to the pos
60b0: 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20  ition it was in 
60c0: 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20  (or as close to 
60d0: 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20  as possible).** 
60e0: 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50  when saveCursorP
60f0: 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61  osition() was ca
6100: 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20  lled. Note that 
6110: 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65  this call delete
6120: 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20  s the .** saved 
6130: 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74  position info st
6140: 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73  ored by saveCurs
6150: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f  orPosition(), so
6160: 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
6170: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66   at most one eff
6180: 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75  ective restoreCu
6190: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63  rsorPosition() c
61a0: 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a  all after each .
61b0: 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  ** saveCursorPos
61c0: 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74  ition()..*/.stat
61d0: 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73 74  ic int btreeRest
61e0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
61f0: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
6200: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
6210: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
6220: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
6230: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
6240: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
6250: 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
6260: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
6270: 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
6280: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
6290: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
62a0: 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  }.  pCur->eState
62b0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
62c0: 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d  D;.  rc = btreeM
62d0: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
62e0: 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b  ->pKey, pCur->nK
62f0: 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b  ey, 0, &pCur->sk
6300: 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72  ipNext);.  if( r
6310: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6320: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6330: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
6340: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
6350: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
6360: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
6370: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
6380: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6390: 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  _INVALID );.    
63a0: 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
63b0: 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  xt && pCur->eSta
63c0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
63d0: 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
63e0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
63f0: 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a  SKIPNEXT;.    }.
6400: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6410: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
6420: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6430: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
6440: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
6450: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
6460: 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72       btreeRestor
6470: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6480: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
6490: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
64a0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
64b0: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
64c0: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
64d0: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
64e0: 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20  where.** it was 
64f0: 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20  last placed, or 
6500: 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64  has been invalid
6510: 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68  ated for any oth
6520: 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75  er reason..** Cu
6530: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
6540: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
6550: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74   are pointing at
6560: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a   is deleted out.
6570: 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ** from under th
6580: 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  em, for example.
6590: 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61    Cursor might a
65a0: 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74  lso move if a bt
65b0: 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61  ree.** is rebala
65c0: 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  nced..**.** Call
65d0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
65e0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72   with a NULL cur
65f0: 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75  sor pointer retu
6600: 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a  rns false..**.**
6610: 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74   Use the separat
6620: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
6630: 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f  rsorRestore() ro
6640: 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65  utine to restore
6650: 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63   a cursor.** bac
6660: 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75  k to where it ou
6670: 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69  ght to be if thi
6680: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
6690: 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s true..*/.int s
66a0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
66b0: 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73  rHasMoved(BtCurs
66c0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
66d0: 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65  urn pCur->eState
66e0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  !=CURSOR_VALID;.
66f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6700: 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61  utine restores a
6710: 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20   cursor back to 
6720: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73  its original pos
6730: 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a  ition after it.*
6740: 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64  * has been moved
6750: 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65   by some outside
6760: 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68 20   activity (such 
6770: 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61 6c  as a btree rebal
6780: 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77  ance or.** a row
6790: 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c   having been del
67a0: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
67b0: 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e  der the cursor).
67c0: 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63    .**.** On succ
67d0: 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65  ess, the *pDiffe
67e0: 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65  rentRow paramete
67f0: 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  r is false if th
6800: 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
6810: 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  .** pointing at 
6820: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
6830: 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e   row.  *pDiffern
6840: 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20  tRow is the row 
6850: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
6860: 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61  s pointing to ha
6870: 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20  s been deleted, 
6880: 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72 73  forcing the curs
6890: 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73  or to point to s
68a0: 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f  ome.** nearby ro
68b0: 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  w..**.** This ro
68c0: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
68d0: 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20  y be called for 
68e0: 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75  a cursor that ju
68f0: 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54  st returned.** T
6900: 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  RUE from sqlite3
6910: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
6920: 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ved()..*/.int sq
6930: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
6940: 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72  Restore(BtCursor
6950: 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69   *pCur, int *pDi
6960: 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69  fferentRow){.  i
6970: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
6980: 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61  ( pCur!=0 );.  a
6990: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
69a0: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
69b0: 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  D );.  rc = rest
69c0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
69d0: 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
69e0: 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  c ){.    *pDiffe
69f0: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20  rentRow = 1;.   
6a00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6a10: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
6a20: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
6a30: 20 7c 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e   || NEVER(pCur->
6a40: 73 6b 69 70 4e 65 78 74 21 3d 30 29 20 29 7b 0a  skipNext!=0) ){.
6a50: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
6a60: 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ow = 1;.  }else{
6a70: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
6a80: 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Row = 0;.  }.  r
6a90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6aa0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
6ab0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
6ac0: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
6ad0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
6ae0: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
6af0: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
6b00: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
6b10: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
6b20: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
6b30: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
6b40: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
6b50: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
6b60: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
6b70: 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61   (not a valid pa
6b80: 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20  ge) for pgno==1 
6b90: 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a  since there is.*
6ba0: 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70  * no pointer map
6bb0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6bc0: 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e   page 1.  The in
6bd0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f  tegrity_check lo
6be0: 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20  gic.** requires 
6bf0: 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e  that ptrmapPagen
6c00: 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74  o(*,1)!=1..*/.st
6c10: 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70  atic Pgno ptrmap
6c20: 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20  Pageno(BtShared 
6c30: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
6c40: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65  {.  int nPagesPe
6c50: 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f  rMapPage;.  Pgno
6c60: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
6c70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6c80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
6c90: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
6ca0: 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e   pgno<2 ) return
6cb0: 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d   0;.  nPagesPerM
6cc0: 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75  apPage = (pBt->u
6cd0: 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a  sableSize/5)+1;.
6ce0: 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e    iPtrMap = (pgn
6cf0: 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61  o-2)/nPagesPerMa
6d00: 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28  pPage;.  ret = (
6d10: 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65  iPtrMap*nPagesPe
6d20: 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a  rMapPage) + 2; .
6d30: 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49    if( ret==PENDI
6d40: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
6d50: 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a  ) ){.    ret++;.
6d60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
6d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
6d80: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
6d90: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
6da0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6db0: 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70  ne updates the p
6dc0: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
6dd0: 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
6de0: 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61   'key'.** so tha
6df0: 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70  t it maps to typ
6e00: 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61  e 'eType' and pa
6e10: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
6e20: 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49   'pgno'..**.** I
6e30: 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61  f *pRC is initia
6e40: 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f  lly non-zero (no
6e50: 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65  n-SQLITE_OK) the
6e60: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
6e70: 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  s.** a no-op.  I
6e80: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
6e90: 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  s, the appropria
6ea0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
6eb0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
6ec0: 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63   *pRC..*/.static
6ed0: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28   void ptrmapPut(
6ee0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
6ef0: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
6f00: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20  e, Pgno parent, 
6f10: 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50  int *pRC){.  DbP
6f20: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
6f30: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6f40: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
6f50: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
6f60: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6f70: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
6f80: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
6f90: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
6fa0: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
6fb0: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
6fc0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
6fd0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
6fe0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
6ff0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
7000: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  n code from subf
7010: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69  unctions */..  i
7020: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
7030: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
7040: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7050: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
7060: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
7070: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
7080: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
7090: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
70a0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
70b0: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
70c0: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
70d0: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
70e0: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
70f0: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
7100: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
7110: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  y==0 ){.    *pRC
7120: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7130: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
7140: 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61  rn;.  }.  iPtrma
7150: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
7160: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
7170: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
7180: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
7190: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
71a0: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
71b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
71c0: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
71d0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
71e0: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
71f0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
7200: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
7210: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
7220: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7230: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
7240: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
7250: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7260: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7270: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7280: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
7290: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
72a0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
72b0: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
72c0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
72d0: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
72e0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
72f0: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
7300: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
7310: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
7320: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
7330: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
7340: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
7350: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
7360: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
7370: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7380: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
7390: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
73a0: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
73b0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
73c0: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
73d0: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
73e0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
73f0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
7400: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
7410: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
7420: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
7430: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7440: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
7450: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
7460: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
7470: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
7480: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
7490: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
74a0: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
74b0: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
74c0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
74d0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
74e0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
74f0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
7500: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
7510: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
7520: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
7530: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
7540: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
7550: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
7560: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
7570: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7580: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
7590: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
75a0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
75b0: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
75c0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
75d0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
75e0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
75f0: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
7600: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
7610: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
7620: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
7630: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7640: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7650: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
7660: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
7670: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
7680: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
7690: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
76a0: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
76b0: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
76c0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
76d0: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
76e0: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
76f0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
7700: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
7710: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
7720: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
7730: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
7740: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
7750: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
7760: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
7770: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7780: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
7790: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
77a0: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
77b0: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
77c0: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
77d0: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
77e0: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
77f0: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
7800: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
7810: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
7820: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
7830: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
7840: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
7850: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
7860: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7870: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74  RUPT_BKPT;.  ret
7880: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7890: 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65  ..#else /* if de
78a0: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
78b0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
78c0: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
78d0: 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a  Put(w,x,y,z,rc).
78e0: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
78f0: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
7900: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
7910: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
7920: 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64  r(x, y, rc).#end
7930: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
7940: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
7950: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
7960: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
7970: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
7980: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
7990: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
79a0: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
79b0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
79c0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
79d0: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tent..**.** This
79e0: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f   routine works o
79f0: 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68  nly for pages th
7a00: 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  at do not contai
7a10: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
7a20: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e  ..*/.#define fin
7a30: 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28  dCell(P,I) \.  (
7a40: 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50  (P)->aData + ((P
7a50: 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  )->maskPage & ge
7a60: 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 43 65  t2byte(&(P)->aCe
7a70: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
7a80: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
7a90: 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b 28  v2(D,M,O,I) (D+(
7aa0: 4d 26 67 65 74 32 62 79 74 65 28 44 2b 28 4f 2b  M&get2byte(D+(O+
7ab0: 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a 2a  2*(I))))).../*.*
7ac0: 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f  * This a more co
7ad0: 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66  mplex version of
7ae0: 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74   findCell() that
7af0: 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61   works for.** pa
7b00: 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74  ges that do cont
7b10: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
7b20: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ls..*/.static u8
7b30: 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65   *findOverflowCe
7b40: 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
7b50: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
7b60: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
7b70: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7b80: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
7b90: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72  >mutex) );.  for
7ba0: 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  (i=pPage->nOverf
7bb0: 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  low-1; i>=0; i--
7bc0: 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  ){.    int k;.  
7bd0: 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e 61 69 4f    k = pPage->aiO
7be0: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  vfl[i];.    if( 
7bf0: 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k<=iCell ){.    
7c00: 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29    if( k==iCell )
7c10: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
7c20: 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 69   pPage->apOvfl[i
7c30: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
7c40: 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a   iCell--;.    }.
7c50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e    }.  return fin
7c60: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
7c70: 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ll);.}../*.** Pa
7c80: 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65  rse a cell conte
7c90: 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c  nt block and fil
7ca0: 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66  l in the CellInf
7cb0: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
7cc0: 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76  ere.** are two v
7cd0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
7ce0: 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65 65  function.  btree
7cf0: 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65  ParseCell() take
7d00: 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64  s a .** cell ind
7d10: 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ex as the second
7d20: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62 74   argument and bt
7d30: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7d40: 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f  ) .** takes a po
7d50: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64  inter to the bod
7d60: 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73  y of the cell as
7d70: 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75   its second argu
7d80: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
7d90: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
7da0: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
7db0: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
7dc0: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
7dd0: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
7de0: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
7e00: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
7e10: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
7e20: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
7e30: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
7e40: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
7e50: 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  /.){.  u8 *pIter
7e60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7e70: 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74  * For scanning t
7e80: 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a  hrough pCell */.
7e90: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
7ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7eb0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
7ec0: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
7ed0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7ee0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
7ef0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
7f00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
7f10: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
7f20: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
7f30: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
7f40: 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
7f50: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
7f60: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20  childPtrSize==0 
7f70: 29 3b 0a 20 20 20 20 70 49 74 65 72 20 3d 20 70  );.    pIter = p
7f80: 43 65 6c 6c 20 2b 20 67 65 74 56 61 72 69 6e 74  Cell + getVarint
7f90: 33 32 28 70 43 65 6c 6c 2c 20 6e 50 61 79 6c 6f  32(pCell, nPaylo
7fa0: 61 64 29 3b 0a 20 20 20 20 70 49 74 65 72 20 2b  ad);.    pIter +
7fb0: 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74 65  = getVarint(pIte
7fc0: 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  r, (u64*)&pInfo-
7fd0: 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 20  >nKey);.  }else 
7fe0: 69 66 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79  if( pPage->noPay
7ff0: 6c 6f 61 64 20 29 7b 0a 20 20 20 20 61 73 73 65  load ){.    asse
8000: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
8010: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
8020: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
8030: 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26   4 + getVarint(&
8040: 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29  pCell[4], (u64*)
8050: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
8060: 20 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f     pInfo->nPaylo
8070: 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e 66  ad = 0;.    pInf
8080: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20  o->nLocal = 0;. 
8090: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
80a0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e  low = 0;.    pIn
80b0: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30  fo->pPayload = 0
80c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
80d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
80e0: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
80f0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
8100: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
8110: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
8120: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70  nPayload);.    p
8130: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
8140: 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e  yload;.  }.  pIn
8150: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
8160: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
8170: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
8180: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
8190: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
81a0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
81b0: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
81c0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
81d0: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
81e0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
81f0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
8200: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
8210: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
8220: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
8230: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
8240: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
8250: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
8260: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
8270: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
8280: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
8290: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
82a0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
82b0: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
82c0: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
82d0: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
82e0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
82f0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
8300: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8310: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
8320: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
8330: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
8340: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
8350: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
8360: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
8370: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
8380: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
8390: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
83a0: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
83b0: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
83c0: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
83d0: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
83e0: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
83f0: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
8400: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
8410: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
8420: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
8430: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
8440: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
8450: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
8460: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
8470: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
8480: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
8490: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
84a0: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
84b0: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
84c0: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
84d0: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
84e0: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
84f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
8500: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
8510: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8520: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8530: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
8540: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
8550: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8560: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8570: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
8580: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
8590: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
85a0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
85b0: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
85c0: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
85d0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
85e0: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
85f0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
8600: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
8610: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
8620: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
8630: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
8640: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
8650: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
8660: 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ==maxLocal );.  
8670: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8680: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
8690: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
86a0: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
86b0: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
86c0: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
86d0: 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  plus;.    }else{
86e0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
86f0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
8700: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
8710: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8720: 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d   = (u16)(&pInfo-
8730: 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d  >pPayload[pInfo-
8740: 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c  >nLocal] - pCell
8750: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  );.    pInfo->nS
8760: 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76  ize = pInfo->iOv
8770: 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a  erflow + 4;.  }.
8780: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
8790: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
87a0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
87b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
87c0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
87d0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
87e0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
87f0: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
8800: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
8810: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
8820: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
8830: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
8840: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
8850: 7b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  {.  btreeParseCe
8860: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e  llPtr(pPage, fin
8870: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
8880: 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ll), pInfo);.}..
8890: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
88a0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
88b0: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
88c0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
88d0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
88e0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
88f0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
8900: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
8910: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
8920: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
8930: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
8940: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
8950: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
8960: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
8970: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
8980: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ter..*/.static u
8990: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d  16 cellSizePtr(M
89a0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
89b0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
89c0: 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b  *pIter = pCell +
89d0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
89e0: 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f  Size; /* For loo
89f0: 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20  ping over bytes 
8a00: 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  of pCell */.  u8
8a10: 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *pEnd;         
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
8a40: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
8a50: 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20  */.  u32 nSize; 
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8a80: 20 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72   Size value to r
8a90: 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66  eturn */..#ifdef
8aa0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
8ab0: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  /* The value ret
8ac0: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
8ad0: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c  nction should al
8ae0: 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65  ways be the same
8af0: 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65   as.  ** the (Ce
8b00: 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61  llInfo.nSize) va
8b10: 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69  lue found by doi
8b20: 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20  ng a full parse 
8b30: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  of the.  ** cell
8b40: 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55  . If SQLITE_DEBU
8b50: 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  G is defined, an
8b60: 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65   assert() at the
8b70: 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20   bottom of.  ** 
8b80: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65  this function ve
8b90: 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73  rifies that this
8ba0: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f   invariant is no
8bb0: 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20  t violated. */. 
8bc0: 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69   CellInfo debugi
8bd0: 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72 73  nfo;.  btreePars
8be0: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
8bf0: 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66  pCell, &debuginf
8c00: 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  o);.#endif..  if
8c10: 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f  ( pPage->noPaylo
8c20: 61 64 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d  ad ){.    pEnd =
8c30: 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20   &pIter[9];.    
8c40: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
8c50: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
8c60: 70 45 6e 64 20 29 3b 0a 20 20 20 20 61 73 73 65  pEnd );.    asse
8c70: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
8c80: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
8c90: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 28 70    return (u16)(p
8ca0: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
8cb0: 20 7d 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49   }.  nSize = *pI
8cc0: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
8cd0: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
8ce0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a  nd = &pIter[9];.
8cf0: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
8d00: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
8d10: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
8d20: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
8d30: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
8d40: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
8d50: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
8d60: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
8d70: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
8d80: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
8d90: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
8da0: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
8db0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
8dc0: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
8dd0: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
8de0: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
8df0: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
8e00: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
8e10: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
8e20: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
8e30: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
8e40: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
8e50: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
8e60: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
8e70: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
8e80: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
8e90: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
8ea0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
8eb0: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
8ec0: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
8ed0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
8ee0: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
8ef0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
8f00: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
8f10: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
8f20: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
8f30: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
8f40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
8f50: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
8f60: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
8f70: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
8f80: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
8f90: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
8fa0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
8fb0: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
8fc0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
8fd0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
8fe0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
8ff0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
9000: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
9010: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
9020: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
9030: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
9040: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
9050: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
9060: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
9070: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
9080: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
9090: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
90a0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
90b0: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64  6)nSize;.}..#ifd
90c0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
90d0: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
90e0: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
90f0: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
9100: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
9110: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
9120: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
9130: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
9140: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
9150: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65  ll){.  return ce
9160: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
9170: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
9180: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
9190: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
91a0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
91b0: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
91c0: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
91d0: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
91e0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
91f0: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
9200: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
9210: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
9220: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
9230: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
9240: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
9250: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
9260: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
9270: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
9280: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
9290: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
92a0: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
92b0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
92c0: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72  Cell!=0 );.  btr
92d0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
92e0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
92f0: 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
9300: 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
9310: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
9320: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
9330: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
9340: 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61     ptrmapPut(pPa
9350: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
9360: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
9370: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52   pPage->pgno, pR
9380: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
9390: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
93a0: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
93b0: 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61  en.  All Cells a
93c0: 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
93d0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  ** end of the pa
93e0: 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20  ge and all free 
93f0: 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74  space is collect
9400: 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62  ed into one.** b
9410: 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20  ig FreeBlk that 
9420: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
9430: 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  n the header and
9440: 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72   cell.** pointer
9450: 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63   array and the c
9460: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
9470: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9480: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d  defragmentPage(M
9490: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
94a0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94c0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
94d0: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94f0: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  Address of the i
9500: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
9510: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
9520: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
9530: 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  et to the page h
9540: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73  eader */.  int s
9550: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
9560: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
9570: 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74   a cell */.  int
9580: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
9590: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
95a0: 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65  r of usable byte
95b0: 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s on a page */. 
95c0: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
95e0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
95f0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
9600: 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20  */.  int cbrk;  
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
9630: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
9640: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ea */.  int nCel
9650: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
9660: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9670: 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
9680: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
9690: 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
96a0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61    /* The page da
96b0: 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ta */.  unsigned
96c0: 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20   char *temp;    
96d0: 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20     /* Temp area 
96e0: 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  for cell content
96f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46   */.  int iCellF
9700: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
9710: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
9720: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
9730: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73  /.  int iCellLas
9740: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
9750: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
9760: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a  cell index */...
9770: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9780: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
9790: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
97a0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
97b0: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
97c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
97d0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
97e0: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   <= SQLITE_MAX_P
97f0: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73  AGE_SIZE );.  as
9800: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
9810: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
9820: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9830: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
9840: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
9850: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33    temp = sqlite3
9860: 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
9870: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
9880: 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  r);.  data = pPa
9890: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
98a0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
98b0: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
98c0: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
98d0: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
98e0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
98f0: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
9900: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
9910: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62  dr+3]) );.  usab
9920: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
9930: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
9940: 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62 79  .  cbrk = get2by
9950: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
9960: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70  ;.  memcpy(&temp
9970: 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62  [cbrk], &data[cb
9980: 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20  rk], usableSize 
9990: 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b 20  - cbrk);.  cbrk 
99a0: 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
99b0: 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
99c0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c  lOffset + 2*nCel
99d0: 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  l;.  iCellLast =
99e0: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
99f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
9a00: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
9a10: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
9a20: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
9a30: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
9a40: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
9a50: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
9a60: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
9a70: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73  (pAddr);.    tes
9a80: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
9a90: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
9aa0: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
9ab0: 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64 65 66  Last );.#if !def
9ac0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
9ad0: 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
9ae0: 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a 20 54  _CHECK).    /* T
9af0: 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  hese conditions 
9b00: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
9b10: 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74  n verified in bt
9b20: 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20  reeInitPage().  
9b30: 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 45    ** if SQLITE_E
9b40: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
9b50: 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64 65 66  ELL_CHECK is def
9b60: 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ined .    */.   
9b70: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
9b80: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
9b90: 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
9ba0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9bb0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65  T_BKPT;.    }.#e
9bc0: 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
9bd0: 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc>=iCellFirst 
9be0: 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74  && pc<=iCellLast
9bf0: 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63   );.    size = c
9c00: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
9c10: 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20  , &temp[pc]);.  
9c20: 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a    cbrk -= size;.
9c30: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
9c40: 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
9c50: 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20  ZE_CELL_CHECK). 
9c60: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
9c70: 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20  lFirst ){.      
9c80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9c90: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
9ca0: 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  }.#else.    if( 
9cb0: 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20  cbrk<iCellFirst 
9cc0: 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
9cd0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
9ce0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9cf0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
9d00: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
9d10: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
9d20: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
9d30: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
9d40: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
9d50: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
9d60: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
9d70: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
9d80: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
9d90: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62   memcpy(&data[cb
9da0: 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20  rk], &temp[pc], 
9db0: 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62  size);.    put2b
9dc0: 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29  yte(pAddr, cbrk)
9dd0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
9de0: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
9df0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
9e00: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72  data[hdr+5], cbr
9e10: 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31  k);.  data[hdr+1
9e20: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
9e30: 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+2] = 0;.  data
9e40: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d  [hdr+7] = 0;.  m
9e50: 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c  emset(&data[iCel
9e60: 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b  lFirst], 0, cbrk
9e70: 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20  -iCellFirst);.  
9e80: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9e90: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
9ea0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
9eb0: 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69 43  );.  if( cbrk-iC
9ec0: 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d  ellFirst!=pPage-
9ed0: 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65  >nFree ){.    re
9ee0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9ef0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
9f00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9f10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
9f20: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
9f30: 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69  of space from wi
9f40: 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  thin the B-Tree 
9f50: 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  page passed.** a
9f60: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
9f70: 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f  ment. Write into
9f80: 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78   *pIdx the index
9f90: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
9fa0: 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ta[].** of the f
9fb0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c  irst byte of all
9fc0: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65  ocated space. Re
9fd0: 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49  turn either SQLI
9fe0: 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65  TE_OK or.** an e
9ff0: 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c  rror code (usual
a000: 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ly SQLITE_CORRUP
a010: 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  T)..**.** The ca
a020: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
a030: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75  that there is su
a040: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
a050: 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c  o make the.** al
a060: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  location.  This 
a070: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65  routine might ne
a080: 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74  ed to defragment
a090: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69   in order to bri
a0a0: 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70  ng.** all the sp
a0b0: 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f  ace together, ho
a0c0: 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75  wever.  This rou
a0d0: 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20  tine will avoid 
a0e0: 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72  using.** the fir
a0f0: 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73  st two bytes pas
a100: 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  t the cell point
a110: 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72  er area since pr
a120: 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a  esumably this.**
a130: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62   allocation is b
a140: 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64  eing made in ord
a150: 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e  er to insert a n
a160: 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77  ew cell, so we w
a170: 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20  ill.** also end 
a180: 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77  up needing a new
a190: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
a1a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
a1b0: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
a1c0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
a1d0: 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29  Byte, int *pIdx)
a1e0: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
a1f0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
a200: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  fset;    /* Loca
a210: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
a220: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20  ->hdrOffset */. 
a230: 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
a240: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
a250: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
a260: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  ache of pPage->a
a270: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  Data */.  int to
a280: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a2a0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
a2b0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
a2c0: 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20  a */.  int gap; 
a2d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
a2e0: 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74 77  byte of gap betw
a2f0: 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  een cell pointer
a300: 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65  s and cell conte
a310: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  nt */.  int rc; 
a320: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
a330: 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  er return code *
a340: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
a350: 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69  ze; /* Usable si
a360: 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  ze of the page *
a370: 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73  /.  .  assert( s
a380: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
a390: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
a3a0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
a3b0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
a3c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
a3d0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
a3e0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
a3f0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
a400: 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d  Byte>=0 );  /* M
a410: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
a420: 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72   is 4 */.  asser
a430: 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  t( pPage->nFree>
a440: 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65  =nByte );.  asse
a450: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
a460: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 75 73 61  flow==0 );.  usa
a470: 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d  bleSize = pPage-
a480: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a490: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
a4a0: 65 20 3c 20 75 73 61 62 6c 65 53 69 7a 65 2d 38  e < usableSize-8
a4b0: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
a4c0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
a4d0: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
a4e0: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
a4f0: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
a500: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
a510: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
a520: 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36  sert( gap<=65536
a530: 20 29 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   );.  top = get2
a540: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
a550: 5d 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74 6f  ]);.  if( gap>to
a560: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f 70  p ){.    if( top
a570: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 6f 70  ==0 ){.      top
a580: 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65   = 65536;.    }e
a590: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
a5a0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
a5b0: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
a5c0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
a5d0: 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  is enough space 
a5e0: 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20  between gap and 
a5f0: 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65  top for one more
a600: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20   cell pointer.  
a610: 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f  ** array entry o
a620: 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68  ffset, and if th
a630: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f  e freelist is no
a640: 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65  t empty, then se
a650: 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72  arch the.  ** fr
a660: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
a670: 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62  or a free slot b
a680: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
a690: 69 73 66 79 20 74 68 65 20 72 65 71 75 65 73 74  isfy the request
a6a0: 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
a6b0: 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b  e( gap+2==top );
a6c0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
a6d0: 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +1==top );.  tes
a6e0: 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20  tcase( gap==top 
a6f0: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 3c 3d  );.  if( gap+2<=
a700: 74 6f 70 20 26 26 20 28 64 61 74 61 5b 68 64 72  top && (data[hdr
a710: 2b 31 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b  +1] || data[hdr+
a720: 32 5d 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 70  2]) ){.    int p
a730: 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f 72  c, addr;.    for
a740: 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70 63  (addr=hdr+1; (pc
a750: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a760: 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64 64  a[addr]))>0; add
a770: 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e 74  r=pc){.      int
a780: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
a790: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
a7a0: 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20   free slot */.  
a7b0: 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c      if( pc>usabl
a7c0: 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 61 64  eSize-4 || pc<ad
a7d0: 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20  dr+4 ){.        
a7e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
a7f0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a800: 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65 20 3d    }.      size =
a810: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a820: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  pc+2]);.      if
a830: 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b  ( size>=nByte ){
a840: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d  .        int x =
a850: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20   size - nByte;. 
a860: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
a870: 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20   x==4 );.       
a880: 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20   testcase( x==3 
a890: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  );.        if( x
a8a0: 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <4 ){.          
a8b0: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 37 5d 3e  if( data[hdr+7]>
a8c0: 3d 36 30 20 29 20 67 6f 74 6f 20 64 65 66 72 61  =60 ) goto defra
a8d0: 67 6d 65 6e 74 5f 70 61 67 65 3b 0a 20 20 20 20  gment_page;.    
a8e0: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
a8f0: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
a900: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
a910: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
a920: 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  f.          ** f
a930: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
a940: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
a950: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
a960: 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d  mcpy(&data[addr]
a970: 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b  , &data[pc], 2);
a980: 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b  .          data[
a990: 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b  hdr+7] += (u8)x;
a9a0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
a9b0: 66 28 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61  f( size+pc > usa
a9c0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
a9d0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
a9e0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
a9f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
aa00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
aa10: 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e   slot remains on
aa20: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
aa30: 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20  Reduce its size 
aa40: 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20  to account.     
aa50: 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
aa60: 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20  portion used by 
aa70: 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
aa80: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  on. */.         
aa90: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
aaa0: 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20  pc+2], x);.     
aab0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 49     }.        *pI
aac0: 64 78 20 3d 20 70 63 20 2b 20 78 3b 0a 20 20 20  dx = pc + x;.   
aad0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
aae0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
aaf0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
ab00: 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c 64  he request could
ab10: 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c 65   not be fulfille
ab20: 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c 69  d using a freeli
ab30: 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a  st slot.  Check.
ab40: 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 64    ** to see if d
ab50: 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69  efragmentation i
ab60: 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  s necessary..  *
ab70: 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  /.  testcase( ga
ab80: 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29  p+2+nByte==top )
ab90: 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42  ;.  if( gap+2+nB
aba0: 79 74 65 3e 74 6f 70 20 29 7b 0a 64 65 66 72 61  yte>top ){.defra
abb0: 67 6d 65 6e 74 5f 70 61 67 65 3a 0a 20 20 20 20  gment_page:.    
abc0: 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
abd0: 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
abe0: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
abf0: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
ac00: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
ac10: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
ac20: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
ac30: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
ac40: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42    assert( gap+nB
ac50: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
ac60: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
ac70: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
ac80: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
ac90: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
aca0: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
acb0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
acc0: 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65  area.  The btree
acd0: 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20  InitPage() call 
ace0: 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
acf0: 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66   validated the f
ad00: 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20  reelist.  Given 
ad10: 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73  that the freelis
ad20: 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72  t is valid, ther
ad30: 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79  e.  ** is no way
ad40: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
ad50: 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20  tion can extend 
ad60: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
ad70: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68  he page..  ** Th
ad80: 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
ad90: 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72   verifies the pr
ada0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e  evious sentence.
adb0: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e  .  */.  top -= n
adc0: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
add0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
ade0: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  op);.  assert( t
adf0: 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74  op+nByte <= (int
ae00: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
ae10: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49  bleSize );.  *pI
ae20: 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75  dx = top;.  retu
ae30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ae40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
ae50: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  section of the p
ae60: 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74  Page->aData to t
ae70: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20  he freelist..** 
ae80: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
ae90: 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62  f the new free b
aea0: 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61  lock is pPage->a
aeb0: 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20  Data[iStart].** 
aec0: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
aed0: 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69  the block is iSi
aee0: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
aef0: 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f  Adjacent freeblo
af00: 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65  cks are coalesce
af10: 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  d..**.** Note th
af20: 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  at even though t
af30: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73  he freeblock lis
af40: 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79  t was checked by
af50: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
af60: 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e  ,.** that routin
af70: 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63  e will not detec
af80: 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65  t overlap betwee
af90: 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  n cells or freeb
afa0: 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64  locks.  Nor.** d
afb0: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65  oes it detect ce
afc0: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
afd0: 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20  s that encrouch 
afe0: 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65  into the reserve
aff0: 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68  d bytes.** at th
b000: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
b010: 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69  e.  So do additi
b020: 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  onal corruption 
b030: 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68  checks inside th
b040: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e  is.** routine an
b050: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
b060: 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70  CORRUPT if any p
b070: 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e  roblems are foun
b080: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
b090: 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
b0a0: 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69  ge *pPage, u16 i
b0b0: 53 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65  Start, u16 iSize
b0c0: 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20  ){.  u16 iPtr;  
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
b0f0: 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20  dress of ptr to 
b100: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
b110: 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b  /.  u16 iFreeBlk
b120: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
b140: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
b150: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
b160: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b180: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65        /* Page he
b190: 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72  ader size.  0 or
b1a0: 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72   100 */.  u8 nFr
b1b0: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ag = 0;         
b1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1d0: 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20  /* Reduction in 
b1e0: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  fragmentation */
b1f0: 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65  .  u16 iOrigSize
b200: 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   = iSize;       
b210: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
b220: 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53  inal value of iS
b230: 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61  ize */.  u32 iLa
b240: 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  st = pPage->pBt-
b250: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f  >usableSize-4; /
b260: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
b270: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
b280: 73 65 74 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e  set */.  u32 iEn
b290: 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69  d = iStart + iSi
b2a0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
b2b0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
b2c0: 74 20 74 68 65 20 69 53 74 61 72 74 20 62 75 66  t the iStart buf
b2d0: 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  fer */.  unsigne
b2e0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
b2f0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f  Page->aData;   /
b300: 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a  * Page content *
b310: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
b320: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
b330: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
b340: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
b350: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
b360: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
b370: 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f  art>=pPage->hdrO
b380: 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63  ffset+6+pPage->c
b390: 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20  hildPtrSize );. 
b3a0: 20 61 73 73 65 72 74 28 20 69 45 6e 64 20 3c 3d   assert( iEnd <=
b3b0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
b3c0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
b3d0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
b3e0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
b3f0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
b400: 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34  assert( iSize>=4
b410: 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d   );   /* Minimum
b420: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
b430: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
b440: 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20  art<=iLast );.. 
b450: 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65   /* Overwrite de
b460: 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
b470: 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65  n with zeros whe
b480: 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  n the secure_del
b490: 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  ete.  ** option 
b4a0: 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
b4b0: 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
b4c0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
b4d0: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
b4e0: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
b4f0: 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69  [iStart], 0, iSi
b500: 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ze);.  }..  /* T
b510: 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62  he list of freeb
b520: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
b530: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
b540: 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a  .  Find the .  *
b550: 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69  * spot on the li
b560: 73 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20  st where iStart 
b570: 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
b580: 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d  ed..  */.  hdr =
b590: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
b5a0: 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20  t;.  iPtr = hdr 
b5b0: 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b  + 1;.  if( data[
b5c0: 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61  iPtr+1]==0 && da
b5d0: 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20  ta[iPtr]==0 ){. 
b5e0: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b     iFreeBlk = 0;
b5f0: 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f    /* Shortcut fo
b600: 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20  r the case when 
b610: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
b620: 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65  empty */.  }else
b630: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46  {.    while( (iF
b640: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
b650: 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3e  e(&data[iPtr]))>
b660: 30 20 26 26 20 69 46 72 65 65 42 6c 6b 3c 69 53  0 && iFreeBlk<iS
b670: 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66  tart ){.      if
b680: 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b  ( iFreeBlk<iPtr+
b690: 34 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  4 ) return SQLIT
b6a0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b6b0: 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72        iPtr = iFr
b6c0: 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eeBlk;.    }.   
b6d0: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c   if( iFreeBlk>iL
b6e0: 61 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ast ) return SQL
b6f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b700: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46  ;.    assert( iF
b710: 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69  reeBlk>iPtr || i
b720: 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20  FreeBlk==0 );.  
b730: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
b740: 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20  point:.    **   
b750: 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72   iFreeBlk:   Fir
b760: 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74  st freeblock aft
b770: 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65  er iStart, or ze
b780: 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a  ro if none.    *
b790: 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20  *    iPtr:      
b7a0: 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   The address of 
b7b0: 61 20 70 6f 69 6e 74 65 72 20 69 46 72 65 65 42  a pointer iFreeB
b7c0: 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  lk.    **.    **
b7d0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
b7e0: 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64   iFreeBlk should
b7f0: 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e   be coalesced on
b800: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53  to the end of iS
b810: 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tart..    */.   
b820: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26   if( iFreeBlk &&
b830: 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c   iEnd+3>=iFreeBl
b840: 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67  k ){.      nFrag
b850: 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45   = iFreeBlk - iE
b860: 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  nd;.      if( iE
b870: 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65  nd>iFreeBlk ) re
b880: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b890: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
b8a0: 69 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20  iEnd = iFreeBlk 
b8b0: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
b8c0: 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20  [iFreeBlk+2]);. 
b8d0: 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e       iSize = iEn
b8e0: 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20  d - iStart;.    
b8f0: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74    iFreeBlk = get
b900: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
b910: 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  eBlk]);.    }.  
b920: 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20  .    /* If iPtr 
b930: 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62  is another freeb
b940: 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69  lock (that is, i
b950: 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68  f iPtr is not th
b960: 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a  e freelist.    *
b970: 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  * pointer in the
b980: 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68   page header) th
b990: 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  en check to see 
b9a0: 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  if iStart should
b9b0: 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65   be.    ** coale
b9c0: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
b9d0: 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a  d of iPtr..    *
b9e0: 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68  /.    if( iPtr>h
b9f0: 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  dr+1 ){.      in
ba00: 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72  t iPtrEnd = iPtr
ba10: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
ba20: 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20  a[iPtr+2]);.    
ba30: 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e    if( iPtrEnd+3>
ba40: 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  =iStart ){.     
ba50: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69     if( iPtrEnd>i
ba60: 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53  Start ) return S
ba70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
ba80: 50 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61  PT;.        nFra
ba90: 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50  g += iStart - iP
baa0: 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69  trEnd;.        i
bab0: 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50  Size = iEnd - iP
bac0: 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  tr;.        iSta
bad0: 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20  rt = iPtr;.     
bae0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
baf0: 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b   nFrag>data[hdr+
bb00: 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  7] ) return SQLI
bb10: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
bb20: 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
bb30: 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20   -= nFrag;.  }. 
bb40: 20 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65 74   if( iStart==get
bb50: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
bb60: 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  5]) ){.    /* Th
bb70: 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20  e new freeblock 
bb80: 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  is at the beginn
bb90: 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ing of the cell 
bba0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20  content area,.  
bbb0: 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74    ** so just ext
bbc0: 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  end the cell con
bbd0: 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72  tent area rather
bbe0: 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f   than create ano
bbf0: 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65  ther.    ** free
bc00: 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  list entry */.  
bc10: 20 20 69 66 28 20 69 50 74 72 21 3d 68 64 72 2b    if( iPtr!=hdr+
bc20: 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
bc30: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
bc40: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
bc50: 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65  ta[hdr+1], iFree
bc60: 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79  Blk);.    put2by
bc70: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
bc80: 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b   iEnd);.  }else{
bc90: 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
bca0: 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
bcb0: 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69   into the freeli
bcc0: 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79  st */.    put2by
bcd0: 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20  te(&data[iPtr], 
bce0: 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75 74  iStart);.    put
bcf0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
bd00: 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a  rt], iFreeBlk);.
bd10: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
bd20: 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53  ta[iStart+2], iS
bd30: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ize);.  }.  pPag
bd40: 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69  e->nFree += iOri
bd50: 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  gSize;.  return 
bd60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
bd70: 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66  .** Decode the f
bd80: 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66  lags byte (the f
bd90: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
bda0: 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70   header) for a p
bdb0: 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  age.** and initi
bdc0: 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20  alize fields of 
bdd0: 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
bde0: 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c  cture accordingl
bdf0: 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  y..**.** Only th
be00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
be10: 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70  inations are sup
be20: 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e  ported.  Anythin
be30: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69  g different.** i
be40: 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75  ndicates a corru
be50: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
be60: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
be70: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a   PTF_ZERODATA.**
be80: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
be90: 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46  ODATA | PTF_LEAF
bea0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
beb0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
bec0: 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20  NTKEY.**        
bed0: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
bee0: 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46  PTF_INTKEY | PTF
bef0: 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20  _LEAF.*/.static 
bf00: 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28  int decodeFlags(
bf10: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
bf20: 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20  int flagByte){. 
bf30: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
bf40: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
bf50: 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a   pPage->pBt */..
bf60: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
bf70: 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61  >hdrOffset==(pPa
bf80: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
bf90: 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65  0 : 0) );.  asse
bfa0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
bfb0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
bfc0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
bfd0: 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38  Page->leaf = (u8
bfe0: 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20  )(flagByte>>3); 
bff0: 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41   assert( PTF_LEA
c000: 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66  F == 1<<3 );.  f
c010: 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f  lagByte &= ~PTF_
c020: 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63  LEAF;.  pPage->c
c030: 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d  hildPtrSize = 4-
c040: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
c050: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
c060: 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74  t;.  if( flagByt
c070: 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41  e==(PTF_LEAFDATA
c080: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29   | PTF_INTKEY) )
c090: 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  {.    pPage->int
c0a0: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  Key = 1;.    pPa
c0b0: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d  ge->intKeyLeaf =
c0c0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
c0d0: 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f    pPage->noPaylo
c0e0: 61 64 20 3d 20 21 70 50 61 67 65 2d 3e 6c 65 61  ad = !pPage->lea
c0f0: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  f;.    pPage->ma
c100: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
c110: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
c120: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
c130: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
c140: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
c150: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
c160: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
c170: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ey = 0;.    pPag
c180: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
c190: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f  0;.    pPage->no
c1a0: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
c1b0: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
c1c0: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
c1d0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
c1e0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
c1f0: 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
c200: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c210: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
c220: 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78    }.  pPage->max
c230: 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70  1bytePayload = p
c240: 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
c250: 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  oad;.  return SQ
c260: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
c270: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
c280: 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
c290: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73  mation for a dis
c2a0: 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52  k block..**.** R
c2b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
c2c0: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
c2d0: 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20  we see that the 
c2e0: 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  page does.** not
c2f0: 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d   contain a well-
c300: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
c310: 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72  page, then retur
c320: 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  n .** SQLITE_COR
c330: 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74  RUPT.  Note that
c340: 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c   a return of SQL
c350: 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a  ITE_OK does not.
c360: 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ** guarantee tha
c370: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65  t the page is we
c380: 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f  ll-formed.  It o
c390: 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a  nly shows that.*
c3a0: 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64  * we failed to d
c3b0: 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70  etect any corrup
c3c0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
c3d0: 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67  int btreeInitPag
c3e0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
c3f0: 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  ){..  assert( pP
c400: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
c410: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c420: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
c430: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
c440: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
c450: 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
c460: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
c470: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c480: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
c490: 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ge == sqlite3Pag
c4a0: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
c4b0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
c4c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
c4d0: 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50  Data == sqlite3P
c4e0: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
c4f0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
c500: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73    if( !pPage->is
c510: 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20  Init ){.    u16 
c520: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pc;            /
c530: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66  * Address of a f
c540: 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20  reeblock within 
c550: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a  pPage->aData[] *
c560: 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20 20  /.    u8 hdr;   
c570: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
c580: 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20  et to beginning 
c590: 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
c5a0: 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20  /.    u8 *data; 
c5b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
c5c0: 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
c5d0: 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65  a */.    BtShare
c5e0: 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f  d *pBt;        /
c5f0: 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65  * The main btree
c600: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
c610: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
c620: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
c630: 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f  f usable space o
c640: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
c650: 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65     u16 cellOffse
c660: 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
c670: 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
c680: 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
c690: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
c6a0: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
c6b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c6c0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
c6d0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
c6e0: 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20  int top;        
c6f0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
c700: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
c710: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20  tent area */.   
c720: 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b   int iCellFirst;
c730: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
c740: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66  owable cell or f
c750: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
c760: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
c770: 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73  Last;     /* Las
c780: 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
c790: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
c7a0: 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20  set */..    pBt 
c7b0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20  = pPage->pBt;.. 
c7c0: 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e     hdr = pPage->
c7d0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64  hdrOffset;.    d
c7e0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
c7f0: 74 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f  ta;.    if( deco
c800: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64  deFlags(pPage, d
c810: 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75  ata[hdr]) ) retu
c820: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c830: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65  T_BKPT;.    asse
c840: 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
c850: 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
c860: 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29  ageSize<=65536 )
c870: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73  ;.    pPage->mas
c880: 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42  kPage = (u16)(pB
c890: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29  t->pageSize - 1)
c8a0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76  ;.    pPage->nOv
c8b0: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
c8c0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
c8d0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
c8e0: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
c8f0: 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  set = cellOffset
c900: 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a   = hdr + 12 - 4*
c910: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20  pPage->leaf;.   
c920: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
c930: 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53   = &data[usableS
c940: 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d  ize];.    pPage-
c950: 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
c960: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20  a[cellOffset];. 
c970: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
c980: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
c990: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67  dr+5]);.    pPag
c9a0: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  e->nCell = get2b
c9b0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
c9c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
c9d0: 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28  ->nCell>MX_CELL(
c9e0: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
c9f0: 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66   To many cells f
ca00: 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  or a single page
ca10: 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74  .  The page must
ca20: 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20   be corrupt */. 
ca30: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ca40: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ca50: 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
ca60: 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ase( pPage->nCel
ca70: 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  l==MX_CELL(pBt) 
ca80: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c  );..    /* A mal
ca90: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
caa0: 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73 65  page might cause
cab0: 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73 74   us to read past
cac0: 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20   the end.    ** 
cad0: 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72  of page when par
cae0: 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20  sing a cell.  . 
caf0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
cb00: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
cb10: 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20   of code checks 
cb20: 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20  early to see if 
cb30: 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20  a cell extends. 
cb40: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
cb50: 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75  nd of a page bou
cb60: 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73  ndary and causes
cb70: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
cb80: 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65  to be .    ** re
cb90: 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65  turned if it doe
cba0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43  s..    */.    iC
cbb0: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
cbc0: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
cbd0: 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c  >nCell;.    iCel
cbe0: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
cbf0: 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64 65 66 69  ze - 4;.#if defi
cc00: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
cc10: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
cc20: 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20  CHECK).    {.   
cc30: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
cc40: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
cc50: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
cc60: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  ter array */.   
cc70: 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20     int sz;      
cc80: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
cc90: 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20  a cell */..     
cca0: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
ccb0: 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b  f ) iCellLast--;
ccc0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
ccd0: 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
cce0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63  i++){.        pc
ccf0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
cd00: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32  a[cellOffset+i*2
cd10: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
cd20: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
cd30: 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  irst );.        
cd40: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
cd50: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20  ellLast );.     
cd60: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
cd70: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
cd80: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
cd90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cda0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
cdb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cdc0: 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  sz = cellSizePtr
cdd0: 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
cde0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
cdf0: 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
ce00: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
ce10: 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61     if( pc+sz>usa
ce20: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
ce30: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ce40: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ce50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ce60: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   }.      if( !pP
ce70: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
ce80: 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20  lLast++;.    }  
ce90: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
cea0: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
ceb0: 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
cec0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
ced0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
cee0: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
cef0: 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
cf00: 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20  r+7] + top;.    
cf10: 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20  while( pc>0 ){. 
cf20: 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73       u16 next, s
cf30: 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
cf40: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
cf50: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
cf60: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
cf70: 20 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b 20 69   of free block i
cf80: 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a  s off the page *
cf90: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
cfa0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
cfb0: 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
cfc0: 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32       next = get2
cfd0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b  byte(&data[pc]);
cfe0: 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65  .      size = ge
cff0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
d000: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  2]);.      if( (
d010: 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d  next>0 && next<=
d020: 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63  pc+size+3) || pc
d030: 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65  +size>usableSize
d040: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
d050: 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20  ree blocks must 
d060: 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  be in ascending 
d070: 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c  order. And the l
d080: 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20  ast byte of.    
d090: 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d      ** the free-
d0a0: 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f  block must lie o
d0b0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  n the database p
d0c0: 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
d0d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d0e0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
d0f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65      }.      nFre
d100: 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65  e = nFree + size
d110: 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78  ;.      pc = nex
d120: 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  t;.    }..    /*
d130: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
d140: 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74  nFree contains t
d150: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66  he sum of the of
d160: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
d170: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
d180: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
d190: 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65  a plus the numbe
d1a0: 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
d1b0: 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68  within.    ** th
d1c0: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
d1d0: 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20  rea. If this is 
d1e0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
d1f0: 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20   usable-size.   
d200: 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c   ** of the page,
d210: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
d220: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  ust be corrupted
d230: 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73  . This check als
d240: 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20  o.    ** serves 
d250: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
d260: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
d270: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
d280: 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  ll-content.    *
d290: 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e  * area, accordin
d2a0: 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  g to the page he
d2b0: 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69  ader, lies withi
d2c0: 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20  n the page..    
d2d0: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  */.    if( nFree
d2e0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
d2f0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d300: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d310: 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67   .    }.    pPag
d320: 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
d330: 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69  (nFree - iCellFi
d340: 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  rst);.    pPage-
d350: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d  >isInit = 1;.  }
d360: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d370: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
d380: 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
d390: 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
d3a0: 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
d3b0: 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
d3c0: 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
d3d0: 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
d3e0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
d3f0: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
d400: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
d410: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
d420: 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
d430: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
d440: 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
d450: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d460: 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
d470: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d480: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
d490: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d4a0: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
d4b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d4c0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
d4d0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d4e0: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
d4f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
d500: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
d510: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d520: 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
d530: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
d540: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
d550: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
d560: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d570: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
d580: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
d590: 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
d5a0: 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
d5b0: 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73  LETE ){.    mems
d5c0: 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30  et(&data[hdr], 0
d5d0: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
d5e0: 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20  e - hdr);.  }.  
d5f0: 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61  data[hdr] = (cha
d600: 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74  r)flags;.  first
d610: 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73   = hdr + ((flags
d620: 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20  &PTF_LEAF)==0 ? 
d630: 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65  12 : 8);.  memse
d640: 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
d650: 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64  0, 4);.  data[hd
d660: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32  r+7] = 0;.  put2
d670: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
d680: 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
d690: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
d6a0: 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  ree = (u16)(pBt-
d6b0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
d6c0: 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c  rst);.  decodeFl
d6d0: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
d6e0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  );.  pPage->cell
d6f0: 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a  Offset = first;.
d700: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e    pPage->aDataEn
d710: 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75  d = &data[pBt->u
d720: 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50  sableSize];.  pP
d730: 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20  age->aCellIdx = 
d740: 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20  &data[first];.  
d750: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
d760: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
d770: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
d780: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
d790: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
d7a0: 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
d7b0: 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67  = (u16)(pBt->pag
d7c0: 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50  eSize - 1);.  pP
d7d0: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
d7e0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
d7f0: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  = 1;.}.../*.** C
d800: 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20  onvert a DbPage 
d810: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68  obtained from th
d820: 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d  e pager into a M
d830: 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a  emPage used by.*
d840: 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  * the btree laye
d850: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  r..*/.static Mem
d860: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46  Page *btreePageF
d870: 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65  romDbPage(DbPage
d880: 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20   *pDbPage, Pgno 
d890: 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a  pgno, BtShared *
d8a0: 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
d8b0: 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  *pPage = (MemPag
d8c0: 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
d8d0: 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
d8e0: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
d8f0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
d900: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
d910: 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  .  pPage->pDbPag
d920: 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70  e = pDbPage;.  p
d930: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
d940: 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d  .  pPage->pgno =
d950: 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e   pgno;.  pPage->
d960: 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  hdrOffset = pPag
d970: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
d980: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   : 0;.  return p
d990: 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
d9a0: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
d9b0: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
d9c0: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
d9d0: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
d9e0: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
d9f0: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
da00: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43  **.** If the noC
da10: 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73  ontent flag is s
da20: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
da30: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
da40: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
da50: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
da60: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
da70: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
da80: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
da90: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
daa0: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
dab0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
dac0: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
dad0: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
dae0: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
daf0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
db00: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
db10: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
db20: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
db30: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
db40: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
db50: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
db60: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
db70: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
db80: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
db90: 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
dba0: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
dbb0: 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
dbc0: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
dbd0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
dbe0: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
dbf0: 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
dc00: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
dc10: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
dc20: 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
dc30: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ter */.  int fla
dc40: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
dc50: 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
dc60: 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45  TENT or PAGER_GE
dc70: 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b  T_READONLY */.){
dc80: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
dc90: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20  age *pDbPage;.. 
dca0: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
dcb0: 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45  0 || flags==PAGE
dcc0: 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
dcd0: 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f  || flags==PAGER_
dce0: 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a  GET_READONLY );.
dcf0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
dd00: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
dd10: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
dd20: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
dd30: 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
dd40: 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
dd50: 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c  e**)&pDbPage, fl
dd60: 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ags);.  if( rc )
dd70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
dd80: 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
dd90: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
dda0: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
ddb0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ddc0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
ddd0: 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
dde0: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
ddf0: 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
de00: 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
de10: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
de20: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
de30: 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
de40: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
de50: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
de60: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
de70: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
de80: 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
de90: 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
dea0: 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
deb0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
dec0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
ded0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
dee0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
def0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
df00: 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
df10: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
df20: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
df30: 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
df40: 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
df50: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
df60: 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
df70: 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
df80: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
df90: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
dfa0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
dfb0: 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
dfc0: 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
dfd0: 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
dfe0: 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
dff0: 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
e000: 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61  tic Pgno btreePa
e010: 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
e020: 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e   *pBt){.  return
e030: 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75   pBt->nPage;.}.u
e040: 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  32 sqlite3BtreeL
e050: 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70  astPage(Btree *p
e060: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
e070: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
e080: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
e090: 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50  rt( ((p->pBt->nP
e0a0: 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29 3d  age)&0x8000000)=
e0b0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  =0 );.  return b
e0c0: 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d  treePagecount(p-
e0d0: 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pBt);.}../*.** 
e0e0: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
e0f0: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
e100: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
e110: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75  is routine is ju
e120: 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65  st a.** convenie
e130: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
e140: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
e150: 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67  s to btreeGetPag
e160: 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65  e() and .** btre
e170: 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a  eInitPage()..**.
e180: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
e190: 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
e1a0: 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73  value *ppPage is
e1b0: 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66   set to is undef
e1c0: 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20  ined. It.** may 
e1d0: 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
e1e0: 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73  , or it may be s
e1f0: 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  et to an invalid
e200: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
e210: 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
e220: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
e230: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
e240: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
e250: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
e260: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e280: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
e290: 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
e2a0: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
e2b0: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
e2c0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
e2d0: 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65   page pointer he
e2e0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61  re */.  int bRea
e2f0: 64 6f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20  donly           
e300: 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
e310: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 6f 72  _GET_READONLY or
e320: 20 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72   0 */.){.  int r
e330: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  c;.  assert( sql
e340: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e350: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
e360: 20 61 73 73 65 72 74 28 20 62 52 65 61 64 6f 6e   assert( bReadon
e370: 6c 79 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45  ly==PAGER_GET_RE
e380: 41 44 4f 4e 4c 59 20 7c 7c 20 62 52 65 61 64 6f  ADONLY || bReado
e390: 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  nly==0 );..  if(
e3a0: 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63   pgno>btreePagec
e3b0: 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
e3c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
e3d0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c  RUPT_BKPT;.  }el
e3e0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  se{.    rc = btr
e3f0: 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
e400: 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 52 65  gno, ppPage, bRe
e410: 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 69 66 28  adonly);.    if(
e420: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
e430: 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  & (*ppPage)->isI
e440: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nit==0 ){.      
e450: 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
e460: 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
e470: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e480: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
e490: 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
e4a0: 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
e4b0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63    }.  }..  testc
e4c0: 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a  ase( pgno==0 );.
e4d0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
e4e0: 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
e4f0: 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74  CORRUPT );.  ret
e500: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
e510: 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61   Release a MemPa
e520: 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ge.  This should
e530: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   be called once 
e540: 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a  for each prior.*
e550: 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47  * call to btreeG
e560: 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  etPage..*/.stati
e570: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
e580: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
e590: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
e5a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
e5b0: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
e5c0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
e5d0: 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73  ->pBt );.    ass
e5e0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50  ert( pPage->pDbP
e5f0: 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  age!=0 );.    as
e600: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
e610: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
e620: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
e630: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
e640: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e650: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
e660: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
e670: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
e680: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
e690: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
e6a0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
e6b0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
e6c0: 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
e6d0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
e6e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
e6f0: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
e700: 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  , when the pager
e710: 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61   reloads informa
e720: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61  tion into the ca
e730: 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74  che.** so that t
e740: 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74  he cache is rest
e750: 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
e760: 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68  inal state at th
e770: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
e780: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66  e transaction, f
e790: 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73  or each page res
e7a0: 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69  tored this routi
e7b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
e7c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e7d0: 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20   needs to reset 
e7e0: 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73  the extra data s
e7f0: 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e  ection at the en
e800: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  d of the.** page
e810: 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
e820: 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61  he restored data
e830: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e840: 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61   pageReinit(DbPa
e850: 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65  ge *pData){.  Me
e860: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
e870: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
e880: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
e890: 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
e8a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e8b0: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
e8c0: 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20  nt(pData)>0 );. 
e8d0: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
e8e0: 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  it ){.    assert
e8f0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e900: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
e910: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70  >mutex) );.    p
e920: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
e930: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
e940: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
e950: 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20  nt(pData)>1 ){. 
e960: 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69       /* pPage mi
e970: 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72  ght not be a btr
e980: 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67  ee page;  it mig
e990: 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ht be an overflo
e9a0: 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
e9b0: 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f  or ptrmap page o
e9c0: 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20  r a free page.  
e9d0: 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20  In those cases, 
e9e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
e9f0: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62      ** call to b
ea00: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77  treeInitPage() w
ea10: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72  ill likely retur
ea20: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ea30: 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e  ..      ** But n
ea40: 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62  o harm is done b
ea50: 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20  y this.  And it 
ea60: 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e  is very importan
ea70: 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  t that.      ** 
ea80: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
ea90: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65  be called on eve
eaa0: 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f  ry btree page so
eab0: 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   we make.      *
eac0: 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65  * the call for e
ead0: 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63  very page that c
eae0: 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69  omes in for re-i
eaf0: 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  niting. */.     
eb00: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
eb10: 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
eb20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
eb30: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
eb40: 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a  r for a btree..*
eb50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
eb60: 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
eb70: 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  ler(void *pArg){
eb80: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
eb90: 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41   = (BtShared*)pA
eba0: 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rg;.  assert( pB
ebb0: 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72  t->db );.  asser
ebc0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ebd0: 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d  _held(pBt->db->m
ebe0: 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
ebf0: 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  n sqlite3InvokeB
ec00: 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d  usyHandler(&pBt-
ec10: 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72  >db->busyHandler
ec20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
ec30: 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
ec40: 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
ec50: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
ec60: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
ec70: 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
ec80: 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68  me is NULL.** th
ec90: 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
eca0: 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
ecb0: 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65  ted.  The epheme
ecc0: 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67  ral database mig
ecd0: 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69  ht.** be exclusi
ece0: 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  vely in memory, 
ecf0: 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20  or it might use 
ed00: 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d  a disk-based mem
ed10: 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69  ory cache..** Ei
ed20: 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70  ther way, the ep
ed30: 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
ed40: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
ed50: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a  ically deleted .
ed60: 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ** when sqlite3B
ed70: 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
ed80: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
ed90: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
eda0: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
edb0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
edc0: 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
edd0: 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
ede0: 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
edf0: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
ee00: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66  ed..**.** The "f
ee10: 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20  lags" parameter 
ee20: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61  is a bitmask tha
ee30: 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  t might contain 
ee40: 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52  bits like.** BTR
ee50: 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  EE_OMIT_JOURNAL 
ee60: 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d  and/or BTREE_MEM
ee70: 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ORY..**.** If th
ee80: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
ee90: 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20  ready opened in 
eea0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
eeb0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
eec0: 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68  and we are in sh
eed0: 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c  ared cache mode,
eee0: 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77   then the open w
eef0: 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e  ill fail with an
ef00: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  .** SQLITE_CONST
ef10: 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65  RAINT error.  We
ef20: 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77   cannot allow tw
ef30: 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72  o or more BtShar
ef40: 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e  ed.** objects in
ef50: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
ef60: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69  se connection si
ef70: 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c  nce doing so wil
ef80: 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f  l lead.** to pro
ef90: 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69  blems with locki
efa0: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
efb0: 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73  e3BtreeOpen(.  s
efc0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
efd0: 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f  ,      /* VFS to
efe0: 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d   use for this b-
eff0: 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tree */.  const 
f000: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
f010: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
f020: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
f030: 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
f040: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
f050: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
f060: 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
f070: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
f080: 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
f090: 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ree,        /* P
f0a0: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74  ointer to new Bt
f0b0: 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74  ree object writt
f0c0: 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  en here */.  int
f0d0: 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
f0e0: 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20       /* Options 
f0f0: 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
f100: 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
f110: 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
f120: 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
f130: 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
f140: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
f150: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
f160: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
f170: 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
f180: 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
f190: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
f1a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
f1b0: 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
f1c0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
f1d0: 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20  *mutexOpen = 0; 
f1e0: 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72   /* Prevents a r
f1f0: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54  ace condition. T
f200: 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20  icket #3537 */. 
f210: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
f220: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
f230: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
f240: 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
f250: 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72  n */.  u8 nReser
f260: 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ve;             
f270: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
f280: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   unused space on
f290: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
f2a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
f2b0: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f  bHeader[100];  /
f2c0: 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
f2d0: 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  r content */..  
f2e0: 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69  /* True if openi
f2f0: 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c  ng an ephemeral,
f300: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
f310: 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ase */.  const i
f320: 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46  nt isTempDb = zF
f330: 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
f340: 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a  ilename[0]==0;..
f350: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
f360: 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
f370: 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
f380: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
f390: 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
f3a0: 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
f3b0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
f3c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
f3d0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f  IT_MEMORYDB.  co
f3e0: 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
f3f0: 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e  = 0;.#else.  con
f400: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
f410: 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73   (zFilename && s
f420: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
f430: 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29   ":memory:")==0)
f440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f450: 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65          || (isTe
f460: 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54  mpDb && sqlite3T
f470: 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29  empInMemory(db))
f480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f490: 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46          || (vfsF
f4a0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
f4b0: 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23  EN_MEMORY)!=0;.#
f4c0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
f4d0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
f4e0: 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20  rt( pVfs!=0 );. 
f4f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f500: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
f510: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
f520: 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29  rt( (flags&0xff)
f530: 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20  ==flags );   /* 
f540: 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62  flags fit in 8 b
f550: 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c  its */..  /* Onl
f560: 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  y a BTREE_SINGLE
f570: 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
f580: 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
f590: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
f5a0: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f  lags & BTREE_UNO
f5b0: 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66  RDERED)==0 || (f
f5c0: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
f5d0: 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  GLE)!=0 );..  /*
f5e0: 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   A BTREE_SINGLE 
f5f0: 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61  database is alwa
f600: 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61  ys a temporary a
f610: 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20  nd/or ephemeral 
f620: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
f630: 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
f640: 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70  LE)==0 || isTemp
f650: 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d  Db );..  if( isM
f660: 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67  emdb ){.    flag
f670: 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52  s |= BTREE_MEMOR
f680: 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66  Y;.  }.  if( (vf
f690: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
f6a0: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30  OPEN_MAIN_DB)!=0
f6b0: 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20   && (isMemdb || 
f6c0: 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20  isTempDb) ){.   
f6d0: 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73   vfsFlags = (vfs
f6e0: 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f  Flags & ~SQLITE_
f6f0: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20  OPEN_MAIN_DB) | 
f700: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
f710: 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  _DB;.  }.  p = s
f720: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
f730: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
f740: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
f750: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
f760: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
f770: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
f780: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
f790: 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
f7a0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
f7b0: 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42  CHE.  p->lock.pB
f7c0: 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c  tree = p;.  p->l
f7d0: 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a  ock.iTable = 1;.
f7e0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
f7f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f800: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
f810: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
f820: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
f830: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
f840: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
f850: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
f860: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
f870: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
f880: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
f890: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
f8a0: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
f8b0: 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d  .  if( isTempDb=
f8c0: 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d  =0 && (isMemdb==
f8d0: 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53  0 || (vfsFlags&S
f8e0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21  QLITE_OPEN_URI)!
f8f0: 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76  =0) ){.    if( v
f900: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
f910: 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
f920: 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E ){.      int n
f930: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
f940: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
f950: 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
f960: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
f970: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75  qlite3Malloc(nFu
f980: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
f990: 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
f9a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
f9b0: 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20  utexShared; ).  
f9c0: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
f9d0: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21  = 1;.      if( !
f9e0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
f9f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
fa00: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
fa10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fa20: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
fa30: 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62       if( isMemdb
fa40: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
fa50: 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  py(zFullPathname
fa60: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c  , zFilename, sql
fa70: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
fa80: 6c 65 6e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20  lename)+1);.    
fa90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
faa0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
fab0: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
fac0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
fad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faf0: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  nFullPathname, z
fb00: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
fb10: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
fb20: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
fb30: 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
fb40: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
fb50: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
fb60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
fb70: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
fb80: 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  }.      }.#if SQ
fb90: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
fba0: 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20        mutexOpen 
fbb0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
fbc0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
fbd0: 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20  _STATIC_OPEN);. 
fbe0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
fbf0: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70  ex_enter(mutexOp
fc00: 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  en);.      mutex
fc10: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
fc20: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
fc30: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
fc40: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
fc50: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
fc60: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
fc70: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72  #endif.      for
fc80: 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
fc90: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
fca0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
fcb0: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
fcc0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
fcd0: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
fce0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
fcf0: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
fd00: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
fd10: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
fd20: 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20  t->pPager, 0)). 
fd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd40: 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
fd50: 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
fd60: 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
fd70: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
fd80: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
fd90: 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
fda0: 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
fdb0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
fdc0: 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
fdd0: 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
fde0: 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
fdf0: 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
fe00: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
fe20: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
fe30: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
fe50: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
fe60: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
fe70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
fe80: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
fe90: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
fea0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
feb0: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
fec0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fed0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
fee0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
fef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ff00: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
ff10: 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
ff20: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
ff30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
ff40: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
ff50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ff60: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
ff70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
ff80: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
ff90: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
ffa0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
ffb0: 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
ffc0: 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
ffd0: 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
ffe0: 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
fff0: 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
10000 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
10010 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
10020 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
10030 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
10040 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
10050 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
10060 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
10070 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10080 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
10090 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
100a0 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
100b0 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
100c0 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
100d0 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
100e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
100f0 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
10100 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
10110 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
10120 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
10130 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
10140 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
10150 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
10160 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
10170 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
10180 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
10190 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
101a0 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
101b0 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
101c0 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
101d0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
101e0 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c  sizeof(i64)==8 |
101f0 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34  | sizeof(i64)==4
10200 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
10210 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c  sizeof(u64)==8 |
10220 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34  | sizeof(u64)==4
10230 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
10240 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
10250 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
10260 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
10270 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
10280 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
10290 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
102a0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
102b0 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
102c0 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
102d0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
102e0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
102f0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
10300 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
10310 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10320 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
10330 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
10340 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
10350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58                EX
10360 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c  TRA_SIZE, flags,
10370 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52   vfsFlags, pageR
10380 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  einit);.    if( 
10390 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
103a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
103b0 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
103c0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d  pBt->pPager, db-
103d0 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20  >szMmap);.      
103e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
103f0 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
10400 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
10410 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
10420 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
10430 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10440 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
10450 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
10460 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ut;.    }.    pB
10470 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28  t->openFlags = (
10480 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42  u8)flags;.    pB
10490 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  t->db = db;.    
104a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
104b0 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
104c0 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76  pPager, btreeInv
104d0 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20  okeBusyHandler, 
104e0 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  pBt);.    p->pBt
104f0 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70   = pBt;.  .    p
10500 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
10510 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
10520 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
10530 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
10540 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
10550 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ) ) pBt->btsFlag
10560 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
10570 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  LY;.#ifdef SQLIT
10580 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
10590 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
105a0 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
105b0 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20  DELETE;.#endif. 
105c0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
105d0 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36   = (zDbHeader[16
105e0 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64  ]<<8) | (zDbHead
105f0 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  er[17]<<16);.   
10600 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
10610 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
10620 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
10630 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
10640 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
10650 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
10660 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
10670 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
10680 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
10690 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
106a0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
106b0 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
106c0 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
106d0 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
106e0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
106f0 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
10700 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
10710 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
10720 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
10730 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
10740 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
10750 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
10760 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
10770 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
10780 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
10790 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
107a0 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
107b0 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
107c0 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
107d0 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
107e0 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
107f0 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
10800 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
10810 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
10820 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
10830 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
10840 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
10850 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
10860 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
10870 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
10880 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
10890 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
108a0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
108b0 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
108c0 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
108d0 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
108e0 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
108f0 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72  se{.      nReser
10900 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
10910 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  0];.      pBt->b
10920 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
10930 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
10940 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10950 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
10960 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
10970 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
10980 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
10990 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
109a0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
109b0 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
109c0 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
109d0 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
109e0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
109f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
10a00 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
10a10 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
10a20 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
10a30 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
10a40 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
10a50 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
10a60 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
10a70 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
10a80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
10a90 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
10aa0 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
10ab0 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
10ac0 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a  pageSize */.   .
10ad0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
10ae0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
10af0 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
10b00 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
10b10 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
10b20 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
10b30 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
10b40 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
10b50 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
10b60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10b70 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
10b80 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
10b90 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
10ba0 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a  *mutexShared; ).
10bb0 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20        pBt->nRef 
10bc0 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  = 1;.      MUTEX
10bd0 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61  _LOGIC( mutexSha
10be0 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
10bf0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
10c00 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
10c10 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20  ER);).      if( 
10c20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
10c30 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  E && sqlite3Glob
10c40 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
10c50 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  tex ){.        p
10c60 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  Bt->mutex = sqli
10c70 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
10c80 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
10c90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  ;.        if( pB
10ca0 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  t->mutex==0 ){. 
10cb0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
10cc0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
10cd0 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
10ce0 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  Failed = 0;.    
10cf0 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
10d00 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20  _open_out;.     
10d10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10d20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
10d30 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
10d40 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ed);.      pBt->
10d50 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pNext = GLOBAL(B
10d60 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
10d70 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
10d80 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  ;.      GLOBAL(B
10d90 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
10da0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
10db0 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71   = pBt;.      sq
10dc0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
10dd0 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
10de0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
10df0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
10e00 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
10e10 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
10e20 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10e30 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66  _DISKIO).  /* If
10e40 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75   the new Btree u
10e50 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70  ses a sharable p
10e60 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c  BtShared, then l
10e70 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  ink the new.  **
10e80 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20   Btree into the 
10e90 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72  list of all shar
10ea0 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20  able Btrees for 
10eb0 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74  the same connect
10ec0 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69  ion..  ** The li
10ed0 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73  st is kept in as
10ee0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
10ef0 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20   pBt address..  
10f00 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  */.  if( p->shar
10f10 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  able ){.    int 
10f20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53  i;.    Btree *pS
10f30 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ib;.    for(i=0;
10f40 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
10f50 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69  {.      if( (pSi
10f60 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  b = db->aDb[i].p
10f70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e  Bt)!=0 && pSib->
10f80 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
10f90 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
10fa0 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d  >pPrev ){ pSib =
10fb0 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a   pSib->pPrev; }.
10fc0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
10fd0 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a  Bt<pSib->pBt ){.
10fe0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
10ff0 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  xt = pSib;.     
11000 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
11010 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69  0;.          pSi
11020 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  b->pPrev = p;.  
11030 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11040 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
11050 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69  ib->pNext && pSi
11060 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d  b->pNext->pBt<p-
11070 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
11080 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d      pSib = pSib-
11090 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
110a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
110b0 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70  >pNext = pSib->p
110c0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
110d0 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b  p->pPrev = pSib;
110e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
110f0 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
11100 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d         p->pNext-
11110 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
11120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11130 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20    pSib->pNext = 
11140 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
11150 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11160 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
11170 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20  ndif.  *ppBtree 
11180 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
11190 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
111a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
111b0 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
111c0 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
111d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
111e0 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
111f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
11200 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
11210 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11220 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
11230 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
11240 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72    /* If the B-Tr
11250 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ee was successfu
11260 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20  lly opened, set 
11270 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
11280 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20  size to the.    
11290 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
112a0 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f  . Except, when o
112b0 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69  pening on an exi
112c0 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67  sting shared pag
112d0 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a  er-cache,.    **
112e0 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74   do not change t
112f0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
11300 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
11310 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
11320 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d  Schema(p, 0, 0)=
11330 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
11340 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
11350 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  size(p->pBt->pPa
11360 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ger, SQLITE_DEFA
11370 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b  ULT_CACHE_SIZE);
11380 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
11390 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20   mutexOpen ){.  
113a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
113b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74  3_mutex_held(mut
113c0 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73  exOpen) );.    s
113d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
113e0 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
113f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11400 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
11410 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  nt the BtShared.
11420 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57  nRef counter.  W
11430 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a  hen it reaches z
11440 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74  ero,.** remove t
11450 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
11460 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73  cture from the s
11470 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65  haring list.  Re
11480 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
11490 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
114a0 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65  f counter reache
114b0 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  s zero and retur
114c0 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74  n.** false if it
114d0 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69   is still positi
114e0 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ve..*/.static in
114f0 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  t removeFromShar
11500 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64  ingList(BtShared
11510 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20   *pBt){.#ifndef 
11520 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
11530 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58  ED_CACHE.  MUTEX
11540 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
11550 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
11560 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ).  BtShared *pL
11570 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
11580 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
11590 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
115a0 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
115b0 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f  tex) );.  MUTEX_
115c0 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
115d0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
115e0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
115f0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
11600 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
11610 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
11620 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
11630 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
11640 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
11650 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
11660 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
11670 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
11680 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
11690 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
116a0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
116b0 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
116c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
116d0 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
116e0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
116f0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
11700 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
11710 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
11720 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
11730 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
11740 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
11750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11760 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
11770 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
11780 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
11790 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
117a0 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
117b0 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
117c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
117d0 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
117e0 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
117f0 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
11800 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
11810 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
11820 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
11830 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
11840 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
11850 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
11860 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
11870 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
11880 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
11890 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
118a0 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62 79  ytes with a 4-by
118b0 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61 20  te prefix for a 
118c0 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f  left-child.** po
118d0 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
118e0 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65   void allocateTe
118f0 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
11900 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70   *pBt){.  if( !p
11910 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
11920 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
11930 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
11940 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
11950 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f  geSize );..    /
11960 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65  * One of the use
11970 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70  s of pBt->pTmpSp
11980 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74  ace is to format
11990 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20   cells before.  
119a0 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74    ** inserting t
119b0 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20  hem into a leaf 
119c0 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66  page (function f
119d0 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66  illInCell()). If
119e0 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69  .    ** a cell i
119f0 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79  s less than 4 by
11a00 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20  tes in size, it 
11a10 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  is rounded up to
11a20 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20   4 bytes.    ** 
11a30 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72  by the various r
11a40 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e  outines that man
11a50 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63  ipulate binary c
11a60 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20  ells. Which.    
11a70 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74  ** can mean that
11a80 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e   fillInCell() on
11a90 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74  ly initializes t
11aa0 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a  he first 2 or 3.
11ab0 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
11ac0 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74  pTmpSpace, but t
11ad0 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20  hat the first 4 
11ae0 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64  bytes are copied
11af0 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20   from.    ** it 
11b00 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  into a database 
11b10 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f  page. This is no
11b20 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f  t actually a pro
11b30 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20  blem, but it.   
11b40 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61   ** does cause a
11b50 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20   valgrind error 
11b60 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20  when the 1 or 2 
11b70 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c  bytes of unitial
11b80 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74  ized .    ** dat
11b90 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73  a is passed to s
11ba0 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65  ystem call write
11bb0 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20  (). So to avoid 
11bc0 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20  this error,.    
11bd0 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73  ** zero the firs
11be0 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d  t 4 bytes of tem
11bf0 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20 20  p space here..  
11c00 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
11c10 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72 20  :  Provide four 
11c20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61 6c  bytes of initial
11c30 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f 72  ized space befor
11c40 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65 67  e the.    ** beg
11c50 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53 70  inning of pTmpSp
11c60 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20 61  ace as an area a
11c70 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65 70  vailable to prep
11c80 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c  end the.    ** l
11c90 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  eft-child pointe
11ca0 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  r to the beginni
11cb0 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20  ng of a cell..  
11cc0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74    */.    if( pBt
11cd0 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
11ce0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74 2d       memset(pBt-
11cf0 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 38  >pTmpSpace, 0, 8
11d00 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 54  );.      pBt->pT
11d10 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20  mpSpace += 4;.  
11d20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
11d30 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70   Free the pBt->p
11d40 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  TmpSpace allocat
11d50 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
11d60 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65  id freeTempSpace
11d70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
11d80 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70  .  if( pBt->pTmp
11d90 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
11da0 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20 34  ->pTmpSpace -= 4
11db0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
11dc0 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70 53  eFree(pBt->pTmpS
11dd0 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e  pace);.    pBt->
11de0 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 20  pTmpSpace = 0;. 
11df0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
11e00 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61  e an open databa
11e10 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74  se and invalidat
11e20 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
11e30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
11e40 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70  eeClose(Btree *p
11e50 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
11e60 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
11e70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a  tCursor *pCur;..
11e80 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63    /* Close all c
11e90 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69  ursors opened vi
11ea0 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20  a this handle.  
11eb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
11ec0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11ed0 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
11ee0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
11ef0 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20  nter(p);.  pCur 
11f00 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
11f10 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b    while( pCur ){
11f20 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70  .    BtCursor *p
11f30 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20  Tmp = pCur;.    
11f40 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  pCur = pCur->pNe
11f50 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70  xt;.    if( pTmp
11f60 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
11f70 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
11f80 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d  eCloseCursor(pTm
11f90 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
11fa0 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79   /* Rollback any
11fb0 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
11fc0 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65  ion and free the
11fd0 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72   handle structur
11fe0 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  e..  ** The call
11ff0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
12000 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73  Rollback() drops
12010 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73   any table-locks
12020 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68   held by.  ** th
12030 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a  is handle..  */.
12040 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
12050 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45  llback(p, SQLITE
12060 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  _OK, 0);.  sqlit
12070 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12080 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
12090 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20  are still other 
120a0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
120b0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68  rences to the sh
120c0 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20  ared-btree.  ** 
120d0 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72  structure, retur
120e0 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69  n now. The remai
120f0 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f  nder of this pro
12100 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20  cedure cleans . 
12110 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65   ** up the share
12120 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  d-btree..  */.  
12130 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
12140 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c  oLock==0 && p->l
12150 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
12160 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c  ( !p->sharable |
12170 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  | removeFromShar
12180 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a  ingList(pBt) ){.
12190 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69      /* The pBt i
121a0 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74  s no longer on t
121b0 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c  he sharing list,
121c0 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73   so we can acces
121d0 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68  s.    ** it with
121e0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f  out having to ho
121f0 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20  ld the mutex..  
12200 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61    **.    ** Clea
12210 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65  n out and delete
12220 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62   the BtShared ob
12230 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ject..    */.   
12240 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
12250 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71  Cursor );.    sq
12260 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
12270 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
12280 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65    if( pBt->xFree
12290 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70  Schema && pBt->p
122a0 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
122b0 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
122c0 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
122d0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
122e0 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e  3DbFree(0, pBt->
122f0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72  pSchema);.    fr
12300 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
12310 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
12320 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69  ee(pBt);.  }..#i
12330 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12340 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
12350 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
12360 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61  ToLock==0 );.  a
12370 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64  ssert( p->locked
12380 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
12390 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76  pPrev ) p->pPrev
123a0 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
123b0 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65  xt;.  if( p->pNe
123c0 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  xt ) p->pNext->p
123d0 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
123e0 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
123f0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65  e3_free(p);.  re
12400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12410 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
12420 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  the limit on the
12430 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
12440 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20   allowed in the 
12450 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cache..**.** The
12460 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
12470 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20 69  of cache pages i
12480 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62 73  s set to the abs
12490 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  olute.** value o
124a0 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78  f mxPage.  If mx
124b0 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
124c0 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  , the pager will
124d0 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e  .** operate asyn
124e0 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20  chronously - it 
124f0 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f  will not stop to
12500 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20   do fsync()s.** 
12510 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20 69  to insure data i
12520 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
12530 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65   disk surface be
12540 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69  fore.** continui
12550 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e  ng.  Transaction
12560 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20  s still work if 
12570 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
12580 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ff,.** and the d
12590 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62  atabase cannot b
125a0 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74  e corrupted if t
125b0 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63  his program.** c
125c0 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20  rashes.  But if 
125d0 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
125e0 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20  stem crashes or 
125f0 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61  there is.** an a
12600 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c  brupt power fail
12610 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f  ure when synchro
12620 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65  nous is off, the
12630 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75   database.** cou
12640 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e  ld be left in an
12650 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e   inconsistent an
12660 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20  d unrecoverable 
12670 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72  state..** Synchr
12680 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64  onous is on by d
12690 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61  efault so databa
126a0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
126b0 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79   not.** normally
126c0 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74   a worry..*/.int
126d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
126e0 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20  CacheSize(Btree 
126f0 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
12700 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12710 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
12720 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
12730 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
12740 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
12750 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
12760 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
12770 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d  etCachesize(pBt-
12780 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
12790 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
127a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
127b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
127c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
127d0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
127e0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
127f0 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74  it on the amount
12800 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12810 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62   file that may b
12820 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70  e.** memory mapp
12830 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
12840 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69  e3BtreeSetMmapLi
12850 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71  mit(Btree *p, sq
12860 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
12870 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ap){.  BtShared 
12880 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
12890 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
128a0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
128b0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
128c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
128d0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
128e0 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
128f0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d  pBt->pPager, szM
12900 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  map);.  sqlite3B
12910 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12920 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12930 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
12940 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
12950 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  ZE>0 */../*.** C
12960 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61  hange the way da
12970 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20  ta is synced to 
12980 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  disk in order to
12990 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63   increase or dec
129a0 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c  rease.** how wel
129b0 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  l the database r
129c0 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75  esists damage du
129d0 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20  e to OS crashes 
129e0 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  and power.** fai
129f0 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20  lures.  Level 1 
12a00 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
12a10 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20  synchronous (no 
12a20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e  syncs() occur an
12a30 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20  d.** there is a 
12a40 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
12a50 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76   of damage)  Lev
12a60 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61  el 2 is the defa
12a70 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69  ult.  There.** i
12a80 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74  s a very low but
12a90 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62   non-zero probab
12aa0 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e  ility of damage.
12ab0 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65    Level 3 reduce
12ac0 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69  s the.** probabi
12ad0 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74  lity of damage t
12ae0 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20  o near zero but 
12af0 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72  with a write per
12b00 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69  formance reducti
12b10 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  on..*/.#ifndef S
12b20 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
12b30 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c  _PRAGMAS.int sql
12b40 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
12b50 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20  rFlags(.  Btree 
12b60 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
12b70 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f   /* The btree to
12b80 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79 20   set the safety 
12b90 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e  level on */.  un
12ba0 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20  signed pgFlags  
12bb0 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
12bc0 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f  PAGER_* flags */
12bd0 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
12be0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
12bf0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12c00 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
12c10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
12c20 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
12c30 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
12c40 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e  erSetFlags(pBt->
12c50 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29  pPager, pgFlags)
12c60 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12c70 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
12c80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12c90 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
12ca0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
12cb0 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20   given btree is 
12cc0 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65  set to safety le
12cd0 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72  vel 1.  In other
12ce0 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72  .** words, retur
12cf0 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e  n TRUE if no syn
12d00 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  c() occurs on th
12d10 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f  e disk files..*/
12d20 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12d30 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74  eSyncDisabled(Bt
12d40 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
12d50 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
12d60 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  t;.  int rc;.  a
12d70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12d80 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
12d90 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73  >mutex) );  .  s
12da0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12db0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
12dc0 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
12dd0 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  r );.  rc = sqli
12de0 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70  te3PagerNosync(p
12df0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73  Bt->pPager);.  s
12e00 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12e10 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
12e20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
12e30 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  e the default pa
12e40 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65  ges size and the
12e50 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
12e60 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61  ved bytes per pa
12e70 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  ge..** Or, if th
12e80 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20  e page size has 
12e90 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78  already been fix
12ea0 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
12eb0 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77  E_READONLY .** w
12ec0 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
12ed0 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  anything..**.** 
12ee0 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75  The page size mu
12ef0 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
12f00 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61   2 between 512 a
12f10 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68  nd 65536.  If th
12f20 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73  e page.** size s
12f30 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74  upplied does not
12f40 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74   meet this const
12f50 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70  raint then the p
12f60 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  age size is not.
12f70 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  ** changed..**.*
12f80 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65  * Page sizes are
12f90 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20   constrained to 
12fa0 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  be a power of tw
12fb0 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65  o so that the re
12fc0 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64  gion.** of the d
12fd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
12fe0 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62  d for locking (b
12ff0 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44  eginning at PEND
13000 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65  ING_BYTE,.** the
13010 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
13020 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72   the 1GB boundar
13030 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e  y, 0x40000000) n
13040 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  eeds to occur.**
13050 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
13060 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  g of a page..**.
13070 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
13080 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73  nReserve is less
13090 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
130a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
130b0 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73  eserved.** bytes
130c0 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66   per page is lef
130d0 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
130e0 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d  ** If the iFix!=
130f0 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  0 then the BTS_P
13100 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c  AGESIZE_FIXED fl
13110 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61  ag is set so tha
13120 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a  t the page size.
13130 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75  ** and autovacuu
13140 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f  m mode can no lo
13150 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e  nger be changed.
13160 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
13170 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
13180 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
13190 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
131a0 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b  erve, int iFix){
131b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
131c0 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
131d0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
131e0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
131f0 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65  rve>=-1 && nRese
13200 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71  rve<=255 );.  sq
13210 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
13220 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  p);.  if( pBt->b
13230 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
13240 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a  GESIZE_FIXED ){.
13250 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13260 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
13270 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
13280 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
13290 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
132a0 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
132b0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
132c0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
132d0 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  }.  assert( nRes
132e0 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
132f0 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66  rve<=255 );.  if
13300 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
13310 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
13320 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
13330 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
13340 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
13350 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
13360 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
13370 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
13380 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50  assert( !pBt->pP
13390 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43  age1 && !pBt->pC
133a0 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
133b0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33  ->pageSize = (u3
133c0 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2)pageSize;.    
133d0 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
133e0 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
133f0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
13400 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
13410 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
13420 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
13430 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
13440 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
13450 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
13460 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
13470 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
13480 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
13490 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ED;.  sqlite3Btr
134a0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
134b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
134c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
134d0 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
134e0 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
134f0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
13500 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
13510 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
13520 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
13530 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
13540 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 7c  ITE_HAS_CODEC) |
13550 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
13560 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 54 68  _DEBUG)./*.** Th
13570 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
13580 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65  imilar to sqlite
13590 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
135a0 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  (), except that 
135b0 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62  it.** may only b
135c0 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69  e called if it i
135d0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
135e0 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74  t the b-tree mut
135f0 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  ex is already.**
13600 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   held..**.** Thi
13610 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f  s is useful in o
13620 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  ne special case 
13630 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  in the backup AP
13640 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74 20  I code where it 
13650 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74  is.** known that
13660 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74 72   the shared b-tr
13670 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64  ee mutex is held
13680 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78 20  , but the mutex 
13690 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  on the .** datab
136a0 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
136b0 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20  owns *p is not. 
136c0 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66 20  In this case if 
136d0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
136e0 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62  r().** were to b
136f0 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67  e called, it mig
13700 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20  ht collide with 
13710 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61  some other opera
13720 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  tion on the.** d
13730 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
13740 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75  hat owns *p, cau
13750 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62  sing undefined b
13760 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  ehavior..*/.int 
13770 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
13780 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74  eserveNoMutex(Bt
13790 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
137a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
137b0 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75  _held(p->pBt->mu
137c0 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
137d0 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
137e0 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62  e - p->pBt->usab
137f0 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66  leSize;.}.#endif
13800 20 2f 2a 20 53 51 4c 49 54 45 5f 48 41 53 5f 43   /* SQLITE_HAS_C
13810 4f 44 45 43 20 7c 7c 20 53 51 4c 49 54 45 5f 44  ODEC || SQLITE_D
13820 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 21 64 65  EBUG */..#if !de
13830 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
13840 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
13850 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
13860 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
13870 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
13880 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
13890 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
138a0 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70  e end of every p
138b0 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20  age that.** are 
138c0 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74  intentually left
138d0 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69   unused.  This i
138e0 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22  s the "reserved"
138f0 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a   space that is.*
13900 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64  * sometimes used
13910 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a   by extensions..
13920 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
13930 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42 74  reeGetReserve(Bt
13940 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
13950 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13960 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
13970 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
13980 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
13990 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33  eSize;.  sqlite3
139a0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
139b0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
139c0 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69  .** Set the maxi
139d0 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
139e0 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66  or a database if
139f0 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
13a00 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67  ive..** No chang
13a10 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d  es are made if m
13a20 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65  xPage is 0 or ne
13a30 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72  gative..** Regar
13a40 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
13a50 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ue of mxPage, re
13a60 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
13a70 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
13a80 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
13a90 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72  MaxPageCount(Btr
13aa0 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
13ab0 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  e){.  int n;.  s
13ac0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13ad0 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
13ae0 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
13af0 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  unt(p->pBt->pPag
13b00 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
13b10 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
13b20 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
13b30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
13b40 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  e BTS_SECURE_DEL
13b50 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77 46  ETE flag if newF
13b60 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20  lag is 0 or 1.  
13b70 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31  If newFlag is -1
13b80 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e  ,.** then make n
13b90 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61  o changes.  Alwa
13ba0 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 76 61  ys return the va
13bb0 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f 53  lue of the BTS_S
13bc0 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20  ECURE_DELETE.** 
13bd0 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74 68  setting after th
13be0 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74  e change..*/.int
13bf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63   sqlite3BtreeSec
13c00 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20  ureDelete(Btree 
13c10 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29  *p, int newFlag)
13c20 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28  {.  int b;.  if(
13c30 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
13c40 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13c50 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
13c60 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20  newFlag>=0 ){.  
13c70 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61    p->pBt->btsFla
13c80 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55 52  gs &= ~BTS_SECUR
13c90 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69 66  E_DELETE;.    if
13ca0 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e 70  ( newFlag ) p->p
13cb0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
13cc0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
13cd0 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28 70  E;.  } .  b = (p
13ce0 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
13cf0 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
13d00 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  ETE)!=0;.  sqlit
13d10 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
13d20 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 23  .  return b;.}.#
13d30 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
13d40 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
13d50 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
13d60 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13d70 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a  OMIT_VACUUM) */.
13d80 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
13d90 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
13da0 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
13db0 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
13dc0 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a   'autoVacuum'.**
13dd0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
13de0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74  n-zero, then aut
13df0 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73  o-vacuum mode is
13e00 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72   enabled. If zer
13e10 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61  o, it.** is disa
13e20 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c  bled. The defaul
13e30 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
13e40 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70  auto-vacuum prop
13e50 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65  erty is .** dete
13e60 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51  rmined by the SQ
13e70 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
13e80 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a  OVACUUM macro..*
13e90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
13ea0 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
13eb0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75  Btree *p, int au
13ec0 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65  toVacuum){.#ifde
13ed0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
13ee0 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
13ef0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
13f00 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61  Y;.#else.  BtSha
13f10 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
13f20 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
13f30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76  LITE_OK;.  u8 av
13f40 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75   = (u8)autoVacuu
13f50 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  m;..  sqlite3Btr
13f60 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
13f70 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
13f80 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
13f90 46 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 76  FIXED)!=0 && (av
13fa0 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74   ?1:0)!=pBt->aut
13fb0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
13fc0 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
13fd0 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NLY;.  }else{.  
13fe0 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
13ff0 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20  m = av ?1:0;.   
14000 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
14010 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20   = av==2 ?1:0;. 
14020 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
14030 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
14040 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
14050 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
14060 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
14070 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
14080 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d  operty. If auto-
14090 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e  vacuum is .** en
140a0 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72  abled 1 is retur
140b0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30  ned. Otherwise 0
140c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
140d0 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
140e0 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69  um(Btree *p){.#i
140f0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
14100 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
14110 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56  turn BTREE_AUTOV
14120 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73  ACUUM_NONE;.#els
14130 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  e.  int rc;.  sq
14140 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
14150 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20  p);.  rc = (.   
14160 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56   (!p->pBt->autoV
14170 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
14180 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20  OVACUUM_NONE:.  
14190 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72    (!p->pBt->incr
141a0 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
141b0 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20  TOVACUUM_FULL:. 
141c0 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43     BTREE_AUTOVAC
141d0 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20  UUM_INCR.  );.  
141e0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
141f0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
14200 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  c;.#endif.}.../*
14210 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65  .** Get a refere
14220 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66  nce to pPage1 of
14230 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14240 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a  le.  This will.*
14250 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61  * also acquire a
14260 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61   readlock on tha
14270 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  t file..**.** SQ
14280 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
14290 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
142a0 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
142b0 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f  not a.** well-fo
142c0 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  rmed database fi
142d0 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  le, then SQLITE_
142e0 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72  CORRUPT is retur
142f0 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned..** SQLITE_B
14300 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
14310 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
14320 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49  is locked.  SQLI
14330 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72  TE_NOMEM.** is r
14340 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75  eturned if we ru
14350 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
14360 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
14370 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72  lockBtree(BtShar
14380 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
14390 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
143a0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
143b0 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
143c0 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
143d0 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50  pPage1;     /* P
143e0 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74  age 1 of the dat
143f0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
14400 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
14410 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
14420 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
14430 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
14440 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20   nPageFile = 0; 
14450 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
14460 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
14470 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
14480 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20  nt nPageHeader; 
14490 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
144a0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
144b0 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67  tabase according
144c0 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73   to hdr */..  as
144d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
144e0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
144f0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
14500 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
14510 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
14520 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  e3PagerSharedLoc
14530 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
14540 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14550 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
14560 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74  .  rc = btreeGet
14570 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
14580 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  age1, 0);.  if( 
14590 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
145a0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
145b0 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e   Do some checkin
145c0 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65  g to help insure
145d0 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65   the file we ope
145e0 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20  ned really is.  
145f0 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62  ** a valid datab
14600 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a  ase file. .  */.
14610 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48    nPage = nPageH
14620 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65  eader = get4byte
14630 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
14640 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74  >aData);.  sqlit
14650 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
14660 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
14670 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28  PageFile);.  if(
14680 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d   nPage==0 || mem
14690 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67  cmp(24+(u8*)pPag
146a0 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75  e1->aData, 92+(u
146b0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
146c0 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50  ,4)!=0 ){.    nP
146d0 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b  age = nPageFile;
146e0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65  .  }.  if( nPage
146f0 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61  >0 ){.    u32 pa
14700 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20  geSize;.    u32 
14710 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
14720 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67  u8 *page1 = pPag
14730 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72  e1->aData;.    r
14740 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
14750 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  B;.    if( memcm
14760 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48  p(page1, zMagicH
14770 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b  eader, 16)!=0 ){
14780 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
14790 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
147a0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
147b0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
147c0 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31   if( page1[18]>1
147d0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   ){.      pBt->b
147e0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
147f0 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  EAD_ONLY;.    }.
14800 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
14810 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>1 ){.      got
14820 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
14830 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  led;.    }.#else
14840 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
14850 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>2 ){.      pB
14860 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
14870 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
14880 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
14890 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[19]>2 ){.     
148a0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
148b0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
148c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72      /* If the wr
148d0 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73  ite version is s
148e0 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61  et to 2, this da
148f0 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65  tabase should be
14900 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a   accessed.    **
14910 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66   in WAL mode. If
14920 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20   the log is not 
14930 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70  already open, op
14940 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20  en it now. Then 
14950 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  .    ** return S
14960 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74  QLITE_OK and ret
14970 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75  urn without popu
14980 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e  lating BtShared.
14990 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54  pPage1..    ** T
149a0 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74  he caller detect
149b0 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73  s this and calls
149c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
149d0 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20  gain. This is.  
149e0 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73    ** required as
149f0 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20   the version of 
14a00 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79  page 1 currently
14a10 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75   in the page1 bu
14a20 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ffer.    ** may 
14a30 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73  not be the lates
14a40 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72  t version - ther
14a50 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72  e may be a newer
14a60 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a   one in the log.
14a70 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
14a80 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65   */.    if( page
14a90 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74  1[19]==2 && (pBt
14aa0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
14ab0 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20  _NO_WAL)==0 ){. 
14ac0 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20       int isOpen 
14ad0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
14ae0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
14af0 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Wal(pBt->pPager,
14b00 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20   &isOpen);.     
14b10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14b20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
14b30 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
14b40 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73  iled;.      }els
14b50 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20  e if( isOpen==0 
14b60 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
14b70 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
14b80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
14b90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
14ba0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  }.      rc = SQL
14bb0 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
14bc0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
14bd0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62   The maximum emb
14be0 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
14bf0 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 32  ust be exactly 2
14c00 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e  5%.  And the min
14c10 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65  imum.    ** embe
14c20 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75  dded fraction mu
14c30 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20  st be 12.5% for 
14c40 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61  both leaf-data a
14c50 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  nd non-leaf-data
14c60 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69  ..    ** The ori
14c70 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c  ginal design all
14c80 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e  owed these amoun
14c90 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20  ts to vary, but 
14ca0 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72  as of.    ** ver
14cb0 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72  sion 3.6.0, we r
14cc0 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62  equire them to b
14cd0 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a  e fixed..    */.
14ce0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
14cf0 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30  page1[21], "\100
14d00 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20  \040\040",3)!=0 
14d10 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
14d20 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
14d30 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53  .    }.    pageS
14d40 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
14d50 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
14d60 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20  ]<<16);.    if( 
14d70 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
14d80 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20  geSize)!=0.     
14d90 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  || pageSize>SQLI
14da0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
14db0 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69   .     || pageSi
14dc0 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a  ze<=256 .    ){.
14dd0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
14de0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
14df0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
14e00 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
14e10 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  0 );.    usableS
14e20 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
14e30 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
14e40 69 66 28 20 28 75 33 32 29 70 61 67 65 53 69 7a  if( (u32)pageSiz
14e50 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e!=pBt->pageSize
14e60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74   ){.      /* Aft
14e70 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66  er reading the f
14e80 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
14e90 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69   database assumi
14ea0 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20  ng a page size. 
14eb0 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61       ** of BtSha
14ec0 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65  red.pageSize, we
14ed0 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64   have discovered
14ee0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
14ef0 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ize is.      ** 
14f00 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a  actually pageSiz
14f10 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  e. Unlock the da
14f20 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42  tabase, leave pB
14f30 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20  t->pPage1 at.   
14f40 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72     ** zero and r
14f50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
14f60 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
14f70 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
14f80 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61  ion.      ** aga
14f90 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  in with the corr
14fa0 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20  ect page-size.. 
14fb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
14fc0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
14fd0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73  );.      pBt->us
14fe0 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
14ff0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74  eSize;.      pBt
15000 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
15010 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65  eSize;.      fre
15020 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
15030 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
15040 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
15050 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
15060 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
15070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15090 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61      pageSize-usa
150a0 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
150b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
150c0 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64  .    if( (pBt->d
150d0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
150e0 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d  E_RecoveryMode)=
150f0 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67  =0 && nPage>nPag
15100 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  eFile ){.      r
15110 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
15120 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
15130 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
15140 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
15150 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
15160 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  480 ){.      got
15170 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
15180 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
15190 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
151a0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
151b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
151c0 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
151d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
151e0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
151f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
15200 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
15210 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
15220 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
15230 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
15240 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
15250 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
15260 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
15270 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
15280 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
15290 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
152a0 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
152b0 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
152c0 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
152d0 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
152e0 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
152f0 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
15300 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
15310 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
15320 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
15330 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
15340 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
15350 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
15360 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
15370 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
15380 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
15390 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
153a0 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
153b0 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
153c0 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
153d0 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
153e0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
153f0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
15400 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
15410 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
15420 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72  a 2-byte pointer
15430 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
15440 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
15450 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
15460 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
15470 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
15480 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
15490 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
154a0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
154b0 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
154c0 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
154d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
154e0 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *64/255 - 23);. 
154f0 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
15500 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
15510 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
15520 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
15530 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29  >maxLeaf = (u16)
15540 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
15550 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 35);.  pBt->m
15560 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28  inLeaf = (u16)((
15570 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
15580 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
15590 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78  ;.  if( pBt->max
155a0 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20  Local>127 ){.   
155b0 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
155c0 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d  yload = 127;.  }
155d0 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d  else{.    pBt->m
155e0 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
155f0 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63   (u8)pBt->maxLoc
15600 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  al;.  }.  assert
15610 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
15620 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
15630 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
15640 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
15650 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  e1;.  pBt->nPage
15660 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
15670 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
15680 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
15690 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
156a0 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
156b0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
156c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
156d0 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
156e0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
156f0 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70  er of cursors op
15700 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20  en on pBt. This 
15710 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
15720 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
15730 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
15740 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
15750 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
15760 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
15770 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73   Only write curs
15780 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20  ors are counted 
15790 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75  if wrOnly is tru
157a0 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73  e.  If wrOnly is
157b0 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61  .** false then a
157c0 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  ll cursors are c
157d0 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ounted..**.** Fo
157e0 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
157f0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  f this routine, 
15800 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  a cursor is any 
15810 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
15820 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61  s capable of rea
15830 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
15840 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
15850 20 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a    Cursors that.*
15860 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70  * have been trip
15870 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52  ped into the CUR
15880 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20  SOR_FAULT state 
15890 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e  are not counted.
158a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
158b0 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
158c0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
158d0 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42  int wrOnly){.  B
158e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
158f0 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
15900 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
15910 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
15920 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
15930 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30    if( (wrOnly==0
15940 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   || (pCur->curFl
15950 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
15960 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26  Flag)!=0).     &
15970 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  & pCur->eState!=
15980 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72  CURSOR_FAULT ) r
15990 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++; .  }.  retur
159a0 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n r;.}.#endif../
159b0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
159c0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
159d0 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
159e0 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
159f0 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
15a00 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
15a10 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
15a20 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
15a30 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
15a40 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
15a50 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
15a60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
15a70 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
15a80 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
15a90 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
15aa0 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
15ab0 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61  f there is a tra
15ac0 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
15ad0 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ress, this routi
15ae0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
15af0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
15b00 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
15b10 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  d(BtShared *pBt)
15b20 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
15b30 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
15b40 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
15b50 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c  assert( countVal
15b60 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29  idCursors(pBt,0)
15b70 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  ==0 || pBt->inTr
15b80 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f  ansaction>TRANS_
15b90 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42  NONE );.  if( pB
15ba0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
15bb0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  ==TRANS_NONE && 
15bc0 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
15bd0 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
15be0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
15bf0 67 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ge1;.    assert(
15c00 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29   pPage1->aData )
15c10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
15c20 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
15c30 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  nt(pBt->pPager)=
15c40 3d 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  =1 );.    pBt->p
15c50 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72  Page1 = 0;.    r
15c60 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
15c70 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
15c80 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74   If pBt points t
15c90 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20  o an empty file 
15ca0 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61  then convert tha
15cb0 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20  t empty file.** 
15cc0 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79  into a new empty
15cd0 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69   database by ini
15ce0 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69  tializing the fi
15cf0 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  rst page of.** t
15d00 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
15d10 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61  static int newDa
15d20 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20  tabase(BtShared 
15d30 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
15d40 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65   *pP1;.  unsigne
15d50 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20  d char *data;.  
15d60 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
15d70 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
15d80 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
15d90 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
15da0 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72  nPage>0 ){.    r
15db0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15dc0 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74  .  }.  pP1 = pBt
15dd0 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65  ->pPage1;.  asse
15de0 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20  rt( pP1!=0 );.  
15df0 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74  data = pP1->aDat
15e00 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
15e10 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d  3PagerWrite(pP1-
15e20 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
15e30 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
15e40 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20  .  memcpy(data, 
15e50 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69  zMagicHeader, si
15e60 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
15e70 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  r));.  assert( s
15e80 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
15e90 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74  er)==16 );.  dat
15ea0 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42  a[16] = (u8)((pB
15eb0 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26  t->pageSize>>8)&
15ec0 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37  0xff);.  data[17
15ed0 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70  ] = (u8)((pBt->p
15ee0 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66  ageSize>>16)&0xf
15ef0 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d  f);.  data[18] =
15f00 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d   1;.  data[19] =
15f10 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   1;.  assert( pB
15f20 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70  t->usableSize<=p
15f30 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20  Bt->pageSize && 
15f40 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b  pBt->usableSize+
15f50 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69  255>=pBt->pageSi
15f60 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20  ze);.  data[20] 
15f70 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65  = (u8)(pBt->page
15f80 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
15f90 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  leSize);.  data[
15fa0 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61  21] = 64;.  data
15fb0 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74  [22] = 32;.  dat
15fc0 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65  a[23] = 32;.  me
15fd0 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20  mset(&data[24], 
15fe0 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65  0, 100-24);.  ze
15ff0 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f  roPage(pP1, PTF_
16000 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c  INTKEY|PTF_LEAF|
16010 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a  PTF_LEAFDATA );.
16020 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
16030 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
16040 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53  FIXED;.#ifndef S
16050 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
16060 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20  ACUUM.  assert( 
16070 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
16080 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56  =1 || pBt->autoV
16090 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73  acuum==0 );.  as
160a0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56  sert( pBt->incrV
160b0 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
160c0 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29  >incrVacuum==0 )
160d0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
160e0 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42  ta[36 + 4*4], pB
160f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
16100 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
16110 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d  [36 + 7*4], pBt-
16120 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65  >incrVacuum);.#e
16130 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67  ndif.  pBt->nPag
16140 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31  e = 1;.  data[31
16150 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 1;.  return 
16160 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
16170 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
16180 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
16190 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
161a0 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61 20 64  le (creating a d
161b0 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69  atabase.** consi
161c0 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c  sting of a singl
161d0 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63  e page and no sc
161e0 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52  hema objects). R
161f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
16200 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ** if successful
16210 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
16220 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
16230 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
16240 74 65 33 42 74 72 65 65 4e 65 77 44 62 28 42 74  te3BtreeNewDb(Bt
16250 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
16260 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
16270 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e  eEnter(p);.  p->
16280 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  pBt->nPage = 0;.
16290 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
162a0 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71  se(p->pBt);.  sq
162b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
162c0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
162d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
162e0 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77  t to start a new
162f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
16300 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
16310 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20  n.** is started 
16320 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
16330 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72  gument is nonzer
16340 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72  o, otherwise a r
16350 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ead-.** transact
16360 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63  ion.  If the sec
16370 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
16380 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78  2 or more and ex
16390 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73  clusive.** trans
163a0 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
163b0 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  d, meaning that 
163c0 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  no other process
163d0 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
163e0 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
163f0 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69  abase.  A preexi
16400 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  sting transactio
16410 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20  n may not be.** 
16420 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c  upgraded to excl
16430 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67  usive by calling
16440 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20   this routine a 
16450 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68  second time - th
16460 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79  e.** exclusivity
16470 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73   flag only works
16480 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73   for a new trans
16490 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
164a0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
164b0 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65  n must be starte
164c0 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  d before attempt
164d0 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e  ing any .** chan
164e0 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
164f0 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ase.  None of th
16500 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
16510 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f  ines .** will wo
16520 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e  rk unless a tran
16530 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
16540 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20  ed first:.**.** 
16550 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
16560 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a  eCreateTable().*
16570 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
16580 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29  reeCreateIndex()
16590 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
165a0 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
165b0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
165c0 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28  3BtreeDropTable(
165d0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
165e0 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a  3BtreeInsert().*
165f0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
16600 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20  reeDelete().**  
16610 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
16620 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a  UpdateMeta().**.
16630 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c  ** If an initial
16640 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75   attempt to acqu
16650 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69  ire the lock fai
16660 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f  ls because of lo
16670 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a  ck contention.**
16680 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
16690 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
166a0 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20   unlocked, then 
166b0 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
166c0 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68  handler.** if th
166d0 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74  ere is one.  But
166e0 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72   if there was pr
166f0 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d  eviously a read-
16700 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20  lock, do not.** 
16710 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
16720 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72  handler - just r
16730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
16740 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20  Y.  SQLITE_BUSY 
16750 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
16760 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c  when there is al
16770 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
16780 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76  k in order to av
16790 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a  oid a deadlock..
167a0 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  **.** Suppose th
167b0 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63  ere are two proc
167c0 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20  esses A and B.  
167d0 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  A has a read loc
167e0 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61  k and B has.** a
167f0 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20   reserved lock. 
16800 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   B tries to prom
16810 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ote to exclusive
16820 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
16830 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27  because.** of A'
16840 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20  s read lock.  A 
16850 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
16860 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74   to reserved but
16870 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42   is blocked by B
16880 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20  ..** One or the 
16890 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f  other of the two
168a0 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20   processes must 
168b0 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72  give way or ther
168c0 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70  e can be.** no p
168d0 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74  rogress.  By ret
168e0 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55  urning SQLITE_BU
168f0 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b  SY and not invok
16900 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c  ing the busy cal
16910 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20  lback.** when A 
16920 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
16930 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f  ad lock, we enco
16940 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20  urage A to give 
16950 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20  up and let B.** 
16960 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20  proceed..*/.int 
16970 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
16980 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c  nTrans(Btree *p,
16990 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20   int wrflag){.  
169a0 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20  sqlite3 *pBlock 
169b0 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20  = 0;.  BtShared 
169c0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
169d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
169e0 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  _OK;..  sqlite3B
169f0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
16a00 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
16a10 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
16a20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  btree is already
16a30 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e   in a write-tran
16a40 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20  saction, or it. 
16a50 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69   ** is already i
16a60 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
16a70 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d  tion and a read-
16a80 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
16a90 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
16aa0 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
16ab0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
16ac0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
16ad0 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e  TE || (p->inTran
16ae0 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26  s==TRANS_READ &&
16af0 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20   !wrflag) ){.   
16b00 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
16b10 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
16b20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
16b30 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
16b40 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28   || IfNotOmitAV(
16b50 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
16b60 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72  )==0 );..  /* Wr
16b70 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
16b80 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c   are not possibl
16b90 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e on a read-only
16ba0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
16bb0 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
16bc0 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
16bd0 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20  Y)!=0 && wrflag 
16be0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
16bf0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
16c00 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
16c10 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  n;.  }..#ifndef 
16c20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
16c30 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66  ED_CACHE.  /* If
16c40 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73   another databas
16c50 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72  e handle has alr
16c60 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72  eady opened a wr
16c70 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
16c80 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68  .  ** on this sh
16c90 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63  ared-btree struc
16ca0 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e  ture and a secon
16cb0 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d write transact
16cc0 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75  ion is.  ** requ
16cd0 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51  ested, return SQ
16ce0 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a  LITE_LOCKED..  *
16cf0 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67 20  /.  if( (wrflag 
16d00 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
16d10 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
16d20 54 45 29 0a 20 20 20 7c 7c 20 28 70 42 74 2d 3e  TE).   || (pBt->
16d30 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
16d40 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 29 7b 0a  ENDING)!=0.  ){.
16d50 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74      pBlock = pBt
16d60 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20  ->pWriter->db;. 
16d70 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61   }else if( wrfla
16d80 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  g>1 ){.    BtLoc
16d90 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f  k *pIter;.    fo
16da0 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
16db0 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
16dc0 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
16dd0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
16de0 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20  >pBtree!=p ){.  
16df0 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70        pBlock = p
16e00 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  Iter->pBtree->db
16e10 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
16e20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16e30 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20   }.  if( pBlock 
16e40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
16e50 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28  nnectionBlocked(
16e60 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a  p->db, pBlock);.
16e70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16e80 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
16e90 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  HE;.    goto tra
16ea0 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65  ns_begun;.  }.#e
16eb0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72  ndif..  /* Any r
16ec0 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64  ead-only or read
16ed0 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69  -write transacti
16ee0 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61  on implies a rea
16ef0 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20  d-lock on .  ** 
16f00 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f  page 1. So if so
16f10 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d  me other shared-
16f20 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72  cache client alr
16f30 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65  eady has a write
16f40 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70  -lock .  ** on p
16f50 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73  age 1, the trans
16f60 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  action cannot be
16f70 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63   opened. */.  rc
16f80 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61   = querySharedCa
16f90 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
16fa0 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41  MASTER_ROOT, REA
16fb0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53  D_LOCK);.  if( S
16fc0 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67  QLITE_OK!=rc ) g
16fd0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
16fe0 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ..  pBt->btsFlag
16ff0 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41  s &= ~BTS_INITIA
17000 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28  LLY_EMPTY;.  if(
17010 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29   pBt->nPage==0 )
17020 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
17030 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  = BTS_INITIALLY_
17040 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20  EMPTY;.  do {.  
17050 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74    /* Call lockBt
17060 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68  ree() until eith
17070 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69  er pBt->pPage1 i
17080 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20  s populated or. 
17090 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28     ** lockBtree(
170a0 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68  ) returns someth
170b0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ing other than S
170c0 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74  QLITE_OK. lockBt
170d0 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79  ree().    ** may
170e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
170f0 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d  K but leave pBt-
17100 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30  >pPage1 set to 0
17110 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a   if after.    **
17120 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20   reading page 1 
17130 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61  it discovers tha
17140 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
17150 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
17160 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  .    ** file is 
17170 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  not pBt->pageSiz
17180 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
17190 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c  lockBtree() will
171a0 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70   update.    ** p
171b0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20  Bt->pageSize to 
171c0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
171d0 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
171e0 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68  k..    */.    wh
171f0 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ile( pBt->pPage1
17200 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  ==0 && SQLITE_OK
17210 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65  ==(rc = lockBtre
17220 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20  e(pBt)) );..    
17230 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17240 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
17250 20 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62       if( (pBt->b
17260 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
17270 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20  AD_ONLY)!=0 ){. 
17280 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
17290 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
172a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
172b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
172c0 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50  gerBegin(pBt->pP
172d0 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71  ager,wrflag>1,sq
172e0 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
172f0 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  y(p->db));.     
17300 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17310 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17320 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
17330 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  se(pBt);.       
17340 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
17350 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d  .  .    if( rc!=
17360 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17370 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
17380 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
17390 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63   }.  }while( (rc
173a0 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42  &0xFF)==SQLITE_B
173b0 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  USY && pBt->inTr
173c0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
173d0 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20  _NONE &&.       
173e0 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75     btreeInvokeBu
173f0 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29  syHandler(pBt) )
17400 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
17410 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
17420 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
17430 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
17440 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
17450 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53  ion++;.#ifndef S
17460 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
17470 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66  D_CACHE.      if
17480 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
17490 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
174a0 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d   p->lock.pBtree=
174b0 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54  =p && p->lock.iT
174c0 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
174d0 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b     p->lock.eLock
174e0 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20   = READ_LOCK;.  
174f0 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e        p->lock.pN
17500 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
17510 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70  ;.        pBt->p
17520 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b  Lock = &p->lock;
17530 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
17540 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54      }.    p->inT
17550 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54  rans = (wrflag?T
17560 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53  RANS_WRITE:TRANS
17570 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20  _READ);.    if( 
17580 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e  p->inTrans>pBt->
17590 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  inTransaction ){
175a0 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
175b0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69  ansaction = p->i
175c0 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  nTrans;.    }.  
175d0 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a    if( wrflag ){.
175e0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
175f0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
17600 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge1;.#ifndef SQL
17610 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
17620 43 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65  CACHE.      asse
17630 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65  rt( !pBt->pWrite
17640 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r );.      pBt->
17650 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20  pWriter = p;.   
17660 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
17670 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49   &= ~BTS_EXCLUSI
17680 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72  VE;.      if( wr
17690 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74  flag>1 ) pBt->bt
176a0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58  sFlags |= BTS_EX
176b0 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a  CLUSIVE;.#endif.
176c0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
176d0 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20   db-size header 
176e0 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65  field is incorre
176f0 63 74 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ct (as it may be
17700 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20   if an old.     
17710 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62   ** client has b
17720 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20  een writing the 
17730 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
17740 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44  update it now. D
17750 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  oing.      ** th
17760 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  is sooner rather
17770 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e   than later mean
17780 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  s the database s
17790 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a  ize can safely .
177a0 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64        ** re-read
177b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
177c0 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69  ze from page 1 i
177d0 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72  f a savepoint or
177e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
177f0 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f     ** rollback o
17800 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
17810 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
17820 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
17830 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74   pBt->nPage!=get
17840 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
17850 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20  Data[28]) ){.   
17860 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17870 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
17880 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
17890 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
178a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
178b0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
178c0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
178d0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
178e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
178f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61  .    }.  }...tra
17900 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20  ns_begun:.  if( 
17910 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17920 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f   wrflag ){.    /
17930 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65  * This call make
17940 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  s sure that the 
17950 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63 6f  pager has the co
17960 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a  rrect number of.
17970 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65      ** open save
17980 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73  points. If the s
17990 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
179a0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
179b0 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65  0 and.    ** the
179c0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
179d0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
179e0 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62  , then it will b
179f0 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20  e opened here.. 
17a00 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
17a10 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
17a20 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
17a30 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61  ager, p->db->nSa
17a40 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20  vepoint);.  }.. 
17a50 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
17a60 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
17a70 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17a80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
17a90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17aa0 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a  AUTOVACUUM../*.*
17ab0 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
17ac0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
17ad0 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  r all children o
17ae0 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c  f page pPage. Al
17af0 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20  so, if.** pPage 
17b00 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74  contains cells t
17b10 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
17b20 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74  rflow pages, set
17b30 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
17b40 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
17b50 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
17b60 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73  es as well..*/.s
17b70 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69  tatic int setChi
17b80 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67  ldPtrmaps(MemPag
17b90 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
17ba0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bc0 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61  /* Counter varia
17bd0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ble */.  int nCe
17be0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17c00 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
17c10 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a  n page pPage */.
17c20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
17c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c40 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
17c50 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ode */.  BtShare
17c60 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
17c70 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74  pBt;.  u8 isInit
17c80 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
17c90 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Init;.  Pgno pgn
17ca0 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
17cb0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
17cc0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
17cd0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
17ce0 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  ) );.  rc = btre
17cf0 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
17d00 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17d10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
17d20 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  o set_child_ptrm
17d30 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e  aps_out;.  }.  n
17d40 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
17d50 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ell;..  for(i=0;
17d60 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
17d70 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
17d80 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
17d90 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50  i);..    ptrmapP
17da0 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
17db0 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20   pCell, &rc);.. 
17dc0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
17dd0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
17de0 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
17df0 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
17e00 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
17e10 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
17e20 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
17e30 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  o, &rc);.    }. 
17e40 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
17e50 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
17e60 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
17e70 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
17e80 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
17e90 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
17ea0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
17eb0 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
17ec0 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
17ed0 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69  c);.  }..set_chi
17ee0 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a  ld_ptrmaps_out:.
17ef0 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
17f00 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
17f10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17f20 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e  .** Somewhere on
17f30 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e   pPage is a poin
17f40 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f  ter to page iFro
17f50 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20  m.  Modify this 
17f60 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68  pointer so.** th
17f70 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
17f80 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65  iTo. Parameter e
17f90 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74  Type describes t
17fa0 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74  he type of point
17fb0 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69  er to.** be modi
17fc0 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77  fied, as  follow
17fd0 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  s:.**.** PTRMAP_
17fe0 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65  BTREE:     pPage
17ff0 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
18000 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
18010 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20  ints at a child 
18020 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18030 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50        page of pP
18040 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
18050 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61  P_OVERFLOW1: pPa
18060 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
18070 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
18080 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65  points at an ove
18090 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  rflow.**        
180a0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
180b0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e  pointed to by on
180c0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
180d0 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  n pPage..**.** P
180e0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
180f0 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65   pPage is an ove
18100 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20  rflow-page. The 
18110 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
18120 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20  t the next.**   
18130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18140 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
18150 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
18160 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50  atic int modifyP
18170 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61  agePointer(MemPa
18180 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20  ge *pPage, Pgno 
18190 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c  iFrom, Pgno iTo,
181a0 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73   u8 eType){.  as
181b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
181c0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
181d0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
181e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
181f0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
18200 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
18210 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d   );.  if( eType=
18220 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
18230 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  2 ){.    /* The 
18240 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79  pointer is alway
18250 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  s the first 4 by
18260 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  tes of the page 
18270 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
18280 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79  /.    if( get4by
18290 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
182a0 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
182b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
182c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
182d0 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
182e0 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
182f0 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
18300 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
18310 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
18320 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
18330 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62  nt nCell;..    b
18340 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
18350 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d  ge);.    nCell =
18360 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
18370 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
18380 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
18390 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
183a0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
183b0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
183c0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
183d0 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
183e0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
183f0 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
18400 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
18410 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
18420 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
18430 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  Overflow.       
18440 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e    && pCell+info.
18450 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61  iOverflow+3<=pPa
18460 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d  ge->aData+pPage-
18470 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20  >maskPage.      
18480 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74     && iFrom==get
18490 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
184a0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20  o.iOverflow]).  
184b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
184c0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65     put4byte(&pCe
184d0 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
184e0 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  w], iTo);.      
184f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
18500 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
18510 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
18520 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
18530 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
18540 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
18550 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
18560 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
18570 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
18580 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
18590 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
185a0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
185b0 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
185c0 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
185d0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
185e0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
185f0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
18600 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18610 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
18620 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
18630 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
18640 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
18650 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
18660 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e    }..    pPage->
18670 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
18680 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rig;.  }.  retur
18690 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
186a0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
186b0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
186c0 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
186d0 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
186e0 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
186f0 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
18700 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
18710 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  ins valid..**.**
18720 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   The isCommit fl
18730 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
18740 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  t there is no ne
18750 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
18760 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  hat.** the journ
18770 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
18780 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
18790 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
187a0 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63  Page->pgno .** c
187b0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
187c0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
187d0 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
187e0 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
187f0 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a  o that.** page..
18800 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
18810 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
18820 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
18830 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
18840 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
18850 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
18860 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
18870 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
18880 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18890 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
188a0 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
188b0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
188c0 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
188d0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
188e0 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
188f0 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
18900 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
18910 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  ePage,          
18920 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
18930 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
18940 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  to */.  int isCo
18950 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
18960 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61   /* isCommit fla
18970 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  g passed to sqli
18980 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
18990 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
189a0 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
189b0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
189c0 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
189d0 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
189e0 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
189f0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
18a00 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
18a10 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
18a20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
18a30 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
18a40 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
18a50 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
18a60 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
18a70 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
18a80 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
18a90 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
18aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
18ab0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
18ac0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
18ad0 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
18ae0 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20  >pBt==pBt );..  
18af0 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
18b00 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
18b10 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
18b20 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
18b30 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
18b40 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
18b50 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
18b60 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
18b70 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
18b80 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
18b90 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
18ba0 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
18bb0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
18bc0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
18bd0 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
18be0 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
18bf0 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
18c00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18c10 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
18c20 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
18c30 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
18c40 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
18c50 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
18c60 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
18c70 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
18c80 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
18c90 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
18ca0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
18cb0 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
18cc0 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
18cd0 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
18ce0 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
18cf0 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
18d00 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
18d10 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
18d20 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
18d30 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
18d40 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
18d50 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
18d60 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
18d70 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
18d80 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
18d90 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
18da0 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
18db0 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
18dc0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
18dd0 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
18de0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
18df0 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
18e00 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
18e10 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
18e20 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
18e30 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
18e40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18e50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
18e60 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
18e70 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
18e80 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
18e90 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
18ea0 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
18eb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  =0 ){.      ptrm
18ec0 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
18ed0 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
18ee0 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
18ef0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
18f00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18f10 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
18f20 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
18f30 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
18f40 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
18f50 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
18f60 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
18f70 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
18f80 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
18f90 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
18fa0 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
18fb0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
18fc0 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
18fd0 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
18fe0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
18ff0 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
19000 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
19010 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
19020 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
19030 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19040 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
19050 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
19060 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19070 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
19080 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
19090 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
190a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
190b0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
190c0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
190d0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
190e0 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
190f0 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
19100 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
19110 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
19120 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
19130 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
19140 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19150 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
19160 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
19170 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
19180 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
19190 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
191a0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
191b0 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
191c0 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
191d0 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
191e0 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
191f0 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
19200 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
19210 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
19220 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
19230 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
19240 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
19250 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
19260 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a  essful, return.*
19270 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  * SQLITE_OK. If 
19280 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
19290 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
192a0 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69  efore no point i
192b0 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68  n .** calling th
192c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
192d0 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n), return SQLIT
192e0 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61  E_DONE. Or, if a
192f0 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  n error .** occu
19300 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20  rs, return some 
19310 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
19320 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
19330 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20  cifically, this 
19340 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
19350 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
19360 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f   the database so
19370 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61   .** that the la
19380 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
19390 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
193a0 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   use is no longe
193b0 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
193c0 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69  Parameter nFin i
193d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
193e0 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20  pages that this 
193f0 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63  database would c
19400 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74  ontain.** were t
19410 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
19420 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74  led until it ret
19430 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
19440 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
19450 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72  Commit parameter
19460 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
19470 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
19480 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  mes that the .**
19490 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
194a0 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
194b0 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
194c0 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
194d0 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61  TE_DONE .** or a
194e0 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74  n error. bCommit
194f0 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20   is passed true 
19500 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
19510 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a  um-on-commit .**
19520 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66   operation, or f
19530 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72  alse for an incr
19540 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
19550 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
19560 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
19570 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
19580 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73   nFin, Pgno iLas
19590 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  tPg, int bCommit
195a0 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  ){.  Pgno nFreeL
195b0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
195c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
195d0 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
195e0 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ree-list */.  in
195f0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
19600 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
19610 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
19620 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61  );.  assert( iLa
19630 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20  stPg>nFin );..  
19640 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41  if( !PTRMAP_ISPA
19650 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
19660 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e   && iLastPg!=PEN
19670 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
19680 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54  Bt) ){.    u8 eT
19690 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
196a0 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
196b0 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
196c0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
196d0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
196e0 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
196f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
19700 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
19710 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
19720 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
19730 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
19740 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
19750 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19760 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
19770 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
19780 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
19790 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
197a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
197b0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
197c0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
197d0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
197e0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
197f0 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
19800 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
19810 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
19820 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
19830 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
19840 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
19850 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69   ** if bCommit i
19860 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
19870 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
19880 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
19890 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
198a0 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
198b0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
198c0 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
198d0 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
198e0 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
198f0 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
19900 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
19910 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
19920 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
19930 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
19940 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
19950 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
19960 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
19970 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
19980 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
19990 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  , BTALLOC_EXACT)
199a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
199b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
199c0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
199d0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
199e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
199f0 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
19a00 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
19a10 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
19a20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
19a30 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
19a40 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
19a50 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
19a60 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
19a70 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
19a80 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
19a90 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75  pLastPg;.      u
19aa0 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f  8 eMode = BTALLO
19ab0 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65  C_ANY;   /* Mode
19ac0 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
19ad0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
19ae0 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f  () */.      Pgno
19af0 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20   iNear = 0;     
19b00 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20        /* nearby 
19b10 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
19b20 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
19b30 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) */..      rc =
19b40 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
19b50 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
19b60 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
19b70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19b80 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
19b90 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
19ba0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f  .      /* If bCo
19bb0 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  mmit is zero, th
19bc0 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
19bd0 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
19be0 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
19bf0 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
19c00 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
19c10 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
19c20 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
19c30 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
19c40 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
19c50 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69   hand, if bCommi
19c60 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
19c70 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
19c80 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
19c90 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
19ca0 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
19cb0 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
19cc0 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
19cd0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
19ce0 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
19cf0 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
19d00 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
19d10 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
19d20 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65  _LE;.        iNe
19d30 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20  ar = nFin;.     
19d40 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20   }.      do {.  
19d50 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
19d60 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
19d70 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
19d80 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
19d90 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
19da0 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  iNear, eMode);. 
19db0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
19dc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19dd0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
19de0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
19df0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
19e00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19e10 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
19e20 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
19e30 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26  while( bCommit &
19e40 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
19e50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19e60 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
19e70 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
19e80 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
19e90 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
19ea0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
19eb0 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69   iFreePg, bCommi
19ec0 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  t);.      releas
19ed0 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
19ee0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
19ef0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19f00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19f10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19f20 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d  .  if( bCommit==
19f30 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  0 ){.    do {.  
19f40 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
19f50 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74     }while( iLast
19f60 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
19f70 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54  _PAGE(pBt) || PT
19f80 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
19f90 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20   iLastPg) );.   
19fa0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
19fb0 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e  e = 1;.    pBt->
19fc0 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b  nPage = iLastPg;
19fd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
19fe0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
19ff0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f  * The database o
1a000 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72  pened by the fir
1a010 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
1a020 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
1a030 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20  tabase.** nOrig 
1a040 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f  pages in size co
1a050 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66  ntaining nFree f
1a060 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72  ree pages. Retur
1a070 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  n the expected .
1a080 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ** size of the d
1a090 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73  atabase in pages
1a0a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75   following an au
1a0b0 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74  to-vacuum operat
1a0c0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ion..*/.static P
1a0d0 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  gno finalDbSize(
1a0e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
1a0f0 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20  gno nOrig, Pgno 
1a100 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45  nFree){.  int nE
1a110 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  ntry;           
1a120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a130 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
1a140 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67  n one ptrmap pag
1a150 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72  e */.  Pgno nPtr
1a160 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  map;            
1a170 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1a180 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
1a190 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1a1a0 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1a1d0 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d  e */..  nEntry =
1a1e0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1a1f0 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20  /5;.  nPtrmap = 
1a200 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
1a210 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
1a220 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e  nOrig)+nEntry)/n
1a230 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20  Entry;.  nFin = 
1a240 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
1a250 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e  nPtrmap;.  if( n
1a260 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
1a270 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
1a280 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45  Fin<PENDING_BYTE
1a290 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1a2a0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20    nFin--;.  }.  
1a2b0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
1a2c0 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20  PAGE(pBt, nFin) 
1a2d0 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47  || nFin==PENDING
1a2e0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1a2f0 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
1a300 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69   }..  return nFi
1a310 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  n;.}../*.** A wr
1a320 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1a330 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
1a340 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
1a350 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
1a360 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
1a370 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
1a380 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
1a390 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
1a3a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
1a3b0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1a3c0 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
1a3d0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1a3e0 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
1a3f0 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
1a400 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
1a410 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
1a420 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
1a430 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
1a440 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1a450 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
1a460 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
1a470 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1a480 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
1a490 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1a4a0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1a4b0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
1a4c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1a4d0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
1a4e0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1a4f0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
1a500 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
1a510 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
1a520 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
1a530 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
1a540 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1a550 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1a560 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1a570 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1a580 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74  Pgno nFree = get
1a590 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1a5a0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1a5b0 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
1a5c0 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
1a5d0 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
1a5e0 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e  .    if( nOrig<n
1a5f0 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Fin ){.      rc 
1a600 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1a610 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
1a620 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a   if( nFree>0 ){.
1a630 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
1a640 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1a650 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1a660 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a670 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
1a680 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1a690 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  che(pBt);.      
1a6a0 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
1a6b0 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
1a6c0 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20   nOrig, 0);.    
1a6d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1a6e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a6f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1a700 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1a710 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1a720 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
1a730 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1a740 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
1a750 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1a760 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1a770 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1a780 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
1a790 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1a7a0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1a7b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1a7c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1a7d0 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
1a7e0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1a7f0 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
1a800 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
1a810 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  tted for an auto
1a820 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1a830 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1a840 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1a850 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20  , then *pnTrunc 
1a860 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
1a870 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
1a880 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a890 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  le should be tru
1a8a0 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67  ncated to during
1a8b0 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
1a8c0 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68  ess. .** i.e. th
1a8d0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
1a8e0 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20  een reorganized 
1a8f0 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65  so that only the
1a900 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a   first *pnTrunc.
1a910 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20  ** pages are in 
1a920 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
1a930 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d  nt autoVacuumCom
1a940 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  mit(BtShared *pB
1a950 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1a960 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1a970 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
1a980 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f  >pPager;.  VVA_O
1a990 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20  NLY( int nRef = 
1a9a0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1a9b0 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
1a9c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1a9d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1a9e0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
1a9f0 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
1aa00 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
1aa10 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75    assert(pBt->au
1aa20 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28  toVacuum);.  if(
1aa30 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75   !pBt->incrVacuu
1aa40 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  m ){.    Pgno nF
1aa50 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  in;         /* N
1aa60 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1aa70 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  n database after
1aa80 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a   autovacuuming *
1aa90 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  /.    Pgno nFree
1aaa0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
1aab0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
1aac0 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74  he freelist init
1aad0 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e  ially */.    Pgn
1aae0 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20  o iFree;        
1aaf0 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65  /* The next page
1ab00 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1ab10 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20      Pgno nOrig; 
1ab20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1ab30 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66  se size before f
1ab40 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e  reeing */..    n
1ab50 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1ab60 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1ab70 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
1ab80 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c  E(pBt, nOrig) ||
1ab90 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f   nOrig==PENDING_
1aba0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1abb0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
1abc0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
1abd0 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61   create a databa
1abe0 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  se for which the
1abf0 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20   final page.    
1ac00 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61    ** is either a
1ac10 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1ac20 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67  e or the pending
1ac30 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f  -byte page. If o
1ac40 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ne.      ** is e
1ac50 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73  ncountered, this
1ac60 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75   indicates corru
1ac70 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ption..      */.
1ac80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1ac90 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1aca0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72  ;.    }..    nFr
1acb0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1acc0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1acd0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e  a[36]);.    nFin
1ace0 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
1acf0 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
1ad00 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e  );.    if( nFin>
1ad10 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
1ad20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1ad30 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  PT;.    if( nFin
1ad40 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  <nOrig ){.      
1ad50 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1ad60 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1ad70 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46      }.    for(iF
1ad80 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65  ree=nOrig; iFree
1ad90 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c  >nFin && rc==SQL
1ada0 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29  ITE_OK; iFree--)
1adb0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
1adc0 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
1add0 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29   nFin, iFree, 1)
1ade0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1adf0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
1ae00 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
1ae10 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b  K) && nFree>0 ){
1ae20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1ae30 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1ae40 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1ae50 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
1ae60 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1ae70 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
1ae80 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1ae90 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1aea0 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20  ata[36], 0);.   
1aeb0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1aec0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1aed0 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  28], nFin);.    
1aee0 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
1aef0 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42  te = 1;.      pB
1af00 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b  t->nPage = nFin;
1af10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1af20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1af30 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1af40 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
1af50 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
1af60 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73   assert( nRef>=s
1af70 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
1af80 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
1af90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1afa0 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
1afb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1afc0 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
1afd0 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
1afe0 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
1aff0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1b000 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
1b010 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
1b020 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
1b030 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
1b040 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
1b050 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1b060 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
1b070 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
1b080 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
1b090 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
1b0a0 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
1b0b0 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
1b0c0 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
1b0d0 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
1b0e0 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
1b0f0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
1b100 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
1b110 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
1b120 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
1b130 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
1b140 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
1b150 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
1b160 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
1b170 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
1b180 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
1b190 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
1b1a0 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
1b1b0 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
1b1c0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
1b1d0 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
1b1e0 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
1b1f0 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
1b200 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
1b210 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
1b220 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
1b230 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
1b240 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
1b250 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
1b260 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1b270 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
1b280 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
1b290 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1b2a0 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
1b2b0 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
1b2c0 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
1b2d0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
1b2e0 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
1b2f0 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
1b300 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
1b310 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
1b320 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
1b330 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
1b340 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1b350 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
1b360 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
1b370 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
1b380 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
1b390 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
1b3a0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
1b3b0 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
1b3c0 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
1b3d0 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
1b3e0 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
1b3f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1b400 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
1b410 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
1b420 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
1b430 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
1b440 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1b450 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
1b460 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
1b470 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
1b480 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
1b490 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
1b4a0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
1b4b0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
1b4c0 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
1b4d0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
1b4e0 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
1b4f0 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
1b500 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
1b510 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
1b520 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
1b530 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
1b540 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
1b550 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1b560 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
1b570 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
1b580 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
1b590 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1b5a0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1b5b0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
1b5c0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1b5d0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
1b5e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1b5f0 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
1b600 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1b610 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
1b620 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1b630 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
1b640 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
1b650 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1b660 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b670 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b680 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
1b690 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1b6a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1b6b0 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  f( pBt->bDoTrunc
1b6c0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ate ){.      sql
1b6d0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
1b6e0 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
1b6f0 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  er, pBt->nPage);
1b700 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1b710 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1b720 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1b730 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
1b740 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
1b750 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1b760 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
1b770 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b780 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1b790 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74   called from bot
1b7a0 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  h BtreeCommitPha
1b7b0 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65  seTwo() and Btre
1b7c0 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61  eRollback().** a
1b7d0 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
1b7e0 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
1b7f0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1b800 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61  d btreeEndTransa
1b810 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b  ction(Btree *p){
1b820 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1b830 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
1b840 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
1b850 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1b860 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
1b870 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65  ex(p) );..#ifnde
1b880 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1b890 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e  TOVACUUM.  pBt->
1b8a0 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b  bDoTruncate = 0;
1b8b0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
1b8c0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1b8d0 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65  ONE && db->nVdbe
1b8e0 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  Read>1 ){.    /*
1b8f0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   If there are ot
1b900 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65  her active state
1b910 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e  ments that belon
1b920 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  g to this databa
1b930 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  se.    ** handle
1b940 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61  , downgrade to a
1b950 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
1b960 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65  action. The othe
1b970 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  r statements.   
1b980 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65   ** may still be
1b990 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
1b9a0 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  e database.  */.
1b9b0 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c      downgradeAll
1b9c0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1b9d0 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d  Locks(p);.    p-
1b9e0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1b9f0 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
1ba00 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61      /* If the ha
1ba10 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e  ndle had any kin
1ba20 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
1ba30 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
1ba40 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61   the .    ** tra
1ba50 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f  nsaction count o
1ba60 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
1ba70 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
1ba80 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20  action count .  
1ba90 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20    ** reaches 0, 
1baa0 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
1bab0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
1bac0 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
1bad0 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20  reeIfUnused().  
1bae0 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20    ** call below 
1baf0 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
1bb00 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69  pager.  */.    i
1bb10 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
1bb20 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
1bb30 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
1bb40 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
1bb50 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  (p);.      pBt->
1bb60 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
1bb70 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74        if( 0==pBt
1bb80 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
1bb90 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  {.        pBt->i
1bba0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
1bbb0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  RANS_NONE;.     
1bbc0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1bbd0 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
1bbe0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
1bbf0 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
1bc00 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
1bc10 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66  .    ** pager if
1bc20 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
1bc30 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
1bc40 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
1bc50 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d  tion.  */.    p-
1bc60 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1bc70 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63  _NONE;.    unloc
1bc80 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1bc90 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
1bca0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
1bcb0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
1bcc0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1bcd0 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
1bce0 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
1bcf0 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
1bd00 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
1bd10 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
1bd20 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
1bd30 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
1bd40 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
1bd50 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
1bd60 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
1bd70 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
1bd80 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
1bd90 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
1bda0 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
1bdb0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1bdc0 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
1bdd0 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
1bde0 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
1bdf0 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
1be00 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
1be10 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
1be20 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
1be30 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
1be40 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
1be50 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
1be60 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
1be70 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
1be80 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
1be90 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
1bea0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
1beb0 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
1bec0 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
1bed0 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
1bee0 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
1bef0 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  cks..**.** Norma
1bf00 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
1bf10 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
1bf20 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73  e pager layer is
1bf30 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a   attempting to .
1bf40 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** finalize the 
1bf50 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e  underlying journ
1bf60 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75  al file, this fu
1bf70 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
1bf80 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74  n error and.** t
1bf90 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
1bfa0 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f  ill attempt a ro
1bfb0 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c  llback. However,
1bfc0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
1bfd0 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f  rgument.** is no
1bfe0 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73  n-zero then this
1bff0 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74   b-tree transact
1c000 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61  ion is part of a
1c010 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20   multi-file .** 
1c020 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20  transaction. In 
1c030 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74  this case, the t
1c040 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
1c050 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d  lready been comm
1c060 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65  itted .** (by de
1c070 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  leting a master 
1c080 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
1c090 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  d the caller wil
1c0a0 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a  l ignore this .*
1c0b0 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  * functions retu
1c0c0 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65  rn code. So, eve
1c0d0 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
1c0e0 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65  curs in the page
1c0f0 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65  r layer,.** rese
1c100 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  t the b-tree obj
1c110 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74  ects internal st
1c120 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ate to indicate 
1c130 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a  that the write.*
1c140 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  * transaction ha
1c150 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54  s been closed. T
1c160 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66  his is quite saf
1c170 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20  e, as the pager 
1c180 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61  will have.** tra
1c190 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65  nsitioned to the
1c1a0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
1c1b0 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
1c1c0 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
1c1d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1c1e0 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
1c1f0 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
1c200 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
1c210 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
1c220 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
1c230 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1c240 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1c250 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62  (Btree *p, int b
1c260 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28  Cleanup){..  if(
1c270 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1c280 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  NS_NONE ) return
1c290 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
1c2a0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1c2b0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
1c2c0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
1c2d0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
1c2e0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1c2f0 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
1c300 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
1c310 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
1c320 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
1c330 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
1c340 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
1c350 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
1c360 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1c370 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
1c380 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1c390 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1c3a0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1c3b0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1c3c0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
1c3d0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
1c3e0 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
1c3f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1c400 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
1c410 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
1c420 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c430 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75  TE_OK && bCleanu
1c440 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
1c450 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1c460 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
1c470 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
1c480 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1c490 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
1c4a0 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61      btreeClearHa
1c4b0 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
1c4c0 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
1c4d0 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
1c4e0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1c4f0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
1c500 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1c510 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65  ** Do both phase
1c520 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a  s of a commit..*
1c530 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1c540 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a  eeCommit(Btree *
1c550 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
1c560 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1c570 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r(p);.  rc = sql
1c580 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1c590 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20  haseOne(p, 0);. 
1c5a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c5b0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1c5c0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1c5d0 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b  tPhaseTwo(p, 0);
1c5e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
1c5f0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1c600 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c610 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c620 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74  sets the state t
1c630 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61  o CURSOR_FAULT a
1c640 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  nd the error.** 
1c650 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20  code to errCode 
1c660 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72  for every cursor
1c670 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64   on any BtShared
1c680 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
1c690 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20  references.  Or 
1c6a0 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  if the writeOnly
1c6b0 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
1c6c0 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20  1, then only.** 
1c6d0 74 72 69 70 20 77 72 69 74 65 20 63 75 72 73 6f  trip write curso
1c6e0 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61  rs and leave rea
1c6f0 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e  d cursors unchan
1c700 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ged..**.** Every
1c710 20 63 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e   cursor is a can
1c720 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 72 69  didate to be tri
1c730 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pped, including 
1c740 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20  cursors.** that 
1c750 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20  belong to other 
1c760 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1c770 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e  ions that happen
1c780 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e   to be.** sharin
1c790 67 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68  g the cache with
1c7a0 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54   pBtree..**.** T
1c7b0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73  his routine gets
1c7c0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
1c7d0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20  ollback occurs. 
1c7e0 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  If the writeOnly
1c7f0 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
1c800 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
1c810 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62  e-cursors need b
1c820 65 20 74 72 69 70 70 65 64 20 2d 20 72 65 61 64  e tripped - read
1c830 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73  -only.** cursors
1c840 20 73 61 76 65 20 74 68 65 69 72 20 63 75 72 72   save their curr
1c850 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f  ent positions so
1c860 20 74 68 61 74 20 74 68 65 79 20 6d 61 79 20 63   that they may c
1c870 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c  ontinue .** foll
1c880 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  owing the rollba
1c890 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65  ck. Or, if write
1c8a0 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61  Only is false, a
1c8b0 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a  ll cursors are .
1c8c0 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67  ** tripped. In g
1c8d0 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c  eneral, writeOnl
1c8e0 79 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  y is false if th
1c8f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
1c900 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  ing.** rolled ba
1c910 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20  ck modified the 
1c920 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
1c930 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d   In this case b-
1c940 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67  tree root.** pag
1c950 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20  es may be moved 
1c960 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  or deleted from 
1c970 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 74  the database alt
1c980 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a  ogether, making.
1c990 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72  ** it unsafe for
1c9a0 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f   read cursors to
1c9b0 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a   continue..**.**
1c9c0 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   If the writeOnl
1c9d0 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 61  y flag is true a
1c9e0 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  nd an error is e
1c9f0 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65  ncountered while
1ca00 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20   .** saving the 
1ca10 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
1ca20 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   of a read-only 
1ca30 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73  cursor, all curs
1ca40 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69  ors, .** includi
1ca50 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73  ng all read-curs
1ca60 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64 2e  ors are tripped.
1ca70 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1ca80 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1ca90 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69  successful, or i
1caa0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1cab0 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e  s while.** savin
1cac0 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74  g a cursor posit
1cad0 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ion, an SQLite e
1cae0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e  rror code..*/.in
1caf0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  t sqlite3BtreeTr
1cb00 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72  ipAllCursors(Btr
1cb10 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20  ee *pBtree, int 
1cb20 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69  errCode, int wri
1cb30 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  teOnly){.  BtCur
1cb40 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63  sor *p;.  int rc
1cb50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1cb60 20 61 73 73 65 72 74 28 20 28 77 72 69 74 65 4f   assert( (writeO
1cb70 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f  nly==0 || writeO
1cb80 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f  nly==1) && BTCF_
1cb90 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a  WriteFlag==1 );.
1cba0 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
1cbb0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1cbc0 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
1cbd0 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d     for(p=pBtree-
1cbe0 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
1cbf0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
1cc00 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1cc10 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20    if( writeOnly 
1cc20 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  && (p->curFlags 
1cc30 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
1cc40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1cc50 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
1cc60 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
1cc70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61           rc = sa
1cc80 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
1cc90 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  (p);.          i
1cca0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ccb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ccc0 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72  (void)sqlite3Btr
1ccd0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1cce0 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b  (pBtree, rc, 0);
1ccf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1cd00 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
1cd10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cd20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1cd30 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1cd40 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20  Cursor(p);.     
1cd50 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
1cd60 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20  URSOR_FAULT;.   
1cd70 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74       p->skipNext
1cd80 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
1cd90 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
1cda0 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20  0; i<=p->iPage; 
1cdb0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 65  i++){.        re
1cdc0 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50  leasePage(p->apP
1cdd0 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  age[i]);.       
1cde0 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20   p->apPage[i] = 
1cdf0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1ce00 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1ce10 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1ce20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1ce30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
1ce40 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
1ce50 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  on in progress..
1ce60 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64  **.** If tripCod
1ce70 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  e is not SQLITE_
1ce80 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20  OK then cursors 
1ce90 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61  will be invalida
1cea0 74 65 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a  ted (tripped)..*
1ceb0 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72  * Only write cur
1cec0 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64  sors are tripped
1ced0 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
1cee0 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75   true but all cu
1cef0 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69  rsors are.** tri
1cf00 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
1cf10 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79  y is false.  Any
1cf20 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a   attempt to use.
1cf30 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63 75 72  ** a tripped cur
1cf40 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  sor will result 
1cf50 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
1cf60 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
1cf70 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1cf80 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1cf90 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
1cfa0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1cfb0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
1cfc0 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
1cfd0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
1cfe0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1cff0 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
1d000 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  *p, int tripCode
1d010 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29  , int writeOnly)
1d020 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
1d030 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1d040 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
1d050 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65  *pPage1;..  asse
1d060 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31  rt( writeOnly==1
1d070 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30   || writeOnly==0
1d080 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72   );.  assert( tr
1d090 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41  ipCode==SQLITE_A
1d0a0 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c  BORT_ROLLBACK ||
1d0b0 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
1d0c0 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65  E_OK );.  sqlite
1d0d0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1d0e0 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d    if( tripCode==
1d0f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d100 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d   rc = tripCode =
1d110 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
1d120 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
1d130 69 66 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e  if( rc ) writeOn
1d140 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ly = 0;.  }else{
1d150 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1d160 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  _OK;.  }.  if( t
1d170 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69  ripCode ){.    i
1d180 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  nt rc2 = sqlite3
1d190 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
1d1a0 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c  ors(p, tripCode,
1d1b0 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20   writeOnly);.   
1d1c0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1d1d0 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65  ITE_OK || (write
1d1e0 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d  Only==0 && rc2==
1d1f0 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20  SQLITE_OK) );.  
1d200 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
1d210 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
1d220 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65  .  }.  btreeInte
1d230 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28  grity(p);..  if(
1d240 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1d250 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1d260 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73  int rc2;..    as
1d270 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
1d280 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
1d290 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
1d2a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
1d2b0 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
1d2c0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
1d2d0 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
1d2e0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
1d2f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
1d300 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
1d310 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
1d320 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
1d330 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
1d340 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50  * call btreeGetP
1d350 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
1d360 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
1d370 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
1d380 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
1d390 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
1d3a0 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67   if( btreeGetPag
1d3b0 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
1d3c0 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, 0)==SQLITE_OK
1d3d0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
1d3e0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
1d3f0 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
1d400 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73  Data);.      tes
1d410 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20  tcase( nPage==0 
1d420 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  );.      if( nPa
1d430 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50  ge==0 ) sqlite3P
1d440 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1d450 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
1d460 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1d470 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  se( pBt->nPage!=
1d480 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70  nPage );.      p
1d490 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
1d4a0 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  e;.      release
1d4b0 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
1d4c0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1d4d0 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
1d4e0 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a  s(pBt, 1)==0 );.
1d4f0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1d500 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
1d510 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
1d520 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
1d530 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1d540 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1d550 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1d560 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1d570 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d580 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
1d590 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
1d5a0 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
1d5b0 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c  ction can be rol
1d5c0 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65  led.** back inde
1d5d0 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
1d5e0 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
1d5f0 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  n. You must star
1d600 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
1d610 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74  .** before start
1d620 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
1d630 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
1d640 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
1d650 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
1d660 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20  .** if the main 
1d670 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
1d680 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
1d690 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  k..**.** Stateme
1d6a0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
1d6b0 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
1d6c0 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
1d6d0 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
1d6e0 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
1d6f0 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
1d700 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
1d710 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
1d720 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
1d730 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
1d740 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
1d750 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
1d760 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
1d770 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1d780 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1d790 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
1d7a0 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
1d7b0 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65  n..**.** A state
1d7c0 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63  ment sub-transac
1d7d0 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
1d7e0 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d  ted as an anonym
1d7f0 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54  ous savepoint. T
1d800 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73  he.** value pass
1d810 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1d820 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
1d830 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1d840 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a  f savepoints,.**
1d850 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
1d860 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  ew anonymous sav
1d870 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20  epoint, open on 
1d880 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e  the B-Tree. i.e.
1d890 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
1d8a0 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70   no active savep
1d8b0 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  oints and no oth
1d8c0 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  er statement-tra
1d8d0 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a  nsactions open,.
1d8e0 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73  ** iStatement is
1d8f0 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f   1. This anonymo
1d900 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  us savepoint can
1d910 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20   be released or 
1d920 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75  rolled back.** u
1d930 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
1d940 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29  BtreeSavepoint()
1d950 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
1d960 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
1d970 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
1d980 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74  , int iStatement
1d990 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1d9a0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1d9b0 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
1d9c0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1d9d0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
1d9e0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1d9f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
1da00 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1da10 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30  TS_READ_ONLY)==0
1da20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1da30 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
1da40 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
1da50 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  nt>p->db->nSavep
1da60 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  oint );.  assert
1da70 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1da80 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1da90 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65  E );.  /* At the
1daa0 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20   pager level, a 
1dab0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1dac0 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70  ction is a savep
1dad0 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61  oint with.  ** a
1dae0 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
1daf0 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69  than all savepoi
1db00 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c  nts created expl
1db10 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a  icitly using.  *
1db20 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
1db30 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  . It is illegal 
1db40 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65  to open, release
1db50 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79   or rollback any
1db60 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70  .  ** such savep
1db70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20  oints while the 
1db80 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1db90 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
1dba0 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a  is active..  */.
1dbb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1dbc0 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
1dbd0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53  (pBt->pPager, iS
1dbe0 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c  tatement);.  sql
1dbf0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1dc00 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1dc10 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  }../*.** The sec
1dc20 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
1dc30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  this function, o
1dc40 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56  p, is always SAV
1dc50 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a  EPOINT_ROLLBACK.
1dc60 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  ** or SAVEPOINT_
1dc70 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75  RELEASE. This fu
1dc80 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65  nction either re
1dc90 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20  leases or rolls 
1dca0 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65  back the.** save
1dcb0 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64  point identified
1dcc0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53   by parameter iS
1dcd0 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64  avepoint, depend
1dce0 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  ing on the value
1dcf0 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a   .** of op..**.*
1dd00 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76  * Normally, iSav
1dd10 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
1dd20 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
1dd30 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72  to zero. However
1dd40 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41  , if op is.** SA
1dd50 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1dd60 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e  , then iSavepoin
1dd70 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31  t may also be -1
1dd80 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
1dd90 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
1dda0 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  of the entire tr
1ddb0 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f  ansaction are ro
1ddc0 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
1ddd0 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  is different.** 
1dde0 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72  from a normal tr
1ddf0 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
1de00 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20  ck, as no locks 
1de10 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64  are released and
1de20 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
1de30 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e  ion remains open
1de40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1de50 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42  BtreeSavepoint(B
1de60 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  tree *p, int op,
1de70 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
1de80 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1de90 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
1dea0 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
1deb0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1dec0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1ded0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
1dee0 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
1def0 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
1df00 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
1df10 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  LBACK );.    ass
1df20 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
1df30 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e  =0 || (iSavepoin
1df40 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56  t==-1 && op==SAV
1df50 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
1df60 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
1df70 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1df80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1df90 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
1dfa0 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
1dfb0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  avepoint);.    i
1dfc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dfd0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53   ){.      if( iS
1dfe0 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70  avepoint<0 && (p
1dff0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1e000 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1e010 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  TY)!=0 ){.      
1e020 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30    pBt->nPage = 0
1e030 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e040 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1e050 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74  (pBt);.      pBt
1e060 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  ->nPage = get4by
1e070 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61  te(28 + pBt->pPa
1e080 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ge1->aData);..  
1e090 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1e0a0 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69  ase size was wri
1e0b0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66  tten into the of
1e0c0 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68  fset 28 of the h
1e0d0 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  eader.      ** w
1e0e0 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
1e0f0 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20  ion started, so 
1e100 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
1e110 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74   value at offset
1e120 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20  .      ** 28 is 
1e130 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20  nonzero. */.    
1e140 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
1e150 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Page>0 );.    }.
1e160 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1e170 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
1e180 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e190 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1e1a0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1e1b0 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
1e1c0 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
1e1d0 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
1e1e0 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
1e1f0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
1e200 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1e210 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
1e220 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
1e230 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
1e240 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1e250 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
1e260 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
1e270 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
1e280 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
1e290 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
1e2a0 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
1e2b0 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
1e2c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1e2d0 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
1e2e0 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
1e2f0 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
1e300 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
1e310 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
1e320 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1e330 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
1e340 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
1e350 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
1e360 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
1e370 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
1e380 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
1e390 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
1e3a0 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
1e3b0 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
1e3c0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
1e3d0 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
1e3e0 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
1e3f0 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
1e400 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
1e410 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
1e420 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
1e430 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
1e440 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
1e450 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
1e460 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
1e470 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
1e480 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
1e490 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
1e4a0 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
1e4b0 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
1e4c0 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
1e4d0 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
1e4e0 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
1e4f0 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
1e500 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
1e510 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
1e520 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
1e530 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
1e540 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
1e550 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
1e560 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
1e570 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
1e580 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
1e590 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
1e5a0 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
1e5b0 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
1e5c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1e5d0 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
1e5e0 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
1e5f0 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
1e600 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
1e610 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
1e620 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
1e630 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
1e640 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
1e650 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
1e660 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
1e670 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
1e680 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
1e690 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1e6a0 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e  rZero() has been
1e6b0 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43   called.** on pC
1e6c0 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ur to initialize
1e6d0 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63   the memory spac
1e6e0 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  e prior to invok
1e6f0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1e700 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e710 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
1e720 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
1e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e740 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
1e750 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
1e760 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1e770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e780 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
1e790 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
1e7a0 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7c0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1e7d0 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1e7e0 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1e7f0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1e800 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1e810 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1e820 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1e830 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
1e840 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1e850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e860 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
1e870 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
1e880 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1e890 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
1e8a0 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1e8b0 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   b-tree handle *
1e8c0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
1e8d0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1e8e0 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1e8f0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1e900 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20   wrFlag==1 );.. 
1e910 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1e920 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
1e930 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
1e940 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
1e950 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
1e960 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
1e970 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
1e980 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
1e990 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
1e9a0 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
1e9b0 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
1e9c0 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
1e9d0 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
1e9e0 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
1e9f0 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
1ea00 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
1ea10 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1ea20 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
1ea30 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61  eyInfo!=0, wrFla
1ea40 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  g+1) );.  assert
1ea50 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
1ea60 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
1ea70 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
1ea80 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
1ea90 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1eaa0 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
1eab0 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
1eac0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
1ead0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1eae0 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
1eaf0 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
1eb00 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1eb10 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
1eb20 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
1eb30 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
1eb40 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e  Data );..  if( N
1eb50 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20 28  EVER(wrFlag && (
1eb60 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1eb70 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1eb80 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1eb90 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1eba0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 72 46 6c  ;.  }.  if( wrFl
1ebb0 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61  ag ){.    alloca
1ebc0 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
1ebd0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
1ebe0 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  TmpSpace==0 ) re
1ebf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1ec00 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  M;.  }.  if( iTa
1ec10 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
1ec20 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
1ec30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1ec40 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  wrFlag==0 );.   
1ec50 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d   iTable = 0;.  }
1ec60 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
1ec70 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
1ec80 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
1ec90 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
1eca0 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
1ecb0 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
1ecc0 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
1ecd0 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
1ece0 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
1ecf0 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
1ed00 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
1ed10 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
1ed20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
1ed30 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
1ed40 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
1ed50 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
1ed60 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
1ed70 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d  ag==0 || wrFlag=
1ed80 3d 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20  =BTCF_WriteFlag 
1ed90 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  );.  pCur->curFl
1eda0 61 67 73 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20  ags = wrFlag;.  
1edb0 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
1edc0 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  t->pCursor;.  if
1edd0 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
1ede0 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  .    pCur->pNext
1edf0 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a  ->pPrev = pCur;.
1ee00 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73    }.  pBt->pCurs
1ee10 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
1ee20 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1ee30 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65  OR_INVALID;.  re
1ee40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ee50 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
1ee60 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
1ee70 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
1eea0 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
1eeb0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eed0 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
1eee0 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
1eef0 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
1ef00 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
1ef30 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
1ef40 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
1ef50 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef70 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
1ef80 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
1ef90 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1efc0 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72  Write new cursor
1efd0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
1efe0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1eff0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1f000 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
1f010 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c  (p, iTable, wrFl
1f020 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
1f030 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ur);.  sqlite3Bt
1f040 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1f050 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f060 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
1f070 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
1f080 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
1f090 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
1f0a0 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
1f0b0 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
1f0c0 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
1f0d0 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
1f0e0 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
1f0f0 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
1f100 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
1f110 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
1f120 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
1f130 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
1f140 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
1f150 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
1f160 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
1f170 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
1f180 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1f190 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
1f1a0 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73   return ROUND8(s
1f1b0 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
1f1c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
1f1d0 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61  alize memory tha
1f1e0 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  t will be conver
1f1f0 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72  ted into a BtCur
1f200 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  sor object..**.*
1f210 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70  * The simple app
1f220 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64  roach here would
1f230 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20   be to memset() 
1f240 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63  the entire objec
1f250 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42  t.** to zero.  B
1f260 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20  ut it turns out 
1f270 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b  that the apPage[
1f280 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72  ] and aiIdx[] ar
1f290 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e  rays.** do not n
1f2a0 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64  eed to be zeroed
1f2b0 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61   and they are la
1f2c0 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  rge, so we can s
1f2d0 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20  ave a lot.** of 
1f2e0 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70  run-time by skip
1f2f0 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
1f300 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65  ization of those
1f310 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f   elements..*/.vo
1f320 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
1f330 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73  ursorZero(BtCurs
1f340 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  or *p){.  memset
1f350 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28  (p, 0, offsetof(
1f360 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29  BtCursor, iPage)
1f370 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
1f380 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
1f390 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
1f3a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f3b0 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
1f3c0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
1f3d0 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
1f3e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1f3f0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
1f400 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1f410 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
1f420 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
1f430 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
1f440 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
1f450 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
1f460 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
1f470 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1f480 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69  Btree);.    sqli
1f490 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
1f4a0 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69  sor(pCur);.    i
1f4b0 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29  f( pCur->pPrev )
1f4c0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50  {.      pCur->pP
1f4d0 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
1f4e0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
1f4f0 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  lse{.      pBt->
1f500 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
1f510 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
1f520 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
1f530 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1f540 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
1f550 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  Cur->pPrev;.    
1f560 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
1f570 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
1f580 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
1f590 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
1f5a0 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  age[i]);.    }. 
1f5b0 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
1f5c0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
1f5d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
1f5e0 42 74 72 65 65 2d 3e 64 62 2c 20 70 43 75 72 2d  Btree->db, pCur-
1f5f0 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20  >aOverflow);.   
1f600 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65   /* sqlite3_free
1f610 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73  (pCur); */.    s
1f620 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1f630 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
1f640 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f650 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1f660 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f  sure the BtCurso
1f670 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  r* given in the 
1f680 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76  argument has a v
1f690 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72  alid.** BtCursor
1f6a0 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  .info structure.
1f6b0 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61    If it is not a
1f6c0 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61  lready valid, ca
1f6d0 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  ll.** btreeParse
1f6e0 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69  Cell() to fill i
1f6f0 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75  t in..**.** BtCu
1f700 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63  rsor.info is a c
1f710 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f  ache of the info
1f720 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63  rmation in the c
1f730 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20  urrent cell..** 
1f740 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65  Using this cache
1f750 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d   reduces the num
1f760 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20  ber of calls to 
1f770 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
1f780 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d  ..**.** 2007-06-
1f790 32 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20  25:  There is a 
1f7a0 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73  bug in some vers
1f7b0 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61  ions of MSVC tha
1f7c0 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63  t cause the.** c
1f7d0 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68  ompiler to crash
1f7e0 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66   when getCellInf
1f7f0 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  o() is implement
1f800 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a  ed as a macro..*
1f810 2a 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61  * But there is a
1f820 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65   measureable spe
1f830 65 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20  ed advantage to 
1f840 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20  using the macro 
1f850 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20  on gcc.** (when 
1f860 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70  less compiler op
1f870 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65  timizations like
1f880 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20   -Os or -O0 are 
1f890 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  used and the.** 
1f8a0 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20  compiler is not 
1f8b0 64 6f 69 6e 67 20 61 67 67 72 65 73 73 69 76 65  doing aggressive
1f8c0 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20   inlining.)  So 
1f8d0 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66 75  we use a real fu
1f8e0 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53  nction.** for MS
1f8f0 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66  VC and a macro f
1f900 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c  or everything el
1f910 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35  se.  Ticket #245
1f920 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  7..*/.#ifndef ND
1f930 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
1f940 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  id assertCellInf
1f950 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
1f960 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
1f970 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50  info;.    int iP
1f980 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
1f990 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  e;.    memset(&i
1f9a0 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  nfo, 0, sizeof(i
1f9b0 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65  nfo));.    btree
1f9c0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
1f9d0 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70  apPage[iPage], p
1f9e0 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
1f9f0 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  ], &info);.    a
1fa00 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
1fa10 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66  B || memcmp(&inf
1fa20 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
1fa30 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
1fa40 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
1fa50 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
1fa60 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
1fa70 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52  .#ifdef _MSC_VER
1fa80 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c  .  /* Use a real
1fa90 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56   function in MSV
1faa0 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  C to work around
1fab0 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f   bugs in that co
1fac0 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61  mpiler. */.  sta
1fad0 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  tic void getCell
1fae0 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
1faf0 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43  Cur){.    if( pC
1fb00 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
1fb10 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
1fb20 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
1fb30 67 65 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50  ge;.      btreeP
1fb40 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
1fb50 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
1fb60 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
1fb70 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
1fb80 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
1fb90 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
1fba0 4e 4b 65 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NKey;.    }else{
1fbb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c  .      assertCel
1fbc0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
1fbd0 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20   }.  }.#else /* 
1fbe0 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20  if not _MSC_VER 
1fbf0 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61  */.  /* Use a ma
1fc00 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72  cro in all other
1fc10 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68   compilers so th
1fc20 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  at the function 
1fc30 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64  is inlined */.#d
1fc40 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66  efine getCellInf
1fc50 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20  o(pCur)         
1fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc80 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1fc90 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1fca0 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20  nSize==0 ){     
1fcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1fce0 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1fcf0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20  pCur->iPage;    
1fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1fd30 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
1fd40 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
1fd50 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69  [iPage],pCur->ai
1fd60 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72  Idx[iPage],&pCur
1fd70 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20 20 20 20  ->info);        
1fd80 5c 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46  \.    pCur->curF
1fd90 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
1fda0 69 64 4e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  idNKey;         
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdd0 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20   \.  }else{     
1fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65    \.    assertCe
1fe30 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20  llInfo(pCur);   
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe70 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20     \.  }.#endif 
1fe80 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a  /* _MSC_VER */..
1fe90 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20  #ifndef NDEBUG  
1fea0 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74  /* The next rout
1feb0 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69  ine used only wi
1fec0 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
1fed0 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a  atements */./*.*
1fee0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1fef0 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72   the given BtCur
1ff00 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41  sor is valid.  A
1ff10 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73   valid cursor is
1ff20 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20   one.** that is 
1ff30 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
1ff40 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61  ng to a row in a
1ff50 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62   (non-empty) tab
1ff60 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  le..** This is a
1ff70 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f   verification ro
1ff80 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e  utine is used on
1ff90 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
1ffa0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
1ffb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1ffc0 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
1ffd0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1ffe0 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26  .  return pCur &
1fff0 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  & pCur->eState==
20000 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
20010 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47  #endif /* NDEBUG
20020 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a   */../*.** Set *
20030 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  pSize to the siz
20040 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
20050 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74  needed to hold t
20060 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  he value of.** t
20070 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63  he key for the c
20080 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49  urrent entry.  I
20090 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
200a0 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  not pointing.** 
200b0 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
200c0 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  , *pSize is set 
200d0 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  to 0. .**.** For
200e0 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
200f0 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65  e INTKEY flag se
20100 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
20110 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a  returns the key.
20120 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74  ** itself, not t
20130 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
20140 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a  es in the key..*
20150 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
20160 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68  must position th
20170 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74  e cursor prior t
20180 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  o invoking this 
20190 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20  routine..** .** 
201a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
201b0 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c  not fail.  It al
201c0 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c  ways returns SQL
201d0 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74  ITE_OK.  .*/.int
201e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
201f0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
20200 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  Cur, i64 *pSize)
20210 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
20220 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
20230 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
20240 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
20250 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
20260 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
20270 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
20280 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
20290 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
202a0 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30  {.    *pSize = 0
202b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67  ;.  }else{.    g
202c0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
202d0 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70  ;.    *pSize = p
202e0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
202f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
20300 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
20310 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
20320 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
20330 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  es of data in th
20340 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63  e entry the.** c
20350 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
20360 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a  points to..**.**
20370 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
20380 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
20390 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
203a0 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d  inting to a non-
203b0 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e  NULL.** valid en
203c0 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  try.  In other w
203d0 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ords, the callin
203e0 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74  g procedure must
203f0 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68   guarantee.** th
20400 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  at the cursor ha
20410 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d  s Cursor.eState=
20420 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a  =CURSOR_VALID..*
20430 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20  *.** Failure is 
20440 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 54  not possible.  T
20450 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
20460 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
20470 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67  TE_OK..** It mig
20480 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20  ht just as well 
20490 62 65 20 61 20 70 72 6f 63 65 64 75 72 65 20 28  be a procedure (
204a0 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29 20  returning void) 
204b0 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a  but we continue.
204c0 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ** to return an 
204d0 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20 63  integer result c
204e0 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69 63  ode for historic
204f0 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69  al reasons..*/.i
20500 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
20510 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72  ataSize(BtCursor
20520 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69   *pCur, u32 *pSi
20530 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ze){.  assert( c
20540 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
20550 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
20560 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
20570 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
20580 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
20590 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
205a0 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  age]->intKeyLeaf
205b0 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  ==1 );.  getCell
205c0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70  Info(pCur);.  *p
205d0 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
205e0 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  o.nPayload;.  re
205f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20600 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
20610 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
20620 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
20630 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
20640 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
20650 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
20660 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
20670 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
20680 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
20690 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
206a0 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
206b0 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
206c0 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
206d0 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
206e0 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
206f0 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
20700 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
20710 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
20720 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
20730 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
20740 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
20750 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
20760 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
20770 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  ** The page numb
20780 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  er of the next o
20790 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
207a0 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
207b0 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  is .** written t
207c0 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66  o *pPgnoNext. If
207d0 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68   page ovfl is th
207e0 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69  e last page in i
207f0 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69  ts linked .** li
20800 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69  st, *pPgnoNext i
20810 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a  s set to zero. .
20820 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20  **.** If ppPage 
20830 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
20840 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
20850 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
20860 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
20870 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  .** to page numb
20880 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74  er pOvfl was obt
20890 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50  ained, then *ppP
208a0 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f  age is set to po
208b0 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72  int to that.** r
208c0 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20  eference. It is 
208d0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
208e0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
208f0 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
20900 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70  Page().** on *pp
20910 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65  Page to free the
20920 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e   reference. In n
20930 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
20940 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73  obtained (becaus
20950 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  e.** the pointer
20960 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f  -map was used to
20970 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75   obtain the valu
20980 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74  e for *pPgnoNext
20990 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61  ), then.** *ppPa
209a0 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ge is set to zer
209b0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
209c0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
209d0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
209e0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
209f0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
20a00 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
20a10 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
20a20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
20a30 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
20a40 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d   number */.  Mem
20a50 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
20a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
20a70 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65  : MemPage handle
20a80 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a   (may be NULL) *
20a90 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e  /.  Pgno *pPgnoN
20aa0 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
20ab0 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76   /* OUT: Next ov
20ac0 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
20ad0 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  er */.){.  Pgno 
20ae0 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  next = 0;.  MemP
20af0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
20b00 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20b10 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
20b20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
20b30 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
20b40 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e  );.  assert(pPgn
20b50 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66  oNext);..#ifndef
20b60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
20b70 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79  OVACUUM.  /* Try
20b80 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78   to find the nex
20b90 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
20ba0 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e  erflow list usin
20bb0 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76  g the.  ** autov
20bc0 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61  acuum pointer-ma
20bd0 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74  p pages. Guess t
20be0 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67  hat the next pag
20bf0 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f  e in .  ** the o
20c00 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20  verflow list is 
20c10 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66  page number (ovf
20c20 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75  l+1). If that gu
20c30 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20  ess turns .  ** 
20c40 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c  out to be wrong,
20c50 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f   fall back to lo
20c60 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f  ading the data o
20c70 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d  f page .  ** num
20c80 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65  ber ovfl to dete
20c90 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70  rmine the next p
20ca0 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f  age number..  */
20cb0 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
20cc0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
20cd0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e  no pgno;.    Pgn
20ce0 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b  o iGuess = ovfl+
20cf0 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  1;.    u8 eType;
20d00 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52  ..    while( PTR
20d10 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
20d20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73  iGuess) || iGues
20d30 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  s==PENDING_BYTE_
20d40 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
20d50 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20     iGuess++;.   
20d60 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65   }..    if( iGue
20d70 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75  ss<=btreePagecou
20d80 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
20d90 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
20da0 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54  pBt, iGuess, &eT
20db0 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20  ype, &pgno);.   
20dc0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20dd0 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50  E_OK && eType==P
20de0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
20df0 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b  && pgno==ovfl ){
20e00 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20  .        next = 
20e10 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20  iGuess;.        
20e20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
20e30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20e40 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
20e50 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c  sert( next==0 ||
20e60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
20e70 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
20e80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
20e90 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
20ea0 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
20eb0 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20  ge, (ppPage==0) 
20ec0 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
20ed0 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61  ONLY : 0);.    a
20ee0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
20ef0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
20f00 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
20f10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20f20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
20f30 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
20f40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
20f50 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
20f60 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29  ;.  if( ppPage )
20f70 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
20f80 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pPage;.  }else{.
20f90 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
20fa0 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
20fb0 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
20fc0 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f  _DONE ? SQLITE_O
20fd0 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  K : rc);.}../*.*
20fe0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
20ff0 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70   a buffer to a p
21000 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70  age, or from a p
21010 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e  age to a buffer.
21020 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20  .**.** pPayload 
21030 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
21040 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64  data stored on d
21050 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
21060 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75  Page..** If argu
21070 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73  ment eOp is fals
21080 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79  e, then nByte by
21090 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20  tes of data are 
210a0 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70  copied.** from p
210b0 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62  Payload to the b
210c0 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74  uffer pointed at
210d0 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70   by pBuf. If eOp
210e0 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65   is true,.** the
210f0 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
21100 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
21110 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e  on pDbPage and n
21120 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Byte bytes.** of
21130 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
21140 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
21150 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61   pBuf to pPayloa
21160 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
21170 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
21180 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72  n success, other
21190 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  wise an error co
211a0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
211b0 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20  t copyPayload(. 
211c0 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c   void *pPayload,
211d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
211e0 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61  inter to page da
211f0 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  ta */.  void *pB
21200 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
21210 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
21220 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
21230 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
21240 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21250 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79  of bytes to copy
21260 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20   */.  int eOp,  
21270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21280 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f  /* 0 -> copy fro
21290 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70  m page, 1 -> cop
212a0 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44  y to page */.  D
212b0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20  bPage *pDbPage  
212c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
212d0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79   containing pPay
212e0 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  load */.){.  if(
212f0 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43   eOp ){.    /* C
21300 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75  opy data from bu
21310 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20  ffer to page (a 
21320 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29  write operation)
21330 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
21340 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
21350 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
21360 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21370 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
21380 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
21390 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
213a0 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
213b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
213c0 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70  Copy data from p
213d0 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61  age to buffer (a
213e0 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29   read operation)
213f0 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   */.    memcpy(p
21400 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e  Buf, pPayload, n
21410 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Byte);.  }.  ret
21420 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
21430 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
21440 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
21450 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69   read or overwri
21460 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  te payload infor
21470 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68  mation.** for th
21480 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
21490 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
214a0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65  pointing to. The
214b0 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   eOp.** argument
214c0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
214d0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
214e0 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61  *   0: The opera
214f0 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20  tion is a read. 
21500 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
21510 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20  rflow cache..** 
21520 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69    1: The operati
21530 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20 50  on is a write. P
21540 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
21550 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20  flow cache..**  
21560 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   2: The operatio
21570 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44 6f 20  n is a read. Do 
21580 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74 68 65  not populate the
21590 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
215a0 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
215b0 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
215c0 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
215d0 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
215e0 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
215f0 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
21600 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
21610 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  Buf..**.** The c
21620 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61  ontent being rea
21630 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67  d or written mig
21640 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ht appear on the
21650 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72   main page.** or
21660 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75   be scattered ou
21670 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76  t on multiple ov
21680 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
21690 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
216a0 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  nt cursor entry 
216b0 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
216c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
216d0 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20 61  and the.** eOp a
216e0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 32  rgument is not 2
216f0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
21700 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  may allocate spa
21710 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
21720 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 73 20  y .** populates 
21730 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
21740 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72 72  e-list cache arr
21750 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
21760 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62  erflow). .** Sub
21770 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73  sequent calls us
21780 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f 20  e this cache to 
21790 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20  make seeking to 
217a0 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66  the supplied off
217b0 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66  set .** more eff
217c0 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  icient..**.** On
217d0 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce an overflow p
217e0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
217f0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
21800 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20  d, it may be.** 
21810 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73  invalidated if s
21820 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  ome other cursor
21830 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73   writes to the s
21840 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66  ame table, or if
21850 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
21860 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66  s moved to a dif
21870 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69  ferent row. Addi
21880 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74  tionally, in aut
21890 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65  o-vacuum.** mode
218a0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
218b0 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c  events may inval
218c0 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f  idate an overflo
218d0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
218e0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20  e..**.**   * An 
218f0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
21900 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d  um,.**   * A com
21910 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75  mit in auto_vacu
21920 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a  um="full" mode,.
21930 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20  **   * Creating 
21940 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71  a table (may req
21950 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f  uire moving an o
21960 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a  verflow page)..*
21970 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63  /.static int acc
21980 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  essPayload(.  Bt
21990 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
219a0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
219b0 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
219c0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
219d0 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
219e0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
219f0 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
21a00 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
21a10 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20    u32 amt,      
21a20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
21a30 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
21a40 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
21a50 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
21a60 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
21a70 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
21a80 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
21a90 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
21aa0 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
21ab0 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
21ac0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
21ad0 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
21ae0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21af0 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  K;.  int iIdx = 
21b00 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
21b10 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
21b20 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
21b30 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
21b40 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
21b50 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
21b60 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20  Bt = pCur->pBt; 
21b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b80 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
21b90 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
21ba0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
21bb0 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
21bc0 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65  W_READ.  unsigne
21bd0 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70  d char * const p
21be0 42 75 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b  BufStart = pBuf;
21bf0 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20 20 20  .  int bEnd;    
21c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21c20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e 67 20  True if reading 
21c30 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61 20 2a  to end of data *
21c40 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
21c50 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
21c60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
21c70 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
21c80 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
21c90 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
21ca0 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
21cb0 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
21cc0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
21cd0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
21ce0 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c 7c 20  sert( eOp!=2 || 
21cf0 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  offset==0 );    
21d00 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72 74 20  /* Always start 
21d10 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20 66  from beginning f
21d20 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20  or eOp==2 */..  
21d30 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
21d40 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
21d50 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
21d60 6f 61 64 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  oad;.#ifdef SQLI
21d70 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
21d80 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64 20 3d  OW_READ.  bEnd =
21d90 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70 43 75   offset+amt==pCu
21da0 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
21db0 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
21dc0 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d  t( offset+amt <=
21dd0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79   pCur->info.nPay
21de0 6c 6f 61 64 20 29 3b 0a 0a 20 20 69 66 28 20 26  load );..  if( &
21df0 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
21e00 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70  nfo.nLocal] > &p
21e10 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
21e20 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a  >usableSize] ){.
21e30 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
21e40 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
21e50 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
21e60 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
21e70 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ror */.    retur
21e80 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
21e90 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
21ea0 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
21eb0 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
21ec0 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
21ed0 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
21ee0 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
21ef0 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
21f00 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
21f10 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
21f20 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
21f30 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
21f40 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
21f50 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
21f60 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
21f70 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
21f80 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
21f90 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70  ], pBuf, a, (eOp
21fa0 20 26 20 30 78 30 31 29 2c 20 70 50 61 67 65 2d   & 0x01), pPage-
21fb0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
21fc0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
21fd0 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
21fe0 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
21ff0 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
22000 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
22010 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
22020 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
22030 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
22040 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
22050 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
22060 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
22070 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
22080 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
22090 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
220a0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
220b0 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
220c0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
220d0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
220e0 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
220f0 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62  flow[] has not b
22100 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
22110 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a  llocate it now..
22120 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64      ** Except, d
22130 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61  o not allocate a
22140 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20 65  Overflow[] for e
22150 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20 20  Op==2..    **.  
22160 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c    ** The aOverfl
22170 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69  ow[] array is si
22180 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79  zed at one entry
22190 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c   for each overfl
221a0 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69  ow page.    ** i
221b0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
221c0 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e  hain. The page n
221d0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
221e0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
221f0 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65   is.    ** store
22200 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30  d in aOverflow[0
22210 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20  ], etc. A value 
22220 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65  of 0 in the aOve
22230 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20  rflow[] array.  
22240 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20    ** means "not 
22250 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20  yet known" (the 
22260 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20  cache is lazily 
22270 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20  populated)..    
22280 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 21 3d  */.    if( eOp!=
22290 32 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46  2 && (pCur->curF
222a0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
222b0 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  dOvfl)==0 ){.   
222c0 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28     int nOvfl = (
222d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
222e0 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad-pCur->info.n
222f0 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31  Local+ovflSize-1
22300 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  )/ovflSize;.    
22310 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72    if( nOvfl>pCur
22320 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a  ->nOvflAlloc ){.
22330 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e          Pgno *aN
22340 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69  ew = (Pgno*)sqli
22350 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 0a 20 20  te3DbRealloc(.  
22360 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
22370 70 42 74 72 65 65 2d 3e 64 62 2c 20 70 43 75 72  pBtree->db, pCur
22380 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76  ->aOverflow, nOv
22390 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f  fl*2*sizeof(Pgno
223a0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
223b0 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
223c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
223d0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
223e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
223f0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
22400 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76  nOvflAlloc = nOv
22410 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20  fl*2;.          
22420 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
22430 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
22440 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
22450 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22460 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  K ){.        mem
22470 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  set(pCur->aOverf
22480 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69  low, 0, nOvfl*si
22490 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20  zeof(Pgno));.   
224a0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
224b0 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
224c0 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  dOvfl;.      }. 
224d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
224e0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
224f0 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
22500 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
22510 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65  and the.    ** e
22520 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
22530 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
22540 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
22550 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20  id, skip.    ** 
22560 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
22570 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
22580 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
22590 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
225a0 21 3d 30 0a 20 20 20 20 20 26 26 20 70 43 75 72  !=0.     && pCur
225b0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
225c0 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20  et/ovflSize].   
225d0 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d   ){.      iIdx =
225e0 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a   (offset/ovflSiz
225f0 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61  e);.      nextPa
22600 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
22610 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
22620 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73    offset = (offs
22630 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et%ovflSize);.  
22640 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20    }..    for( ; 
22650 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22660 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61   amt>0 && nextPa
22670 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20  ge; iIdx++){..  
22680 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
22690 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
226a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
226b0 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
226c0 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
226d0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
226e0 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a  alidOvfl)!=0 ){.
226f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
22700 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
22710 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61  iIdx] || pCur->a
22720 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
22730 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
22740 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
22750 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
22760 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  age;.      }..  
22770 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d      if( offset>=
22780 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
22790 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
227a0 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74  reason to read t
227b0 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f  his page is to o
227c0 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20  btain the page. 
227d0 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
227e0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61   for the next pa
227f0 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
22800 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
22810 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ge.        ** da
22820 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ta is not requir
22830 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79  ed. So first try
22840 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f   to lookup the o
22850 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
22860 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ** page-list cac
22870 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e  he, if any, then
22880 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
22890 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  e getOverflowPag
228a0 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  e().        ** f
228b0 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  unction..       
228c0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e   **.        ** N
228d0 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 4f 76  ote that the aOv
228e0 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d  erflow[] array m
228f0 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
22900 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32 0a   because eOp!=2.
22910 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65 2e          ** here.
22920 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68 65    If eOp==2, the
22930 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64 20  n offset==0 and 
22940 74 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 6e  this branch is n
22950 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20 20  ever taken..    
22960 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
22970 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29 3b  ssert( eOp!=2 );
22980 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
22990 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
229a0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
229b0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
229c0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
229d0 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20  iIdx+1] ){.     
229e0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
229f0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
22a00 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20  iIdx+1];.       
22a10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22a20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
22a30 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74  owPage(pBt, next
22a40 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61  Page, 0, &nextPa
22a50 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
22a60 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
22a70 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
22a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22a90 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
22aa0 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
22ab0 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
22ac0 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
22ad0 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
22ae0 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
22af0 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
22b00 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
22b10 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
22b20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
22b30 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
22b40 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69  EAD.        sqli
22b50 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65  te3_file *fd;.#e
22b60 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74  ndif.        int
22b70 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
22b80 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
22b90 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
22ba0 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
22bb0 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
22bc0 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65          }..#ifde
22bd0 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
22be0 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
22bf0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
22c00 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
22c10 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20  e true:.        
22c20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
22c30 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65 61  1) this is a rea
22c40 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64  d operation, and
22c50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32   .        **   2
22c60 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69 72  ) data is requir
22c70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  ed from the star
22c80 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c  t of this overfl
22c90 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20  ow page, and.   
22ca0 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65       **   3) the
22cb0 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c   database is fil
22cc0 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20  e-backed, and.  
22cd0 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68        **   4) th
22ce0 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77  ere is no open w
22cf0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
22d00 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
22d10 20 20 20 35 29 20 74 68 65 20 64 61 74 61 62 61     5) the databa
22d20 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20  se is not a WAL 
22d30 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20  database,.      
22d40 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64 61    **   6) all da
22d50 74 61 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ta from the page
22d60 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 2e 0a   is being read..
22d70 20 20 20 20 20 20 20 20 2a 2a 20 20 20 37 29 20          **   7) 
22d80 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73  at least 4 bytes
22d90 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
22da0 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65  en read into the
22db0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 0a   output buffer .
22dc0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
22dd0 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20     ** then data 
22de0 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65  can be read dire
22df0 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
22e00 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f  tabase file into
22e10 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
22e20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20 62  output buffer, b
22e30 79 70 61 73 73 69 6e 67 20 74 68 65 20 70 61 67  ypassing the pag
22e40 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68  e-cache altogeth
22e50 65 72 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a  er. This speeds.
22e60 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f          ** up lo
22e70 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f  ading large reco
22e80 72 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61  rds that span ma
22e90 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
22ea0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
22eb0 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 26 30        if( (eOp&0
22ec0 78 30 31 29 3d 3d 30 20 20 20 20 20 20 20 20 20  x01)==0         
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22ef0 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (1) */.         
22f00 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20  && offset==0    
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f30 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a        /* (2) */.
22f40 20 20 20 20 20 20 20 20 20 26 26 20 28 62 45 6e           && (bEn
22f50 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65  d || a==ovflSize
22f60 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22f80 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (6) */.       
22f90 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e    && pBt->inTran
22fa0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52  saction==TRANS_R
22fb0 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20  EAD             
22fc0 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a          /* (4) *
22fd0 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 66  /.         && (f
22fe0 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
22ff0 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
23000 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20  ))->pMethods    
23010 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20   /* (3) */.     
23020 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50 61 67      && pBt->pPag
23030 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30  e1->aData[19]==0
23040 78 30 31 20 20 20 20 20 20 20 20 20 20 20 20 20  x01             
23050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29            /* (5)
23060 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
23070 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53  &pBuf[-4]>=pBufS
23080 74 61 72 74 20 20 20 20 20 20 20 20 20 20 20 20  tart            
23090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230a0 20 20 20 2f 2a 20 28 37 29 20 2a 2f 0a 20 20 20     /* (7) */.   
230b0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
230c0 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20    u8 aSave[4];. 
230d0 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 57 72           u8 *aWr
230e0 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b  ite = &pBuf[-4];
230f0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
23100 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53  t( aWrite>=pBufS
23110 74 61 72 74 20 29 3b 20 20 20 20 20 20 20 20 20  tart );         
23120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23130 2f 2a 20 68 65 6e 63 65 20 28 37 29 20 2a 2f 0a  /* hence (7) */.
23140 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
23150 28 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20  (aSave, aWrite, 
23160 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  4);.          rc
23170 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
23180 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34  (fd, aWrite, a+4
23190 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65  , (i64)pBt->page
231a0 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31  Size*(nextPage-1
231b0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65  ));.          ne
231c0 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
231d0 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20  e(aWrite);.     
231e0 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69       memcpy(aWri
231f0 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20  te, aSave, 4);. 
23200 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
23210 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20  dif..        {. 
23220 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20           DbPage 
23230 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20  *pDbPage;.      
23240 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23250 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74  PagerAcquire(pBt
23260 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
23270 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20  ge, &pDbPage,.  
23280 20 20 20 20 20 20 20 20 20 20 20 20 28 28 65 4f              ((eO
23290 70 26 30 78 30 31 29 3d 3d 30 20 3f 20 50 41 47  p&0x01)==0 ? PAG
232a0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
232b0 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29  : 0).          )
232c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
232d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
232e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61  .            aPa
232f0 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50  yload = sqlite3P
23300 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
23310 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
23320 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
23330 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
23340 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
23350 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
23360 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34  Payload[offset+4
23370 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70  ], pBuf, a, (eOp
23380 26 30 78 30 31 29 2c 20 70 44 62 50 61 67 65 29  &0x01), pDbPage)
23390 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
233a0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
233b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
233c0 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30        offset = 0
233d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
233e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
233f0 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
23400 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
23410 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
23420 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23430 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
23440 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23450 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
23460 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
23470 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
23480 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61  art of the key a
23490 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
234a0 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
234b0 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
234c0 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
234d0 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75  sferred into pBu
234e0 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
234f0 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
23500 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
23510 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
23520 65 6e 73 75 72 65 20 74 68 61 74 20 70 43 75 72  ensure that pCur
23530 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
23540 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69  a valid row.** i
23550 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  n the table..**.
23560 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
23570 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
23580 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
23590 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
235a0 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
235b0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
235c0 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
235d0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
235e0 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
235f0 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
23600 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
23610 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
23620 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
23630 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
23640 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
23650 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
23660 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
23670 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
23680 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
23690 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
236a0 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
236b0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
236c0 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
236d0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
236e0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
236f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23700 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
23710 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
23720 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
23730 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
23740 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30  ed char*)pBuf, 0
23750 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
23760 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
23770 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
23780 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
23790 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
237a0 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
237b0 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70  ransfered into p
237c0 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
237d0 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
237e0 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
237f0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
23800 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
23810 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
23820 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
23830 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
23840 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
23850 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
23860 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
23870 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
23880 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
23890 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
238a0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
238b0 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
238c0 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
238d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  ){.  int rc;..#i
238e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
238f0 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20  T_INCRBLOB.  if 
23900 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
23910 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
23920 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
23930 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23  ITE_ABORT;.  }.#
23940 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
23950 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
23960 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
23970 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
23980 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
23990 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
239a0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
239b0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
239c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
239d0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
239e0 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
239f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23a00 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61  >iPage] );.    a
23a10 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
23a20 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
23a30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23a40 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
23a50 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63   );.    rc = acc
23a60 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
23a70 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42   offset, amt, pB
23a80 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
23a90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23aa0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
23ab0 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
23ac0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
23ad0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
23ae0 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
23af0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
23b00 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
23b10 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
23b20 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
23b30 20 69 66 20 69 6e 64 65 78 20 62 74 72 65 65 73   if index btrees
23b40 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d   (pPage->intKey=
23b50 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65 20 64  =0) and is the d
23b60 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65  ata for.** table
23b70 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
23b80 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20  intKey==1). The 
23b90 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
23ba0 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  of available.** 
23bb0 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74  key/data is writ
23bc0 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20  ten into *pAmt. 
23bd0 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68   If *pAmt==0, th
23be0 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  en the value.** 
23bf0 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f  returned will no
23c00 74 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69  t be a valid poi
23c10 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
23c20 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f   routine is an o
23c30 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74  ptimization.  It
23c40 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74   is common for t
23c50 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a  he entire key.**
23c60 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74   and data to fit
23c70 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
23c80 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65  ge and for there
23c90 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c   to be no overfl
23ca0 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68  ow.** pages.  Wh
23cb0 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74  en that is so, t
23cc0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
23cd0 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  be used to acces
23ce0 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64  s the.** key and
23cf0 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61   data without ma
23d00 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66  king a copy.  If
23d10 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20   the key and/or 
23d20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f  data spills.** o
23d30 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
23d40 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50  es, then accessP
23d50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65  ayload() must be
23d60 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d   used to reassem
23d70 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64  ble.** the key/d
23d80 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20  ata and copy it 
23d90 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61  into a prealloca
23da0 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  ted buffer..**.*
23db0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
23dc0 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72  turned by this r
23dd0 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72  outine looks dir
23de0 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63  ectly into the c
23df0 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66  ached.** page of
23e00 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
23e10 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63  The data might c
23e20 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68  hange or move th
23e30 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61  e next time.** a
23e40 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65  ny btree routine
23e50 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
23e60 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64  tatic const void
23e70 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a   *fetchPayload(.
23e80 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
23e90 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
23ea0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
23eb0 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
23ec0 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20  */.  u32 *pAmt  
23ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
23ee0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
23ef0 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
23f00 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73   here */.){.  as
23f10 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
23f20 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
23f30 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
23f40 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
23f50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
23f60 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
23f70 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
23f80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
23f90 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
23fa0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
23fb0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
23fc0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
23fd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
23fe0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
23ff0 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
24000 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
24010 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
24020 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
24030 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 2a 70 41  nSize>0 );.  *pA
24040 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  mt = pCur->info.
24050 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e  nLocal;.  return
24060 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e   (void*)pCur->in
24070 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a  fo.pPayload;.}..
24080 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
24090 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
240a0 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
240b0 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
240c0 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
240d0 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
240e0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
240f0 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
24100 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
24110 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
24120 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
24130 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
24140 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
24150 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
24160 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
24170 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
24180 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
24190 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
241a0 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
241b0 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64  utine,.** includ
241c0 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f  ing calls from o
241d0 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61  ther threads aga
241e0 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61  inst the same ca
241f0 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  che..** Hence, a
24200 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
24210 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65  Shared should be
24220 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63   held prior to c
24230 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72  alling.** this r
24240 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
24250 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
24260 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
24270 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
24280 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
24290 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
242a0 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
242b0 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
242c0 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
242d0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46  sqlite3BtreeKeyF
242e0 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
242f0 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
24300 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
24310 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
24320 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64  t);.}.const void
24330 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61   *sqlite3BtreeDa
24340 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  taFetch(BtCursor
24350 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d   *pCur, u32 *pAm
24360 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74  t){.  return fet
24370 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
24380 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pAmt);.}.../*.**
24390 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
243a0 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63   down to a new c
243b0 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
243c0 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74  newPgno argument
243d0 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
243e0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68  number of the ch
243f0 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ild page to move
24400 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   to..**.** This 
24410 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
24420 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
24430 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64  if the page-head
24440 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  er flags field o
24450 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69  f.** the new chi
24460 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74  ld page does not
24470 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73   match the flags
24480 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
24490 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66  rent (i.e..** if
244a0 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20   an intkey page 
244b0 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68  appears to be th
244c0 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f  e parent of a no
244d0 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f  n-intkey page, o
244e0 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29  r.** vice-versa)
244f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24500 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
24510 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
24520 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  newPgno){.  int 
24530 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43  rc;.  int i = pC
24540 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d  ur->iPage;.  Mem
24550 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a  Page *pNewPage;.
24560 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
24570 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20  = pCur->pBt;..  
24580 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
24590 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
245a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
245b0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
245c0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
245d0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c  rt( pCur->iPage<
245e0 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
245f0 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
24600 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
24610 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ;.  if( pCur->iP
24620 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d  age>=(BTCURSOR_M
24630 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20  AX_DEPTH-1) ){. 
24640 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24650 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
24660 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64   }.  rc = getAnd
24670 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
24680 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65  wPgno, &pNewPage
24690 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
246a0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
246b0 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   & BTCF_WriteFla
246c0 67 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45  g)==0 ? PAGER_GE
246d0 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b  T_READONLY : 0);
246e0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
246f0 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61  rn rc;.  pCur->a
24700 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65  pPage[i+1] = pNe
24710 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61  wPage;.  pCur->a
24720 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20  iIdx[i+1] = 0;. 
24730 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a   pCur->iPage++;.
24740 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
24750 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
24760 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
24770 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
24780 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
24790 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e   if( pNewPage->n
247a0 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61  Cell<1 || pNewPa
247b0 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72  ge->intKey!=pCur
247c0 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74  ->apPage[i]->int
247d0 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
247e0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
247f0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
24800 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
24810 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 50 61  ..#if 0./*.** Pa
24820 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e  ge pParent is an
24830 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c   internal (non-l
24840 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20  eaf) tree page. 
24850 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
24860 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70  * asserts that p
24870 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
24880 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68  d is the left-ch
24890 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27  ild if the iIdx'
248a0 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61  th.** cell in pa
248b0 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20  ge pParent. Or, 
248c0 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c  if iIdx is equal
248d0 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
248e0 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73  mber of.** cells
248f0 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61   in pParent, tha
24900 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
24910 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68  hild is the righ
24920 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68  t-child of.** th
24930 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
24940 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72  c void assertPar
24950 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65  entIndex(MemPage
24960 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69   *pParent, int i
24970 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64  Idx, Pgno iChild
24980 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64  ){.  assert( iId
24990 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x<=pParent->nCel
249a0 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d  l );.  if( iIdx=
249b0 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
249c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  ){.    assert( g
249d0 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
249e0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
249f0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
24a00 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73  iChild );.  }els
24a10 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  e{.    assert( g
24a20 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
24a30 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29  (pParent, iIdx))
24a40 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a  ==iChild );.  }.
24a50 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  }.#else.#  defin
24a60 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  e assertParentIn
24a70 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64  dex(x,y,z) .#end
24a80 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
24a90 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20  he cursor up to 
24aa0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
24ab0 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78  .**.** pCur->idx
24ac0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
24ad0 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63  ell index that c
24ae0 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
24af0 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ter.** to the pa
24b00 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  ge we are coming
24b10 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72   from.  If we ar
24b20 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68  e coming from th
24b30 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20  e.** right-most 
24b40 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20  child page then 
24b50 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
24b60 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
24b70 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74  n.** the largest
24b80 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a   cell index..*/.
24b90 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65  static void move
24ba0 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
24bb0 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
24bc0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
24bd0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
24be0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
24bf0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
24c00 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
24c10 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
24c20 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
24c30 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
24c40 61 67 65 5d 20 29 3b 0a 0a 20 20 2f 2a 20 55 50  age] );..  /* UP
24c50 44 41 54 45 3a 20 49 74 20 69 73 20 61 63 74 75  DATE: It is actu
24c60 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 66 6f  ally possible fo
24c70 72 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  r the condition 
24c80 74 65 73 74 65 64 20 62 79 20 74 68 65 20 61 73  tested by the as
24c90 73 65 72 74 0a 20 20 2a 2a 20 62 65 6c 6f 77 20  sert.  ** below 
24ca0 74 6f 20 62 65 20 75 6e 74 72 75 65 20 69 66 20  to be untrue if 
24cb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24cc0 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20 54 68  e is corrupt. Th
24cd0 69 73 20 63 61 6e 20 6f 63 63 75 72 20 69 66 0a  is can occur if.
24ce0 20 20 2a 2a 20 6f 6e 65 20 63 75 72 73 6f 72 20    ** one cursor 
24cf0 68 61 73 20 6d 6f 64 69 66 69 65 64 20 70 61 67  has modified pag
24d00 65 20 70 50 61 72 65 6e 74 20 77 68 69 6c 65 20  e pParent while 
24d10 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  a reference to i
24d20 74 20 69 73 20 68 65 6c 64 20 0a 20 20 2a 2a 20  t is held .  ** 
24d30 62 79 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73  by a second curs
24d40 6f 72 2e 20 57 68 69 63 68 20 63 61 6e 20 6f 6e  or. Which can on
24d50 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 20 73  ly happen if a s
24d60 69 6e 67 6c 65 20 70 61 67 65 20 69 73 20 6c 69  ingle page is li
24d70 6e 6b 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 6d  nked.  ** into m
24d80 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74  ore than one b-t
24d90 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 6e  ree structure in
24da0 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
24db0 61 73 65 2e 20 20 2a 2f 0a 23 69 66 20 30 0a 20  ase.  */.#if 0. 
24dc0 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
24dd0 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ex(.    pCur->ap
24de0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
24df0 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
24e00 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
24e10 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
24e20 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
24e30 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a  age]->pgno.  );.
24e40 23 65 6e 64 69 66 0a 20 20 74 65 73 74 63 61 73  #endif.  testcas
24e50 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
24e60 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20  Cur->iPage-1] > 
24e70 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
24e80 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65  r->iPage-1]->nCe
24e90 6c 6c 20 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65  ll );..  release
24ea0 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
24eb0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
24ec0 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  .  pCur->iPage--
24ed0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
24ee0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
24ef0 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
24f00 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
24f10 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
24f20 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
24f30 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
24f40 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  t to the root pa
24f50 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65  ge of its b-tree
24f60 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
24f70 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68  * If the table h
24f80 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  as a virtual roo
24f90 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t page, then the
24fa0 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
24fb0 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20   to point.** to 
24fc0 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
24fd0 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66   page instead of
24fe0 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
24ff0 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68   page. A table h
25000 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20  as a.** virtual 
25010 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74  root page when t
25020 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
25030 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
25040 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20  cells and a .** 
25050 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67  single child pag
25060 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
25070 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65   happen with the
25080 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74   table rooted at
25090 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49   page 1..**.** I
250a0 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72  f the b-tree str
250b0 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c  ucture is empty,
250c0 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
250d0 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20  e is set to .** 
250e0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20  CURSOR_INVALID. 
250f0 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 63  Otherwise, the c
25100 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20  ursor is set to 
25110 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
25120 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74  st.** cell locat
25130 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28  ed on the root (
25140 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29  or virtual root)
25150 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75   page and the cu
25160 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73  rsor state.** is
25170 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56   set to CURSOR_V
25180 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ALID..**.** If t
25190 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
251a0 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c  urns successfull
251b0 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73  y, it may be ass
251c0 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a  umed that the.**
251d0 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
251e0 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  gs indicate that
251f0 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72   the [virtual] r
25200 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20  oot-page is the 
25210 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e  expected .** kin
25220 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  d of b-tree page
25230 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f   (i.e. if when o
25240 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  pening the curso
25250 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64  r the caller did
25260 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20   not.** specify 
25270 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
25280 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
25290 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
252a0 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e  5 or 0x0D,.** in
252b0 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65  dicating a table
252c0 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74   b-tree, or if t
252d0 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70  he caller did sp
252e0 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
252f0 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68  .** structure th
25300 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
25310 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30  set to 0x02 or 0
25320 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  x0A, indicating 
25330 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72  an index.** b-tr
25340 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ee)..*/.static i
25350 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74  nt moveToRoot(Bt
25360 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
25370 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
25380 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25390 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
253a0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
253b0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
253c0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56  sert( CURSOR_INV
253d0 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45  ALID < CURSOR_RE
253e0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
253f0 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
25400 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52  LID   < CURSOR_R
25410 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
25420 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46  assert( CURSOR_F
25430 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f  AULT   > CURSOR_
25440 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
25450 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
25460 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
25470 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28  ESEEK ){.    if(
25480 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
25490 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
254a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
254b0 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c  r->skipNext!=SQL
254c0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
254d0 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
254e0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
254f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
25500 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
25510 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d    }..  if( pCur-
25520 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  >iPage>=0 ){.   
25530 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50   while( pCur->iP
25540 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61 67  age ) releasePag
25550 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  e(pCur->apPage[p
25560 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a  Cur->iPage--]);.
25570 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72    }else if( pCur
25580 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b  ->pgnoRoot==0 ){
25590 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
255a0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
255b0 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ID;.    return S
255c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
255d0 65 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41  e{.    rc = getA
255e0 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d  ndInitPage(pCur-
255f0 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43  >pBtree->pBt, pC
25600 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
25610 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 0a  Cur->apPage[0],.
25620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25630 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
25640 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   & BTCF_WriteFla
25650 67 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45  g)==0 ? PAGER_GE
25660 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b  T_READONLY : 0);
25670 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
25680 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25690 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
256a0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
256b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
256c0 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
256d0 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  iPage = 0;.  }. 
256e0 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61   pRoot = pCur->a
256f0 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65  pPage[0];.  asse
25700 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d  rt( pRoot->pgno=
25710 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
25720 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72  );..  /* If pCur
25730 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f  ->pKeyInfo is no
25740 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
25750 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65   caller that ope
25760 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a  ned this cursor.
25770 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f    ** expected to
25780 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69   open it on an i
25790 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68  ndex b-tree. Oth
257a0 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49  erwise, if pKeyI
257b0 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c  nfo is.  ** NULL
257c0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70  , the caller exp
257d0 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74  ects a table b-t
257e0 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  ree. If this is 
257f0 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20  not the case,.  
25800 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
25810 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
25820 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  r. .  **.  ** Ea
25830 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  rlier versions o
25840 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64  f SQLite assumed
25850 20 74 68 61 74 20 74 68 69 73 20 74 65 73 74 20   that this test 
25860 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20  could not fail. 
25870 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20   ** if the root 
25880 70 61 67 65 20 77 61 73 20 61 6c 72 65 61 64 79  page was already
25890 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69   loaded when thi
258a0 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
258b0 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a  alled (i.e..  **
258c0 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   if pCur->iPage>
258d0 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20 69 73  =0). But this is
258e0 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64   not so if the d
258f0 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
25900 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75  pted .  ** in su
25910 63 68 20 61 20 77 61 79 20 74 68 61 74 20 70 61  ch a way that pa
25920 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b  ge pRoot is link
25930 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64  ed into a second
25940 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20   b-tree table . 
25950 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65   ** (or the free
25960 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73  list).  */.  ass
25970 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b  ert( pRoot->intK
25980 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e  ey==1 || pRoot->
25990 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69  intKey==0 );.  i
259a0 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74  f( pRoot->isInit
259b0 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b  ==0 || (pCur->pK
259c0 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f  eyInfo==0)!=pRoo
259d0 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  t->intKey ){.   
259e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
259f0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
25a00 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ..  pCur->aiIdx[
25a10 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  0] = 0;.  pCur->
25a20 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
25a30 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
25a40 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
25a50 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  t|BTCF_ValidNKey
25a60 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
25a70 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  ;..  if( pRoot->
25a80 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70  nCell>0 ){.    p
25a90 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
25aa0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
25ab0 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e  lse if( !pRoot->
25ac0 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
25ad0 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66   subpage;.    if
25ae0 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31  ( pRoot->pgno!=1
25af0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
25b00 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
25b10 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74     subpage = get
25b20 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
25b30 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
25b40 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
25b50 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
25b60 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72  SOR_VALID;.    r
25b70 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
25b80 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a  pCur, subpage);.
25b90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
25ba0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
25bb0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a  OR_INVALID;.  }.
25bc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25bd0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
25be0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
25bf0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
25c00 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
25c10 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77  he.** entry to w
25c20 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
25c30 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
25c40 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f  *.** The left-mo
25c50 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f  st leaf is the o
25c60 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c  ne with the smal
25c70 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66  lest key - the f
25c80 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  irst.** in ascen
25c90 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
25ca0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
25cb0 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  Leftmost(BtCurso
25cc0 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
25cd0 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
25ce0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
25cf0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
25d00 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
25d10 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
25d20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25d30 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
25d40 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
25d50 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
25d60 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
25d70 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25d80 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
25d90 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
25da0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
25db0 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
25dc0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
25dd0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
25de0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
25df0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
25e00 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20  Page]));.    rc 
25e10 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
25e20 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
25e30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
25e40 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
25e50 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
25e60 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
25e70 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
25e80 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
25e90 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
25ea0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
25eb0 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
25ec0 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
25ed0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
25ee0 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
25ef0 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
25f00 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
25f10 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
25f20 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
25f30 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
25f40 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
25f50 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
25f60 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
25f70 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
25f80 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
25f90 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
25fa0 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
25fb0 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
25fc0 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
25fd0 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
25fe0 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
25ff0 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
26000 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
26010 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
26020 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
26030 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
26040 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
26050 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
26060 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
26070 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
26080 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26090 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
260a0 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20  hile( !(pPage = 
260b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
260c0 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
260d0 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
260e0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
260f0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
26100 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
26110 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
26120 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
26130 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20  ->nCell;.    rc 
26140 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
26150 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ur, pgno);.    i
26160 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
26170 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61  c;.  }.  pCur->a
26180 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
26190 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ] = pPage->nCell
261a0 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  -1;.  assert( pC
261b0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
261c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
261d0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
261e0 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29   BTCF_ValidNKey)
261f0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
26200 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
26210 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
26220 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
26230 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
26240 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
26250 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
26260 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
26270 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
26280 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
26290 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
262a0 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
262b0 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
262c0 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
262d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
262e0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
262f0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
26300 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
26310 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
26320 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
26330 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
26340 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
26350 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
26360 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
26370 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
26380 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26390 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
263a0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
263b0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
263c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
263d0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
263e0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
263f0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
26400 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
26410 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
26420 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
26430 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
26440 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
26450 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a  ell>0 );.      *
26460 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
26470 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
26480 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
26490 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
264a0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
264b0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
264c0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
264d0 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
264e0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
264f0 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
26500 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
26510 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
26520 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
26530 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
26540 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
26550 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
26560 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
26570 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
26580 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
26590 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a  s){.  int rc;. .
265a0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
265b0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
265c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
265d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
265e0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
265f0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
26600 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
26610 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20   already points 
26620 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
26630 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  y, this is a no-
26640 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52  op. */.  if( CUR
26650 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
26660 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75 72  >eState && (pCur
26670 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
26680 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a  F_AtLast)!=0 ){.
26690 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
266a0 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  BUG.    /* This 
266b0 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20  block serves to 
266c0 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
266d0 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20  e cursor really 
266e0 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20  does point .    
266f0 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ** to the last e
26700 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72  ntry in the b-tr
26710 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ee. */.    int i
26720 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  i;.    for(ii=0;
26730 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b   ii<pCur->iPage;
26740 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
26750 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
26760 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  x[ii]==pCur->apP
26770 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29  age[ii]->nCell )
26780 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
26790 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
267a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43  pCur->iPage]==pC
267b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
267c0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31  >iPage]->nCell-1
267d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
267e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
267f0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20  r->iPage]->leaf 
26800 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  );.#endif.    re
26810 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26820 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
26830 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
26840 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26850 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52  K ){.    if( CUR
26860 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
26870 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
26880 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
26890 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
268a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
268b0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
268c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
268d0 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
268e0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
268f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
26900 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
26910 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
26920 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
26930 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
26940 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
26950 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26960 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
26970 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61  ags |= BTCF_AtLa
26980 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  st;.      }else{
26990 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63  .        pCur->c
269a0 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
269b0 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d  _AtLast;.      }
269c0 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  .   .    }.  }. 
269d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
269e0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
269f0 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
26a00 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
26a10 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a  near the key .**
26a20 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49   specified by pI
26a30 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e  dxKey or intKey.
26a40 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63     Return a succ
26a50 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ess code..**.** 
26a60 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  For INTKEY table
26a70 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61  s, the intKey pa
26a80 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e  rameter is used.
26a90 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75    pIdxKey .** mu
26aa0 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72  st be NULL.  For
26ab0 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70   index tables, p
26ac0 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61  IdxKey is used a
26ad0 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20  nd intKey.** is 
26ae0 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
26af0 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68  f an exact match
26b00 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74   is not found, t
26b10 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
26b20 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74  s always.** left
26b30 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c   pointing at a l
26b40 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77  eaf page which w
26b50 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e  ould hold the en
26b60 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72  try if it.** wer
26b70 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20  e present.  The 
26b80 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69  cursor might poi
26b90 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74  nt to an entry t
26ba0 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66  hat comes.** bef
26bb0 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65  ore or after the
26bc0 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69   key..**.** An i
26bd0 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65  nteger is writte
26be0 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69  n into *pRes whi
26bf0 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  ch is the result
26c00 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67   of.** comparing
26c10 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68   the key with th
26c20 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  e entry to which
26c30 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a   the cursor is .
26c40 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68  ** pointing.  Th
26c50 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
26c60 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e   integer written
26c70 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69   into.** *pRes i
26c80 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
26c90 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20  .**     *pRes<0 
26ca0 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
26cb0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
26cc0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
26cd0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
26ce0 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
26cf0 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
26d00 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74  xKey or if the t
26d10 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a  able is empty.**
26d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d30 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72    and the cursor
26d40 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65   is therefore le
26d50 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68  ft point to noth
26d60 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ing..**.**     *
26d70 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20  pRes==0     The 
26d80 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
26d90 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
26da0 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61               exa
26dc0 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74  ctly matches int
26dd0 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
26de0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20  **     *pRes>0  
26df0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
26e00 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
26e10 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
26e20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
26e30 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74       is larger t
26e40 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
26e50 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71  ey..**.*/.int sq
26e60 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
26e70 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75  Unpacked(.  BtCu
26e80 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
26e90 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
26ea0 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a  or to be moved *
26eb0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
26ec0 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20  rd *pIdxKey, /* 
26ed0 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
26ee0 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b  ey */.  i64 intK
26ef0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
26f00 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65   /* The table ke
26f10 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52  y */.  int biasR
26f20 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
26f30 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73  /* If true, bias
26f40 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74   the search to t
26f50 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
26f60 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
26f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
26f80 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
26f90 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
26fa0 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43  nt rc;.  RecordC
26fb0 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f  ompare xRecordCo
26fc0 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74  mpare;..  assert
26fd0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
26fe0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
26ff0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
27000 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
27010 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
27020 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
27030 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Res );.  assert(
27040 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28   (pIdxKey==0)==(
27050 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
27060 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0) );..  /* If t
27070 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
27080 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20  eady positioned 
27090 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20  at the point we 
270a0 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20  are trying.  ** 
270b0 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e  to move to, then
270c0 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74   just return wit
270d0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77  hout doing any w
270e0 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ork */.  if( pCu
270f0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
27100 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75 72  R_VALID && (pCur
27110 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
27120 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a  F_ValidNKey)!=0.
27130 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61     && pCur->apPa
27140 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20  ge[0]->intKey . 
27150 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
27160 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
27170 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
27180 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
27190 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
271a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
271b0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
271c0 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20  BTCF_AtLast)!=0 
271d0 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  && pCur->info.nK
271e0 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
271f0 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
27200 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
27210 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
27220 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 20  ..  if( pIdxKey 
27230 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  ){.    xRecordCo
27240 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56  mpare = sqlite3V
27250 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70  dbeFindCompare(p
27260 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64  IdxKey);.    pId
27270 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20  xKey->errCode = 
27280 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
27290 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
272a0 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20  rc==1 .         
272b0 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
272c0 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20  ult_rc==0 .     
272d0 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
272e0 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20  default_rc==-1. 
272f0 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
27300 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
27310 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65  e = 0; /* All ke
27320 79 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 20  ys are integers 
27330 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  */.  }..  rc = m
27340 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
27350 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
27360 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
27370 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27380 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
27390 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
273a0 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
273b0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
273c0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
273d0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
273e0 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  age]->isInit );.
273f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27400 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
27410 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
27420 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27430 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
27440 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
27450 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
27460 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  ID ){.    *pRes 
27470 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
27480 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
27490 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
274a0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
274b0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
274c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
274d0 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
274e0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
274f0 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64  ]->intKey || pId
27500 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b  xKey );.  for(;;
27510 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20  ){.    int lwr, 
27520 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20  upr, idx, c;.   
27530 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
27540 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
27550 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
27560 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
27570 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20    u8 *pCell;    
27580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27590 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
275a0 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c   to current cell
275b0 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20   in pPage */..  
275c0 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c    /* pPage->nCel
275d0 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65  l must be greate
275e0 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20  r than zero. If 
275f0 74 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74  this is the root
27600 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65  -page.    ** the
27610 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61   cursor would ha
27620 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20  ve been INVALID 
27630 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66  above and this f
27640 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20  or(;;) loop.    
27650 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74  ** not run. If t
27660 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72  his is not the r
27670 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74  oot-page, then t
27680 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29  he moveToChild()
27690 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
276a0 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  would have alrea
276b0 64 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63  dy detected db c
276c0 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c  orruption. Simil
276d0 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74  arly, pPage must
276e0 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72  .    ** be the r
276f0 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78  ight kind (index
27700 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d   or table) of b-
27710 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72  tree page. Other
27720 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f  wise.    ** a mo
27730 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d  veToChild() or m
27740 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c  oveToRoot() call
27750 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65   would have dete
27760 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e  cted corruption.
27770 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
27780 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
27790 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
277a0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70  Page->intKey==(p
277b0 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20  IdxKey==0) );.  
277c0 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75    lwr = 0;.    u
277d0 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  pr = pPage->nCel
277e0 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l-1;.    assert(
277f0 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c   biasRight==0 ||
27800 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b   biasRight==1 );
27810 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e  .    idx = upr>>
27820 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f  (1-biasRight); /
27830 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69 67 68  * idx = biasRigh
27840 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75  t ? upr : (lwr+u
27850 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43  pr)/2; */.    pC
27860 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27870 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
27880 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f  x;.    if( xReco
27890 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a  rdCompare==0 ){.
278a0 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20        for(;;){. 
278b0 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c         i64 nCell
278c0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65  Key;.        pCe
278d0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
278e0 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67  age, idx) + pPag
278f0 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
27900 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
27910 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29  ge->intKeyLeaf )
27920 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
27930 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65  e( 0x80 <= *(pCe
27940 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20  ll++) ){.       
27950 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d       if( pCell>=
27960 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
27970 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
27980 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
27990 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
279a0 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
279b0 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
279c0 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
279d0 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
279e0 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
279f0 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
27a00 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  x+1;.          i
27a10 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20  f( lwr>upr ){ c 
27a20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20  = -1; break; }. 
27a30 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
27a40 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79   nCellKey>intKey
27a50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
27a60 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
27a70 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
27a80 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61   ){ c = +1; brea
27a90 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
27aa0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
27ab0 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d  sert( nCellKey==
27ac0 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  intKey );.      
27ad0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
27ae0 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
27af0 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  NKey;.          
27b00 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20  pCur->info.nKey 
27b10 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  = nCellKey;.    
27b20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
27b30 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
27b40 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
27b50 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
27b60 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
27b70 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a       lwr = idx;.
27b80 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
27b90 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79   moveto_next_lay
27ba0 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  er;.          }e
27bb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
27bc0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
27bd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
27be0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
27bf0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
27c00 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
27c10 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
27c20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77        assert( lw
27c30 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20  r+upr>=0 );.    
27c40 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75      idx = (lwr+u
27c50 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20  pr)>>1;  /* idx 
27c60 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a  = (lwr+upr)/2; *
27c70 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  /.      }.    }e
27c80 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b  lse{.      for(;
27c90 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ;){.        int 
27ca0 6e 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  nCell;.        p
27cb0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
27cc0 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50  pPage, idx) + pP
27cd0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
27ce0 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  e;..        /* T
27cf0 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f  he maximum suppo
27d00 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69  rted page-size i
27d10 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20 54  s 65536 bytes. T
27d20 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  his means that. 
27d30 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61         ** the ma
27d40 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
27d50 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f  record bytes sto
27d60 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20  red on an index 
27d70 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a  B-Tree.        *
27d80 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20 74  * page is less t
27d90 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73 20  han 16384 bytes 
27da0 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65  and may be store
27db0 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20  d as a 2-byte.  
27dc0 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e        ** varint.
27dd0 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
27de0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74  n is used to att
27df0 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61  empt to avoid pa
27e00 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a  rsing .        *
27e10 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c  * the entire cel
27e20 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f  l by checking fo
27e30 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72  r the cases wher
27e40 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  e the record is 
27e50 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
27e60 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68  ed entirely with
27e70 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  in the b-tree pa
27e80 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67  ge by inspecting
27e90 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20   the first .    
27ea0 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f      ** 2 bytes o
27eb0 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20  f the cell..    
27ec0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e      */.        n
27ed0 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b  Cell = pCell[0];
27ee0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
27ef0 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62  ll<=pPage->max1b
27f00 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  ytePayload ){.  
27f10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
27f20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74  branch runs if t
27f30 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
27f40 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c  ield of the cell
27f50 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20   is a.          
27f60 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76  ** single byte v
27f70 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
27f80 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65  cord fits entire
27f90 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20  ly on the main. 
27fa0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72           ** b-tr
27fb0 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
27fc0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
27fd0 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d   pCell+nCell+1==
27fe0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
27ff0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
28000 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
28010 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
28020 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79  Cell[1], pIdxKey
28030 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
28040 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20   if( !(pCell[1] 
28050 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20  & 0x80) .       
28060 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28     && (nCell = (
28070 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29  (nCell&0x7f)<<7)
28080 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50   + pCell[1])<=pP
28090 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20  age->maxLocal.  
280a0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
280b0 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
280c0 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61  -size field is a
280d0 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61   2 byte varint a
280e0 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20  nd the record . 
280f0 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73           ** fits
28100 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
28110 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67   main b-tree pag
28120 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
28130 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
28140 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d  +nCell+2==pPage-
28150 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20  >aDataEnd );.   
28160 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
28170 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
28180 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32   (void*)&pCell[2
28190 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
281a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
281b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
281c0 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f  ord flows over o
281d0 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
281e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
281f0 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  In.          ** 
28200 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68  this case the wh
28210 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74  ole cell needs t
28220 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62  o be parsed, a b
28230 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  uffer allocated.
28240 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
28250 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
28260 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76   used to retriev
28270 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74  e the record int
28280 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  o the.          
28290 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  ** buffer before
282a0 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
282b0 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c  re() can be call
282c0 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ed. */.         
282d0 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
282e0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20  .          u8 * 
282f0 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20  const pCellBody 
28300 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d  = pCell - pPage-
28310 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
28320 20 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61           btreePa
28330 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
28340 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43  , pCellBody, &pC
28350 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
28360 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e       nCell = (in
28370 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
28380 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65  y;.          pCe
28390 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
283a0 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a  alloc( nCell );.
283b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
283c0 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  ellKey==0 ){.   
283d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
283e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
283f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
28400 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
28410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28420 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
28430 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
28440 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
28450 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
28460 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  oad(pCur, 0, nCe
28470 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ll, (unsigned ch
28480 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29  ar*)pCellKey, 2)
28490 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
284a0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
284b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
284c0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
284d0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
284e0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
284f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28500 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
28510 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b  re(nCell, pCellK
28520 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
28530 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
28540 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
28550 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28560 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20    assert( .     
28570 20 20 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d         (pIdxKey-
28580 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
28590 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30  _CORRUPT || c==0
285a0 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
285b0 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21  IdxKey->errCode!
285c0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
285d0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64   pCur->pBtree->d
285e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
285f0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
28600 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
28610 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
28620 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  dx+1;.        }e
28630 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20  lse if( c>0 ){. 
28640 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
28650 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  dx-1;.        }e
28660 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
28670 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20  ssert( c==0 );. 
28680 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
28690 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
286a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
286b0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
286c0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
286d0 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
286e0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b         if( pIdxK
286f0 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63  ey->errCode ) rc
28700 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
28710 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
28720 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
28730 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28740 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
28750 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
28760 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e  assert( lwr+upr>
28770 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64  =0 );.        id
28780 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31  x = (lwr+upr)>>1
28790 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72  ;  /* idx = (lwr
287a0 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20  +upr)/2 */.     
287b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
287c0 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20  ert( lwr==upr+1 
287d0 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  || (pPage->intKe
287e0 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
287f0 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  f) );.    assert
28800 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
28810 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
28820 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
28830 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
28840 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
28850 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
28860 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
28870 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  l );.      pCur-
28880 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
28890 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
288a0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b        *pRes = c;
288b0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
288c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74  TE_OK;.      got
288d0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
288e0 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65  .    }.moveto_ne
288f0 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66  xt_layer:.    if
28900 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( lwr>=pPage->nC
28910 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  ell ){.      chl
28920 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  dPg = get4byte(&
28930 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
28940 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
28950 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
28960 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
28970 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
28980 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20  Page, lwr));.   
28990 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49   }.    pCur->aiI
289a0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
289b0 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20  = (u16)lwr;.    
289c0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
289d0 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
289e0 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
289f0 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66  ak;.  }.moveto_f
28a00 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69  inish:.  pCur->i
28a10 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
28a20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
28a30 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
28a40 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
28a50 66 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  fl);.  return rc
28a60 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
28a70 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63  rn TRUE if the c
28a80 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
28a90 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
28aa0 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  y of the table..
28ab0 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20  **.** TRUE will 
28ac0 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65  be returned afte
28ad0 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
28ae0 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d  te3BtreeNext() m
28af0 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65  oves.** past the
28b00 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
28b10 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69  he table or sqli
28b20 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d  te3BtreePrev() m
28b30 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65  oves past.** the
28b40 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54   first entry.  T
28b50 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75  RUE is also retu
28b60 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c  rned if the tabl
28b70 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
28b80 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  nt sqlite3BtreeE
28b90 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  of(BtCursor *pCu
28ba0 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57  r){.  /* TODO: W
28bb0 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f  hat if the curso
28bc0 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52  r is in CURSOR_R
28bd0 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61  EQUIRESEEK but a
28be0 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  ll table entries
28bf0 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
28c00 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50  deleted? This AP
28c10 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  I will need to c
28c20 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20  hange to return 
28c30 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  an error code.  
28c40 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  ** as well as th
28c50 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74  e boolean result
28c60 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72   value..  */.  r
28c70 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41  eturn (CURSOR_VA
28c80 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID!=pCur->eStat
28c90 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  e);.}../*.** Adv
28ca0 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20  ance the cursor 
28cb0 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
28cc0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
28cd0 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
28ce0 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
28cf0 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
28d00 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
28d10 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
28d20 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
28d30 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
28d40 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
28d50 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
28d60 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
28d70 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  s=1..**.** The m
28d80 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20  ain entry point 
28d90 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  is sqlite3BtreeN
28da0 65 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75  ext().  That rou
28db0 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65  tine is optimize
28dc0 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d  d.** for the com
28dd0 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65  mon case of mere
28de0 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20  ly incrementing 
28df0 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72  the cell counter
28e00 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a   BtCursor.aiIdx.
28e10 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63  ** to the next c
28e20 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65  ell on the curre
28e30 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73  nt page.  The (s
28e40 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78 74  lower) btreeNext
28e50 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75  () helper.** rou
28e60 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
28e70 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73  hen it is necess
28e80 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61  ary to move to a
28e90 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 20   different page 
28ea0 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65  or.** to restore
28eb0 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a   the cursor..**.
28ec0 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
28ed0 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74  unction will set
28ee0 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31   *pRes to 0 or 1
28ef0 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a  .  The initial *
28f00 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69  pRes value.** wi
28f10 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63  ll be 1 if the c
28f20 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70  ursor being step
28f30 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ped corresponds 
28f40 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  to an SQL index 
28f50 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72  and.** if this r
28f60 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
28f70 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69  e been skipped i
28f80 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78  f that SQL index
28f90 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75   had been.** a u
28fa0 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74  nique index.  Ot
28fb0 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c  herwise the call
28fc0 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74  er will have set
28fd0 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a   *pRes to zero..
28fe0 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63  ** Zero is the c
28ff0 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20  ommon case. The 
29000 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
29010 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20  tion is free to 
29020 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69  use the.** initi
29030 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61  al *pRes value a
29040 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72  s a hint to impr
29050 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c  ove performance,
29060 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74   but the current
29070 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65  .** SQLite btree
29080 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
29090 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20  does not. (Note 
290a0 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20  that the comdb2 
290b0 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  btree.** impleme
290c0 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65  ntation does use
290d0 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65   this hint, howe
290e0 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ver.).*/.static 
290f0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
29100 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42 74  int btreeNext(Bt
29110 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
29120 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
29130 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
29140 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
29150 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
29160 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
29170 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
29180 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
29190 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
291a0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
291b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  );.  assert( *pR
291c0 65 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  es==0 );.  if( p
291d0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
291e0 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
291f0 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
29200 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
29210 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b  ValidOvfl)==0 );
29220 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
29230 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
29240 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
29250 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29260 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
29270 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
29280 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
29290 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
292a0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
292b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
292c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
292d0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
292e0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
292f0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
29300 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
29310 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
29320 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
29330 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
29340 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
29350 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
29360 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
29370 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  >0 ){.        pC
29380 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
29390 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
293a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
293b0 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
293c0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
293d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
293e0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
293f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
29400 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
29410 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
29420 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
29430 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20  e->isInit );..  
29440 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
29450 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  se file is corru
29460 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  pt, it is possib
29470 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  le for the value
29480 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f   of idx .  ** to
29490 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65   be invalid here
294a0 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
294b0 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e  occur if a secon
294c0 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65  d cursor modifie
294d0 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  s.  ** the page 
294e0 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75  while cursor pCu
294f0 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72  r is holding a r
29500 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20  eference to it. 
29510 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f  Which can.  ** o
29520 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68  nly happen if th
29530 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
29540 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20  rrupt in such a 
29550 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74  way as to link t
29560 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74  he.  ** page int
29570 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
29580 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
29590 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  . */.  testcase(
295a0 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c   idx>pPage->nCel
295b0 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e  l );..  if( idx>
295c0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
295d0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
295e0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
295f0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
29600 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
29610 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
29620 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
29630 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
29640 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
29650 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
29660 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
29670 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
29680 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
29690 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
296a0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
296b0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
296c0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
296d0 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
296e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
296f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
29700 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
29710 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70  .      pPage = p
29720 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
29730 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77  ->iPage];.    }w
29740 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
29750 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d  x[pCur->iPage]>=
29760 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
29770 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
29780 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
29790 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72  eturn sqlite3Btr
297a0 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
297b0 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
297c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
297d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
297e0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
297f0 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
29800 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
29810 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
29820 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
29830 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20  Cur);.  }.}.int 
29840 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
29850 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
29860 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 4d   int *pRes){.  M
29870 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
29880 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
29890 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
298a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
298b0 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
298c0 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70  ( *pRes==0 || *p
298d0 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  Res==1 );.  asse
298e0 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
298f0 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
29900 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
29910 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69  LID );.  pCur->i
29920 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
29930 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
29940 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
29950 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
29960 66 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30  fl);.  *pRes = 0
29970 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
29980 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
29990 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72 65  ID ) return btre
299a0 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
299b0 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
299c0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
299d0 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b  iPage];.  if( (+
299e0 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  +pCur->aiIdx[pCu
299f0 72 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61 67  r->iPage])>=pPag
29a00 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
29a10 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
29a20 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
29a30 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74  return btreeNext
29a40 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
29a50 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  }.  if( pPage->l
29a60 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
29a70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
29a80 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
29a90 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
29aa0 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pCur);.  }.}../*
29ab0 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
29ac0 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
29ad0 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
29ae0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
29af0 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
29b00 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
29b10 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
29b20 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
29b30 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
29b40 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
29b50 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
29b60 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
29b70 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
29b80 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
29b90 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20   *pRes=1..**.** 
29ba0 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70  The main entry p
29bb0 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42  oint is sqlite3B
29bc0 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20  treePrevious(). 
29bd0 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
29be0 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
29bf0 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
29c00 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72  e of merely decr
29c10 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
29c20 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
29c30 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
29c40 68 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c  he previous cell
29c50 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
29c60 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77  page.  The (slow
29c70 65 72 29 20 62 74 72 65 65 50 72 65 76 69 6f 75  er) btreePreviou
29c80 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f  s().** helper ro
29c90 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
29ca0 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73  when it is neces
29cb0 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20  sary to move to 
29cc0 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  a different page
29cd0 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72  .** or to restor
29ce0 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  e the cursor..**
29cf0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
29d00 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65  function will se
29d10 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20  t *pRes to 0 or 
29d20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20  1.  The initial 
29d30 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77  *pRes value.** w
29d40 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20  ill be 1 if the 
29d50 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65  cursor being ste
29d60 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73  pped corresponds
29d70 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
29d80 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20   and.** if this 
29d90 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
29da0 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20  ve been skipped 
29db0 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65  if that SQL inde
29dc0 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20  x had been.** a 
29dd0 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f  unique index.  O
29de0 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c  therwise the cal
29df0 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65  ler will have se
29e00 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e  t *pRes to zero.
29e10 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20  .** Zero is the 
29e20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65  common case. The
29e30 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
29e40 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f  ation is free to
29e50 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74   use the.** init
29e60 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20  ial *pRes value 
29e70 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70  as a hint to imp
29e80 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rove performance
29e90 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e  , but the curren
29ea0 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65  t.** SQLite btre
29eb0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
29ec0 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65   does not. (Note
29ed0 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32   that the comdb2
29ee0 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d   btree.** implem
29ef0 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73  entation does us
29f00 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77  e this hint, how
29f10 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ever.).*/.static
29f20 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
29f30 20 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f   int btreePrevio
29f40 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
29f50 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
29f60 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
29f70 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
29f80 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
29f90 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
29fa0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
29fb0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  0 );.  assert( *
29fc0 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73  pRes==0 );.  ass
29fd0 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
29fe0 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
29ff0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2a000 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2a010 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2a020 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74  s & (BTCF_AtLast
2a030 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c  |BTCF_ValidOvfl|
2a040 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29  BTCF_ValidNKey))
2a050 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2a060 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2a070 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e==0 );.  if( pC
2a080 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2a090 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2a0a0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
2a0b0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2a0c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2a0d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a0e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a0f0 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
2a100 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
2a110 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
2a120 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2a130 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a140 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
2a150 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2a160 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2a170 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2a180 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
2a190 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2a1a0 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
2a1b0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2a1c0 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2a1d0 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
2a1e0 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b  r->skipNext<0 ){
2a1f0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
2a200 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2a210 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2a220 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2a230 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2a240 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
2a250 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
2a260 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a270 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
2a280 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2a290 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
2a2a0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
2a2b0 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
2a2c0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2a2d0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2a2e0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
2a2f0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
2a300 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
2a310 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2a320 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d  n rc;.    rc = m
2a330 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
2a340 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
2a350 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
2a360 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2a370 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e]==0 ){.      i
2a380 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
2a390 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2a3a0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2a3b0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2a3c0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2a3d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2a3e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2a3f0 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
2a400 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ent(pCur);.    }
2a410 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2a420 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
2a430 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2a440 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2a450 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  & (BTCF_ValidNKe
2a460 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2a470 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43  ))==0 );..    pC
2a480 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2a490 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50  iPage]--;.    pP
2a4a0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2a4b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2a4c0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2a4d0 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
2a4e0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2a4f0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2a500 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
2a510 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
2a520 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2a530 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2a540 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2a550 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2a560 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
2a570 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2a580 52 65 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Res){.  assert( 
2a590 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2a5a0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2a5b0 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
2a5c0 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
2a5d0 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b  0 || *pRes==1 );
2a5e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2a5f0 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
2a600 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2a610 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2a620 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 70 43 75  *pRes = 0;.  pCu
2a630 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2a640 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
2a650 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
2a660 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70  _ValidNKey);.  p
2a670 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2a680 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  = 0;.  if( pCur-
2a690 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2a6a0 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72  VALID.   || pCur
2a6b0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2a6c0 61 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43  age]==0.   || pC
2a6d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a6e0 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30  >iPage]->leaf==0
2a6f0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2a700 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70   btreePrevious(p
2a710 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a  Cur, pRes);.  }.
2a720 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2a730 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20  ur->iPage]--;.  
2a740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a750 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
2a760 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66  ate a new page f
2a770 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2a780 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
2a790 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72   new page is mar
2a7a0 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28  ked as dirty.  (
2a7b0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
2a7c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2a7d0 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  e().** has alrea
2a7e0 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f  dy been called o
2a7f0 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29  n the new page.)
2a800 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68    The new page h
2a810 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20  as also.** been 
2a820 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74  referenced and t
2a830 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
2a840 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ne is responsibl
2a850 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a  e for calling.**
2a860 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2a870 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  ef() on the new 
2a880 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20  page when it is 
2a890 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  done..**.** SQLI
2a8a0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2a8b0 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41  d on success.  A
2a8c0 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20  ny other return 
2a8d0 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a  value indicates.
2a8e0 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70  ** an error.  *p
2a8f0 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f  pPage and *pPgno
2a900 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69   are undefined i
2a910 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
2a920 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e  n error..** Do n
2a930 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ot invoke sqlite
2a940 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
2a950 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65   *ppPage if an e
2a960 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
2a970 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
2a980 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65  nearby" paramete
2a990 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
2a9a0 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61   an effort is ma
2a9b0 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
2a9c0 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
2a9d0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2a9e0 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
2a9f0 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
2aa00 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
2aa10 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
2aa20 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
2aa30 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
2aa40 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
2aa50 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
2aa60 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
2aa70 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
2aa80 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f  **.** If the eMo
2aa90 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  de parameter is 
2aaa0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
2aab0 64 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67  d the nearby pag
2aac0 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77  e exists.** anyw
2aad0 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
2aae0 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
2aaf0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2ab00 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  be returned.  If
2ab10 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41  .** eMode is BTA
2ab20 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65  LLOC_LT then the
2ab30 20 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77   page returned w
2ab40 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ill be less than
2ab50 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20   or equal.** to 
2ab60 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75  nearby if any su
2ab70 63 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20  ch page exists. 
2ab80 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41   If eMode is BTA
2ab90 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68  LLOC_ANY then th
2aba0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65  ere.** are no re
2abb0 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68  strictions on wh
2abc0 69 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75  ich page is retu
2abd0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2abe0 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
2abf0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
2ac00 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
2ac10 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
2ac20 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
2ac30 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  ge,      /* Stor
2ac40 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
2ac50 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2ac60 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  here */.  Pgno *
2ac70 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  pPgno,          
2ac80 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61   /* Store the pa
2ac90 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a  ge number here *
2aca0 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c  /.  Pgno nearby,
2acb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
2acc0 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20  arch for a page 
2acd0 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f  near this one */
2ace0 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20  .  u8 eMode     
2acf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41            /* BTA
2ad00 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c  LLOC_EXACT, BTAL
2ad10 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c  LOC_LT, or BTALL
2ad20 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d  OC_ANY */.){.  M
2ad30 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
2ad40 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
2ad50 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
2ad60 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
2ad70 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75   freelist */.  u
2ad80 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 k;     /* Num
2ad90 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
2ada0 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
2adb0 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
2adc0 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
2add0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
2ade0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
2adf0 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20    Pgno mxPage;  
2ae00 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
2ae10 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2ae20 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
2ae30 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2ae40 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2ae50 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2ae60 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41  eMode==BTALLOC_A
2ae70 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20  NY || (nearby>0 
2ae80 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  && IfNotOmitAV(p
2ae90 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29  Bt->autoVacuum))
2aea0 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
2aeb0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78  Bt->pPage1;.  mx
2aec0 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
2aed0 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20  count(pBt);.  n 
2aee0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2aef0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
2af00 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d    testcase( n==m
2af10 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28  xPage-1 );.  if(
2af20 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20   n>=mxPage ){.  
2af30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2af40 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2af50 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
2af60 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
2af70 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2af80 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
2af90 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
2afa0 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
2afb0 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
2afc0 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
2afd0 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
2afe0 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
2aff0 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
2b000 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
2b010 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2b020 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72  EXACT and a quer
2b030 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
2b040 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
2b050 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
2b060 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
2b070 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
2b080 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
2b090 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
2b0a0 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
2b0b0 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
2b0c0 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  ge..    */.#ifnd
2b0d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2b0e0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2b0f0 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2b100 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20  _EXACT ){.      
2b110 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61  if( nearby<=mxPa
2b120 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  ge ){.        u8
2b130 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20   eType;.        
2b140 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
2b150 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2b160 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
2b170 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  uum );.        r
2b180 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
2b190 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
2b1a0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
2b1b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2b1c0 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  c;.        if( e
2b1d0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
2b1e0 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
2b1f0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
2b200 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
2b210 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
2b220 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
2b230 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65  C_LE ){.      se
2b240 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
2b250 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
2b260 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
2b270 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
2b280 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
2b290 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
2b2a0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
2b2b0 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
2b2c0 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
2b2d0 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
2b2e0 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
2b2f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2b300 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
2b310 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2b320 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2b330 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2b340 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
2b350 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
2b360 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
2b370 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
2b380 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
2b390 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
2b3a0 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
2b3b0 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
2b3c0 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
2b3d0 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
2b3e0 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
2b3f0 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
2b400 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
2b410 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
2b420 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
2b430 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20  C_EXACT).    ** 
2b440 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20  or until a page 
2b450 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62  less than 'nearb
2b460 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
2b470 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54  Mode==BTALLOC_LT
2b480 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ).    */.    do 
2b490 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
2b4a0 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
2b4b0 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
2b4c0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72  k ){.        iTr
2b4d0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2b4e0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
2b4f0 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
2b500 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75  se{.        iTru
2b510 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
2b520 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2b530 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2b540 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e   testcase( iTrun
2b550 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
2b560 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78     if( iTrunk>mx
2b570 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2b580 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2b590 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2b5a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
2b5b0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2b5c0 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
2b5d0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
2b5e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
2b5f0 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
2b600 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
2b610 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2b620 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _page;.      }. 
2b630 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
2b640 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk!=0 );.      
2b650 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e  assert( pTrunk->
2b660 61 44 61 74 61 21 3d 30 20 29 3b 0a 0a 20 20 20  aData!=0 );..   
2b670 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
2b680 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
2b690 5d 29 3b 20 2f 2a 20 23 20 6f 66 20 6c 65 61 76  ]); /* # of leav
2b6a0 65 73 20 6f 6e 20 74 68 69 73 20 74 72 75 6e 6b  es on this trunk
2b6b0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
2b6c0 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72  f( k==0 && !sear
2b6d0 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  chList ){.      
2b6e0 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68    /* The trunk h
2b6f0 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64  as no leaves and
2b700 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74   the list is not
2b710 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e   being searched.
2b720 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20   .        ** So 
2b730 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e  extract the trun
2b740 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e  k page itself an
2b750 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  d use it as the 
2b760 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a  newly .        *
2b770 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  * allocated page
2b780 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2b790 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d  rt( pPrevTrunk==
2b7a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
2b7b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2b7c0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
2b7d0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
2b7e0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2b7f0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2b800 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2b810 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67    }.        *pPg
2b820 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
2b830 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
2b840 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
2b850 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2b860 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
2b870 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
2b880 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
2b890 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
2b8a0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2b8b0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
2b8c0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
2b8d0 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
2b8e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2b8f0 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61  k>(u32)(pBt->usa
2b900 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29  bleSize/4 - 2) )
2b910 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
2b920 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f  ue of k is out o
2b930 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61  f range.  Databa
2b940 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
2b950 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2b960 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2b970 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
2b980 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2b990 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
2b9a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2b9b0 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  M.      }else if
2b9c0 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20  ( searchList .  
2b9d0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 65            && (ne
2b9e0 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20  arby==iTrunk || 
2b9f0 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26  (iTrunk<nearby &
2ba00 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  & eMode==BTALLOC
2ba10 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a  _LE)) .      ){.
2ba20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
2ba30 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61  ist is being sea
2ba40 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74  rched and this t
2ba50 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65  runk page is the
2ba60 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
2ba70 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65   to allocate, re
2ba80 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
2ba90 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65  her it has leave
2baa0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
2bab0 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
2bac0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a  Trunk;.        *
2bad0 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
2bae0 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
2baf0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
2bb00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2bb10 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
2bb20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2bb30 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2bb40 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2bb50 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2bb60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bb70 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  if( k==0 ){.    
2bb80 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
2bb90 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
2bba0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
2bbb0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
2bbc0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2bbd0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2bbe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2bbf0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2bc00 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
2bc10 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2bc20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2bc30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2bc40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2bc50 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2bc60 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2bc70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2bc80 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54    memcpy(&pPrevT
2bc90 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2bca0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2bcb0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2bcc0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2bcd0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2bce0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
2bcf0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
2bd00 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63   caller but it c
2bd10 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20  ontains .       
2bd20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74     ** pointers t
2bd30 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76  o free-list leav
2bd40 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65  es. The first le
2bd50 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75  af becomes a tru
2bd60 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nk.          ** 
2bd70 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
2bd80 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
2bd90 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67            MemPag
2bda0 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20  e *pNewTrunk;.  
2bdb0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65          Pgno iNe
2bdc0 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  wTrunk = get4byt
2bdd0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2bde0 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [8]);.          
2bdf0 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78  if( iNewTrunk>mx
2be00 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20  Page ){ .       
2be10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2be20 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2be30 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2be40 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2be50 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2be60 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2be70 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78  e( iNewTrunk==mx
2be80 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
2be90 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
2bea0 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75  age(pBt, iNewTru
2beb0 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20  nk, &pNewTrunk, 
2bec0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
2bed0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2bee0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ){.            g
2bef0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2bf00 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
2bf10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
2bf20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2bf30 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70  ite(pNewTrunk->p
2bf40 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2bf50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2bf60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2bf70 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2bf80 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
2bf90 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2bfa0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2bfb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2bfc0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
2bfd0 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  ewTrunk->aData[0
2bfe0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
2bff0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
2c000 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e      put4byte(&pN
2c010 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  ewTrunk->aData[4
2c020 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
2c030 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
2c040 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  runk->aData[8], 
2c050 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31  &pTrunk->aData[1
2c060 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20  2], (k-1)*4);.  
2c070 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2c080 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
2c090 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2c0a0 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
2c0b0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2c0c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2c0d0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d  riteable(pPage1-
2c0e0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
2c0f0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
2c100 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2c110 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  [32], iNewTrunk)
2c120 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2c130 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
2c140 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2c150 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
2c160 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2c170 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2c180 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c190 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2c1a0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2c1b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c1c0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65    put4byte(&pPre
2c1d0 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
2c1e0 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
2c1f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c200 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75    }.        pTru
2c210 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
2c220 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
2c230 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
2c240 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
2c250 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
2c260 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
2c270 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b  }else if( k>0 ){
2c280 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72  .        /* Extr
2c290 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20  act a leaf from 
2c2a0 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  the trunk */.   
2c2b0 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74       u32 closest
2c2c0 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  ;.        Pgno i
2c2d0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e  Page;.        un
2c2e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
2c2f0 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ta = pTrunk->aDa
2c300 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ta;.        if( 
2c310 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20  nearby>0 ){.    
2c320 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20        u32 i;.   
2c330 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
2c340 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
2c350 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2c360 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _LE ){.         
2c370 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b     for(i=0; i<k;
2c380 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2c390 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74       iPage = get
2c3a0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
2c3b0 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  *4]);.          
2c3c0 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e      if( iPage<=n
2c3d0 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20  earby ){.       
2c3e0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
2c3f0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
2c400 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c410 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c420 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c430 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2c440 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73 74          int dist
2c450 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69  ;.            di
2c460 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49  st = sqlite3AbsI
2c470 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61  nt32(get4byte(&a
2c480 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
2c490 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
2c4a0 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b  for(i=1; i<k; i+
2c4b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2c4c0 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
2c4d0 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
2c4e0 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
2c4f0 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20  ]) - nearby);.  
2c500 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c510 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20  d2<dist ){.     
2c520 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
2c530 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
2c540 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64          dist = d
2c550 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2;.             
2c560 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2c570 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c580 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2c590 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
2c5a0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
2c5b0 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
2c5c0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
2c5d0 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20  closest*4]);.   
2c5e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2c5f0 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  Page==mxPage );.
2c600 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
2c610 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  e>mxPage ){.    
2c620 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2c630 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2c640 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2c650 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2c660 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c670 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
2c680 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
2c690 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72         if( !sear
2c6a0 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20  chList .        
2c6b0 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72   || (iPage==near
2c6c0 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61  by || (iPage<nea
2c6d0 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54  rby && eMode==BT
2c6e0 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20  ALLOC_LE)) .    
2c6f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2c700 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a   int noContent;.
2c710 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
2c720 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
2c730 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
2c740 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61  CATE: %d was lea
2c750 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72  f %d of %d on tr
2c760 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20  unk %d".        
2c770 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d           ": %d m
2c780 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e  ore free pages\n
2c790 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2c7a0 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73      *pPgno, clos
2c7b0 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b  est+1, k, pTrunk
2c7c0 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  ->pgno, n-1));. 
2c7d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2c7e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2c7f0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2c800 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c810 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c  rc ) goto end_al
2c820 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2c830 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
2c840 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20  st<k-1 ){.      
2c850 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
2c860 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
2c870 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c  , &aData[4+k*4],
2c880 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
2c890 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
2c8a0 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b  yte(&aData[4], k
2c8b0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  -1);.          n
2c8c0 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65  oContent = !btre
2c8d0 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eGetHasContent(p
2c8e0 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47  Bt, *pPgno)? PAG
2c8f0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
2c900 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   : 0;.          
2c910 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2c920 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
2c930 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74  pPage, noContent
2c940 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2c950 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c960 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2c970 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2c980 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
2c990 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2c9a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2c9b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c9c0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
2c9d0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
2c9e0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c9f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ca00 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
2ca10 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
2ca20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
2ca30 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
2ca40 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54  k);.      pPrevT
2ca50 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77  runk = 0;.    }w
2ca60 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74  hile( searchList
2ca70 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2ca80 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f   /* There are no
2ca90 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
2caa0 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e  eelist, so appen
2cab0 64 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  d a new page to 
2cac0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
2cad0 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a  ase image..    *
2cae0 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c  *.    ** Normall
2caf0 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c  y, new pages all
2cb00 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62  ocated by this b
2cb10 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75  lock can be requ
2cb20 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20  ested from the. 
2cb30 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65     ** pager laye
2cb40 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63  r with the 'no-c
2cb50 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74  ontent' flag set
2cb60 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20  . This prevents 
2cb70 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
2cb80 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20   from trying to 
2cb90 72 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63  read the pages c
2cba0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
2cbb0 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
2cbc0 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
2cbd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2cbe0 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65   already run one
2cbf0 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65   or more increme
2cc00 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20  ntal-vacuum.    
2cc10 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74  ** steps, then t
2cc20 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61  he page we are a
2cc30 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  bout to allocate
2cc40 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e   may contain con
2cc50 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74  tent.    ** that
2cc60 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
2cc70 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
2cc80 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  ollback. In this
2cc90 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a   case, do.    **
2cca0 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d   not set the no-
2ccb0 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68  content flag. Th
2ccc0 69 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61  is causes the pa
2ccd0 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20  ger to load and 
2cce0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74  journal.    ** t
2ccf0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
2cd00 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f  content before o
2cd10 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  verwriting it.. 
2cd20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
2cd30 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
2cd40 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c   will not actual
2cd50 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  ly attempt to lo
2cd60 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20  ad or journal . 
2cd70 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f     ** content fo
2cd80 72 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  r any page that 
2cd90 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20  really does lie 
2cda0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
2cdb0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
2cdc0 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b   ** file on disk
2cdd0 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73  . So the effects
2cde0 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68   of disabling th
2cdf0 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74  e no-content opt
2ce00 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  imization.    **
2ce10 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e   here are confin
2ce20 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65  ed to those page
2ce30 73 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65  s that lie betwe
2ce40 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  en the end of th
2ce50 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
2ce60 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20  e image and the 
2ce70 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
2ce80 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
2ce90 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74  .    int bNoCont
2cea0 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f  ent = (0==IfNotO
2ceb0 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72  mitAV(pBt->bDoTr
2cec0 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f  uncate))? PAGER_
2ced0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b  GET_NOCONTENT:0;
2cee0 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
2cef0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
2cf00 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
2cf10 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
2cf20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2cf30 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
2cf40 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
2cf50 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
2cf60 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e  AGE(pBt) ) pBt->
2cf70 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65  nPage++;..#ifnde
2cf80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2cf90 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
2cfa0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2cfb0 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47   && PTRMAP_ISPAG
2cfc0 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  E(pBt, pBt->nPag
2cfd0 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  e) ){.      /* I
2cfe0 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20  f *pPgno refers 
2cff0 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  to a pointer-map
2d000 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20   page, allocate 
2d010 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20  two new pages.  
2d020 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e      ** at the en
2d030 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  d of the file in
2d040 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68  stead of one. Th
2d050 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65  e first allocate
2d060 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  d page.      ** 
2d070 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f  becomes a new po
2d080 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
2d090 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73  the second is us
2d0a0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
2d0b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2d0c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20   MemPage *pPg = 
2d0d0 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  0;.      TRACE((
2d0e0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
2d0f0 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
2d100 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2d110 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65  )\n", pBt->nPage
2d120 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
2d130 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45  ( pBt->nPage!=PE
2d140 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2d150 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63  pBt) );.      rc
2d160 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2d170 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c  pBt, pBt->nPage,
2d180 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e   &pPg, bNoConten
2d190 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
2d1a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2d1b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2d1c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2d1d0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
2d1e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2d1f0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
2d200 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2d210 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
2d220 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
2d230 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
2d240 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
2d250 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74  PAGE(pBt) ){ pBt
2d260 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20  ->nPage++; }.   
2d270 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75   }.#endif.    pu
2d280 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a  t4byte(28 + (u8*
2d290 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  )pBt->pPage1->aD
2d2a0 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ata, pBt->nPage)
2d2b0 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70  ;.    *pPgno = p
2d2c0 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20  Bt->nPage;..    
2d2d0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
2d2e0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2d2f0 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
2d300 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2d310 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
2d320 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29  age, bNoContent)
2d330 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2d340 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
2d350 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2d360 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
2d370 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2d380 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d390 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
2d3a0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
2d3b0 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
2d3c0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
2d3d0 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e  om end of file\n
2d3e0 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d  ", *pPgno));.  }
2d3f0 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67  ..  assert( *pPg
2d400 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
2d410 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65  _PAGE(pBt) );..e
2d420 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2d430 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
2d440 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61  pTrunk);.  relea
2d450 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
2d460 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  k);.  if( rc==SQ
2d470 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2d480 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
2d490 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
2d4a0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e  Page)->pDbPage)>
2d4b0 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  1 ){.      relea
2d4c0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
2d4d0 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
2d4e0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
2d4f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2d500 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2d510 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
2d520 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
2d530 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
2d540 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
2d550 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
2d560 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2d570 69 74 65 61 62 6c 65 28 28 2a 70 70 50 61 67 65  iteable((*ppPage
2d580 29 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  )->pDbPage) );. 
2d590 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2d5a0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2d5b0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64  on is used to ad
2d5c0 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20  d page iPage to 
2d5d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2d5e0 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a  e free-list. .**
2d5f0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
2d600 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
2d610 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61  not already a pa
2d620 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c  rt of the free-l
2d630 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ist..**.** The v
2d640 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
2d650 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2d660 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
2d670 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e  ion is optional.
2d680 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65  .** If the calle
2d690 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76  r happens to hav
2d6a0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
2d6b0 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
2d6c0 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  t .** correspond
2d6d0 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67  ing to page iPag
2d6e0 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20  e handy, it may 
2d6f0 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73  pass it as the s
2d700 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a  econd value. .**
2d710 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d   Otherwise, it m
2d720 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a  ay pass NULL..**
2d730 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72  .** If a pointer
2d740 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62   to a MemPage ob
2d750 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61  ject is passed a
2d760 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
2d770 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65  ument,.** its re
2d780 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
2d790 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20   not altered by 
2d7a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
2d7b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
2d7c0 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20  ePage2(BtShared 
2d7d0 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  *pBt, MemPage *p
2d7e0 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50  MemPage, Pgno iP
2d7f0 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
2d800 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20  *pTrunk = 0;    
2d810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2d820 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2d830 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54  age */.  Pgno iT
2d840 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
2d850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d860 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
2d870 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2d880 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67  age */ .  MemPag
2d890 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
2d8a0 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a  >pPage1;      /*
2d8b0 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65   Local reference
2d8c0 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   to page 1 */.  
2d8d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
2d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d8f0 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e      /* Page bein
2d900 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20  g freed. May be 
2d910 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  NULL. */.  int r
2d920 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2d930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d940 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
2d950 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20  .  int nFree;   
2d960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d970 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
2d980 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
2d990 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a  s on free-list *
2d9a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
2d9b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2d9c0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2d9d0 20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e 31   assert( iPage>1
2d9e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
2d9f0 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
2da00 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
2da10 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50   );..  if( pMemP
2da20 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
2da30 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20   = pMemPage;.   
2da40 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
2da50 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2da60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2da70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
2da80 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67  Lookup(pBt, iPag
2da90 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  e);.  }..  /* In
2daa0 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
2dab0 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
2dac0 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
2dad0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2dae0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
2daf0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
2db00 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2db10 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34  ;.  nFree = get4
2db20 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2db30 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34  ata[36]);.  put4
2db40 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2db50 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31  ata[36], nFree+1
2db60 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  );..  if( pBt->b
2db70 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
2db80 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
2db90 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63     /* If the sec
2dba0 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f  ure_delete optio
2dbb0 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
2dbc0 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  en.    ** always
2dbd0 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
2dbe0 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
2dbf0 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
2dc00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2dc10 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20  (!pPage && ((rc 
2dc20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
2dc30 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
2dc40 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20  e, 0))!=0) ).   
2dc50 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20    ||            
2dc60 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  ((rc = sqlite3Pa
2dc70 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2dc80 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20  pDbPage))!=0).  
2dc90 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
2dca0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2dcb0 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
2dcc0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
2dcd0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
2dce0 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
2dcf0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
2dd00 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
2dd10 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20  acuum, write an 
2dd20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69  entry in the poi
2dd30 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f  nter-map.  ** to
2dd40 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
2dd50 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e  he page is free.
2dd60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55  .  */.  if( ISAU
2dd70 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2dd80 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
2dd90 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
2dda0 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a  EPAGE, 0, &rc);.
2ddb0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2ddc0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2ddd0 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61    }..  /* Now ma
2dde0 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74  nipulate the act
2ddf0 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65  ual database fre
2de00 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65  e-list structure
2de10 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a  . There are two.
2de20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69    ** possibiliti
2de30 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d  es. If the free-
2de40 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c  list is currentl
2de50 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74  y empty, or if t
2de60 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72  he first.  ** tr
2de70 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
2de80 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
2de90 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  l, then this pag
2dea0 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a  e will become a.
2deb0 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69    ** new free-li
2dec0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f  st trunk page. O
2ded0 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c  therwise, it wil
2dee0 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20  l become a leaf 
2def0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73  of the.  ** firs
2df00 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
2df10 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65  the current free
2df20 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63  -list. This bloc
2df30 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20  k tests if it.  
2df40 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
2df50 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61  o add the page a
2df60 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73  s a new free-lis
2df70 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69  t leaf..  */.  i
2df80 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20  f( nFree!=0 ){. 
2df90 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20     u32 nLeaf;   
2dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dfb0 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
2dfc0 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20  f leaf cells on 
2dfd0 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20  trunk page */.. 
2dfe0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
2dff0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2e000 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63  ata[32]);.    rc
2e010 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2e020 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
2e030 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
2e040 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e050 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
2e060 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
2e070 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67  }..    nLeaf = g
2e080 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2e090 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
2e0a0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
2e0b0 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20  bleSize>32 );.  
2e0c0 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75    if( nLeaf > (u
2e0d0 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
2e0e0 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20  ze/4 - 2 ){.    
2e0f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2e100 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2e110 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2e120 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
2e130 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29  f( nLeaf < (u32)
2e140 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
2e150 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f  4 - 8 ){.      /
2e160 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
2e170 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20  here is room on 
2e180 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74  the trunk page t
2e190 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67  o insert the pag
2e1a0 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67  e.      ** being
2e1b0 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20   freed as a new 
2e1c0 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  leaf..      **. 
2e1d0 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
2e1e0 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
2e1f0 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66   is not really f
2e200 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e  ull until it con
2e210 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75  tains.      ** u
2e220 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
2e230 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61  entries, not usa
2e240 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
2e250 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65  tries as we have
2e260 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e  .      ** coded.
2e270 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63    But due to a c
2e280 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76  oding error in v
2e290 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
2e2a0 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20  e prior to.     
2e2b0 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62   ** 3.6.0, datab
2e2c0 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69  ases with freeli
2e2d0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68  st trunk pages h
2e2e0 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  olding more than
2e2f0 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
2e300 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
2e310 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72  es will be repor
2e320 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20  ted as corrupt. 
2e330 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20   In order.      
2e340 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62  ** to maintain b
2e350 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
2e360 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
2e370 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
2e380 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77  Lite,.      ** w
2e390 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
2e3a0 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20  to restrict the 
2e3b0 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
2e3c0 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f  s to usableSize/
2e3d0 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66  4 - 8.      ** f
2e3e0 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65  or now.  At some
2e3f0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
2e400 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79  ture (once every
2e410 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64  one has upgraded
2e420 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36  .      ** to 3.6
2e430 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20  .0 or later) we 
2e440 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20  should consider 
2e450 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69  fixing the condi
2e460 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20  tional above.   
2e470 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75     ** to read "u
2e480 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69  sableSize/4-2" i
2e490 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c  nstead of "usabl
2e4a0 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20  eSize/4-8"..    
2e4b0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2e4c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2e4d0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
2e4e0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2e4f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e500 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2e510 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
2e520 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20  ], nLeaf+1);.   
2e530 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2e540 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
2e550 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Leaf*4], iPage);
2e560 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
2e570 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  ge && (pBt->btsF
2e580 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
2e590 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a  E_DELETE)==0 ){.
2e5a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e5b0 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
2e5c0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2e5d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e5e0 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
2e5f0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
2e600 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
2e610 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
2e620 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
2e630 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
2e640 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
2e650 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
2e660 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
2e670 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
2e680 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
2e690 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
2e6a0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
2e6b0 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
2e6c0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
2e6d0 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
2e6e0 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
2e6f0 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
2e700 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
2e710 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
2e720 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
2e730 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
2e740 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
2e750 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
2e760 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
2e770 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
2e780 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
2e790 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
2e7a0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
2e7b0 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
2e7c0 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
2e7d0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
2e7e0 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
2e7f0 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
2e800 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
2e810 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2e820 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
2e830 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
2e840 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2e850 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
2e860 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2e870 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2e880 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e890 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
2e8a0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2e8b0 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
2e8c0 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
2e8d0 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
2e8e0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
2e8f0 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
2e900 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2e910 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
2e920 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
2e930 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
2e940 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
2e950 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
2e960 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
2e970 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
2e980 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
2e990 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
2e9a0 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
2e9b0 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
2e9c0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
2e9d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2e9e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
2e9f0 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
2ea00 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
2ea10 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
2ea20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
2ea30 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
2ea40 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
2ea50 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
2ea60 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
2ea70 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
2ea80 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
2ea90 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
2eaa0 43 65 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65  Cell.  Write the
2eab0 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73  .** local Cell s
2eac0 69 7a 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20  ize (the number 
2ead0 6f 66 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  of bytes on the 
2eae0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f  original page, o
2eaf0 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66  mitting.** overf
2eb00 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a  low) into *pnSiz
2eb10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2eb20 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65   clearCell(.  Me
2eb30 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
2eb40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
2eb50 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
2eb60 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75   the Cell */.  u
2eb70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
2eb80 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74  ell,    /* First
2eb90 20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c   byte of the Cel
2eba0 6c 20 2a 2f 0a 20 20 75 31 36 20 2a 70 6e 53 69  l */.  u16 *pnSi
2ebb0 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
2ebc0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 69 7a  /* Write the siz
2ebd0 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 68 65  e of the Cell he
2ebe0 72 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  re */.){.  BtSha
2ebf0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2ec00 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
2ec10 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
2ec20 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
2ec30 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
2ec40 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69    u32 ovflPageSi
2ec50 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
2ec60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2ec70 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2ec80 74 65 78 29 20 29 3b 0a 20 20 62 74 72 65 65 50  tex) );.  btreeP
2ec90 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
2eca0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
2ecb0 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e  ;.  *pnSize = in
2ecc0 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 69 66 28 20  fo.nSize;.  if( 
2ecd0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d  info.iOverflow==
2ece0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2ecf0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
2ed00 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
2ed10 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
2ed20 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
2ed30 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65  */.  }.  if( pCe
2ed40 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll+info.iOverflo
2ed50 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61 44 61  w+3 > pPage->aDa
2ed60 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  ta+pPage->maskPa
2ed70 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
2ed80 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2ed90 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65  BKPT;  /* Cell e
2eda0 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20  xtends past end 
2edb0 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20  of page */.  }. 
2edc0 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
2edd0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
2ede0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
2edf0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
2ee00 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20  bleSize > 4 );. 
2ee10 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20   ovflPageSize = 
2ee20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2ee30 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28  - 4;.  nOvfl = (
2ee40 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20  info.nPayload - 
2ee50 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  info.nLocal + ov
2ee60 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
2ee70 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
2ee80 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f  assert( ovflPgno
2ee90 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29  ==0 || nOvfl>0 )
2eea0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
2eeb0 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69  -- ){.    Pgno i
2eec0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65  Next = 0;.    Me
2eed0 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
2eee0 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67  ;.    if( ovflPg
2eef0 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f  no<2 || ovflPgno
2ef00 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  >btreePagecount(
2ef10 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
2ef20 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61   0 is not a lega
2ef30 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  l page number an
2ef40 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20  d page 1 cannot 
2ef50 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  be an .      ** 
2ef60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54  overflow page. T
2ef70 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c  herefore if ovfl
2ef80 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74  Pgno<2 or past t
2ef90 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20  he end of the . 
2efa0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65       ** file the
2efb0 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
2efc0 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  e corrupt. */.  
2efd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2efe0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2eff0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f      }.    if( nO
2f000 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  vfl ){.      rc 
2f010 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
2f020 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c  e(pBt, ovflPgno,
2f030 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29   &pOvfl, &iNext)
2f040 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2f050 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2f060 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76  }..    if( ( pOv
2f070 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20  fl || ((pOvfl = 
2f080 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
2f090 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21  pBt, ovflPgno))!
2f0a0 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71  =0) ).     && sq
2f0b0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
2f0c0 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44  fcount(pOvfl->pD
2f0d0 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b  bPage)!=1.    ){
2f0e0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
2f0f0 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79  is no reason any
2f100 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68   cursor should h
2f110 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69  ave an outstandi
2f120 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20  ng reference .  
2f130 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65      ** to an ove
2f140 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e  rflow page belon
2f150 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74  ging to a cell t
2f160 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c  hat is being del
2f170 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20  eted/updated..  
2f180 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65      ** So if the
2f190 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74  re exists more t
2f1a0 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63  han one referenc
2f1b0 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20  e to this page, 
2f1c0 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a  then it .      *
2f1d0 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c  * must not reall
2f1e0 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  y be an overflow
2f1f0 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61   page and the da
2f200 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
2f210 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a  orrupt. .      *
2f220 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20  * It is helpful 
2f230 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62  to detect this b
2f240 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72  efore calling fr
2f250 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20  eePage2(), as . 
2f260 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65       ** freePage
2f270 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65  2() may zero the
2f280 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69   page contents i
2f290 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  f secure-delete 
2f2a0 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  mode is.      **
2f2b0 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69   enabled. If thi
2f2c0 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67  s 'overflow' pag
2f2d0 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
2f2e0 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a  a page that the.
2f2f0 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
2f300 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  is iterating thr
2f310 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e  ough or using in
2f320 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c   some other way,
2f330 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63   this.      ** c
2f340 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69  an be problemati
2f350 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  c..      */.    
2f360 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2f370 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2f380 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2f390 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c  = freePage2(pBt,
2f3a0 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f   pOvfl, ovflPgno
2f3b0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
2f3c0 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( pOvfl ){.     
2f3d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2f3e0 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
2f3f0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
2f400 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2f410 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d  ;.    ovflPgno =
2f420 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65   iNext;.  }.  re
2f430 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2f440 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
2f450 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63  the byte sequenc
2f460 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  e used to repres
2f470 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61  ent a cell on pa
2f480 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20  ge pPage.** and 
2f490 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20  write that byte 
2f4a0 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43  sequence into pC
2f4b0 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77  ell[].  Overflow
2f4c0 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c   pages are.** al
2f4d0 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c  located and fill
2f4e0 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61  ed in as necessa
2f4f0 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ry.  The calling
2f500 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73   procedure.** is
2f510 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
2f520 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66   making sure suf
2f530 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61  ficient space ha
2f540 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
2f550 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e  .** for pCell[].
2f560 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
2f570 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20   pCell does not 
2f580 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74  necessary need t
2f590 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
2f5a0 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61  Page->aData.** a
2f5b0 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68  rea.  pCell migh
2f5c0 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  t point to some 
2f5d0 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
2f5e0 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c  e.  The cell wil
2f5f0 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63  l.** be construc
2f600 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70  ted in this temp
2f610 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20  orary area then 
2f620 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67  copied into pPag
2f630 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65  e->aData.** late
2f640 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2f650 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d   fillInCell(.  M
2f660 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
2f670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f680 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
2f690 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c  ontains the cell
2f6a0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
2f6b0 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  har *pCell,     
2f6c0 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
2f6d0 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c   text of the cel
2f6e0 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  l */.  const voi
2f6f0 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65  d *pKey, i64 nKe
2f700 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  y,    /* The key
2f710 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2f720 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74   *pData,int nDat
2f730 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  a,   /* The data
2f740 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c   */.  int nZero,
2f750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f760 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65       /* Extra ze
2f770 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65  ro bytes to appe
2f780 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20  nd to pData */. 
2f790 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20   int *pnSize    
2f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7b0 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69  /* Write cell si
2f7c0 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ze here */.){.  
2f7d0 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  int nPayload;.  
2f7e0 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a  const u8 *pSrc;.
2f7f0 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72    int nSrc, n, r
2f800 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65  c;.  int spaceLe
2f810 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ft;.  MemPage *p
2f820 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  Ovfl = 0;.  MemP
2f830 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20  age *pToRelease 
2f840 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  = 0;.  unsigned 
2f850 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20  char *pPrior;.  
2f860 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2f870 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61  Payload;.  BtSha
2f880 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2f890 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67  ->pBt;.  Pgno pg
2f8a0 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e  noOvfl = 0;.  in
2f8b0 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73  t nHeader;..  as
2f8c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2f8d0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2f8e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
2f8f0 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
2f900 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
2f910 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
2f920 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
2f930 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
2f940 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
2f950 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
2f960 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
2f970 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
2f980 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
2f990 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
2f9a0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2f9b0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2f9c0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2f9d0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2f9e0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2f9f0 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  e) );..  /* Fill
2fa00 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
2fa10 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 70  */.  nHeader = p
2fa20 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
2fa30 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d  ze;.  nPayload =
2fa40 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a   nData + nZero;.
2fa50 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
2fa60 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 6e  KeyLeaf ){.    n
2fa70 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
2fa80 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65  int32(&pCell[nHe
2fa90 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29  ader], nPayload)
2faa0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2fab0 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 30 20  ssert( nData==0 
2fac0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2fad0 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20  Zero==0 );.  }. 
2fae0 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
2faf0 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
2fb00 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e  ader], *(u64*)&n
2fb10 4b 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69  Key);.  .  /* Fi
2fb20 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
2fb30 64 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28 20  d size */.  if( 
2fb40 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
2fb50 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74  .    pSrc = pDat
2fb60 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  a;.    nSrc = nD
2fb70 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d  ata;.    nData =
2fb80 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20   0;.  }else{ .  
2fb90 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79    if( NEVER(nKey
2fba0 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70  >0x7fffffff || p
2fbb0 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  Key==0) ){.     
2fbc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2fbd0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2fbe0 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
2fbf0 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20  = (int)nKey;.   
2fc00 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20   pSrc = pKey;.  
2fc10 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b    nSrc = (int)nK
2fc20 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  ey;.  }.  if( nP
2fc30 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
2fc40 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e  axLocal ){.    n
2fc50 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61   = nHeader + nPa
2fc60 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63  yload;.    testc
2fc70 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20  ase( n==3 );.   
2fc80 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20   testcase( n==4 
2fc90 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29  );.    if( n<4 )
2fca0 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53   n = 4;.    *pnS
2fcb0 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61  ize = n;.    spa
2fcc0 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61  ceLeft = nPayloa
2fcd0 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  d;.    pPrior = 
2fce0 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCell;.  }else{.
2fcf0 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61      int mn = pPa
2fd00 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
2fd10 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79    n = mn + (nPay
2fd20 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50  load - mn) % (pP
2fd30 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2fd40 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
2fd50 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67  estcase( n==pPag
2fd60 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
2fd70 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
2fd80 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
2fd90 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e  1 );.    if( n >
2fda0 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
2fdb0 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73   ) n = mn;.    s
2fdc0 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20  paceLeft = n;.  
2fdd0 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20    *pnSize = n + 
2fde0 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 20  nHeader + 4;.   
2fdf0 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
2fe00 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d  [nHeader+n];.  }
2fe10 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70  .  pPayload = &p
2fe20 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a  Cell[nHeader];..
2fe30 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
2fe40 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f  nt variables sho
2fe50 75 6c 64 20 62 65 20 73 65 74 20 61 73 20 66 6f  uld be set as fo
2fe60 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
2fe70 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20     nPayload     
2fe80 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c        Total payl
2fe90 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65  oad size in byte
2fea0 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61  s.  **   pPayloa
2feb0 64 20 20 20 20 20 20 20 20 20 20 20 42 65 67 69  d           Begi
2fec0 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61  n writing payloa
2fed0 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70  d here.  **   sp
2fee0 61 63 65 4c 65 66 74 20 20 20 20 20 20 20 20 20  aceLeft         
2fef0 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   Space available
2ff00 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49   at pPayload.  I
2ff10 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65  f nPayload>space
2ff20 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20  Left,.  **      
2ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff40 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65  that means conte
2ff50 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e  nt must spill in
2ff60 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
2ff70 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a  s..  **   *pnSiz
2ff80 65 20 20 20 20 20 20 20 20 20 20 20 20 53 69 7a  e            Siz
2ff90 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63  e of the local c
2ffa0 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ell (not countin
2ffb0 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  g overflow pages
2ffc0 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20  ).  **   pPrior 
2ffd0 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65 72              Wher
2ffe0 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 70  e to write the p
2fff0 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74  gno of the first
30000 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
30010 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63   **.  ** Use a c
30020 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73  all to btreePars
30030 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65  eCellPtr() to ve
30040 72 69 66 79 20 74 68 61 74 20 74 68 65 20 76 61  rify that the va
30050 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20  lues above.  ** 
30060 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f  were computed co
30070 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69  rrectly..  */.#i
30080 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
30090 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20   {.    CellInfo 
300a0 69 6e 66 6f 3b 0a 20 20 20 20 62 74 72 65 65 50  info;.    btreeP
300b0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
300c0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
300d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 48  ;.    assert( nH
300e0 65 61 64 65 72 3d 28 69 6e 74 29 28 69 6e 66 6f  eader=(int)(info
300f0 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c  .pPayload - pCel
30100 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  l) );.    assert
30110 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65  ( info.nKey==nKe
30120 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  y );.    assert(
30130 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f   *pnSize == info
30140 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  .nSize );.    as
30150 73 65 72 74 28 20 73 70 61 63 65 4c 65 66 74 20  sert( spaceLeft 
30160 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  == info.nLocal )
30170 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
30180 72 69 6f 72 20 3d 3d 20 26 70 43 65 6c 6c 5b 69  rior == &pCell[i
30190 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 20 29  nfo.iOverflow] )
301a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
301b0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 79  /* Write the pay
301c0 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f  load into the lo
301d0 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79  cal Cell and any
301e0 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72   extra into over
301f0 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20  flow pages */.  
30200 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
30210 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
30220 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
30230 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
30240 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
30250 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
30260 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
30270 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
30280 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
30290 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
302a0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
302b0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
302c0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
302d0 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
302e0 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
302f0 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
30300 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
30310 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
30320 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
30330 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
30340 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
30350 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
30360 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
30370 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
30380 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
30390 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
303a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
303b0 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
303c0 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
303d0 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
303e0 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
303f0 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
30400 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
30410 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
30420 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
30430 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
30440 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
30450 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
30460 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
30470 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
30480 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
30490 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
304a0 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
304b0 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
304c0 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
304d0 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
304e0 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
304f0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
30500 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
30510 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
30520 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
30530 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
30540 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
30550 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
30560 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
30570 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ized values and 
30580 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
30590 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
305a0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
305b0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
305c0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
305d0 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
305e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
305f0 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
30600 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
30610 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
30620 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
30630 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
30640 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
30650 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c  ype, pgnoPtrmap,
30660 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
30670 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
30680 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
30690 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
306a0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
306b0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
306c0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
306d0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
306e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
306f0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
30700 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
30710 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
30720 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e  than pPrior poin
30730 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
30740 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f   area.      ** o
30750 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
30760 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
30770 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
30780 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  teable. */.     
30790 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
307a0 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
307b0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
307c0 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
307d0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
307e0 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73   /* If pPrior is
307f0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
30800 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
30810 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
30820 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69  pPage.      ** i
30830 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
30840 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
30850 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d  t( pPrior<pPage-
30860 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72  >aData || pPrior
30870 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
30880 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
30890 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
308a0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
308b0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
308c0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
308d0 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
308e0 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
308f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
30900 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
30910 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
30920 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
30930 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
30940 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
30950 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
30960 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
30970 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
30980 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
30990 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
309a0 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
309b0 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
309c0 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
309d0 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
309e0 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
309f0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
30a00 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
30a10 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
30a20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
30a30 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
30a40 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
30a50 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
30a60 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
30a70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
30a80 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
30a90 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
30aa0 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
30ab0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
30ac0 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
30ad0 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
30ae0 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
30af0 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
30b00 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
30b10 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
30b20 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
30b30 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
30b40 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
30b50 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
30b60 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
30b70 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
30b80 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
30b90 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
30ba0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
30bb0 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a    if( nSrc>0 ){.
30bc0 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63        if( n>nSrc
30bd0 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
30be0 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
30bf0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
30c00 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
30c10 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
30c20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
30c30 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
30c40 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
30c50 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
30c60 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
30c70 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
30c80 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
30c90 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
30ca0 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( nSrc==0 ){.  
30cb0 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
30cc0 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  ;.      pSrc = p
30cd0 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
30ce0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
30cf0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
30d00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
30d10 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
30d20 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
30d30 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
30d40 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
30d50 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
30d60 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
30d70 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
30d80 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
30d90 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
30da0 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
30db0 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
30dc0 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
30dd0 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
30de0 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
30df0 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
30e00 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
30e10 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
30e20 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
30e30 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
30e40 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
30e50 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
30e60 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
30e70 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
30e80 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a   sz, int *pRC){.
30e90 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20    u32 pc;       
30ea0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
30eb0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
30ec0 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
30ed0 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
30ee0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
30ef0 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
30f00 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
30f10 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
30f20 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
30f30 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
30f40 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
30f50 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
30f60 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
30f70 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
30f80 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20   of the header. 
30f90 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20   0 most pages.  
30fa0 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20  100 page 1 */.. 
30fb0 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
30fc0 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rn;..  assert( i
30fd0 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
30fe0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
30ff0 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
31000 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
31010 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
31020 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
31030 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
31040 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
31050 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
31060 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
31070 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
31080 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
31090 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65  ;.  ptr = &pPage
310a0 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78  ->aCellIdx[2*idx
310b0 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
310c0 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d  te(ptr);.  hdr =
310d0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
310e0 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  t;.  testcase( p
310f0 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  c==get2byte(&dat
31100 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74  a[hdr+5]) );.  t
31110 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
31120 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
31130 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  leSize );.  if( 
31140 70 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79  pc < (u32)get2by
31150 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
31160 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67   || pc+sz > pPag
31170 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
31180 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  ze ){.    *pRC =
31190 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
311a0 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
311b0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65  ;.  }.  rc = fre
311c0 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
311d0 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20  , sz);.  if( rc 
311e0 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63  ){.    *pRC = rc
311f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
31200 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
31210 2d 2d 3b 0a 20 20 6d 65 6d 6d 6f 76 65 28 70 74  --;.  memmove(pt
31220 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61  r, ptr+2, 2*(pPa
31230 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29  ge->nCell - idx)
31240 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
31250 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
31260 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61  e->nCell);.  pPa
31270 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a  ge->nFree += 2;.
31280 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
31290 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50  a new cell on pP
312a0 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65  age at cell inde
312b0 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f  x "i".  pCell po
312c0 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ints to the.** c
312d0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65  ontent of the ce
312e0 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
312f0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69   cell content wi
31300 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  ll fit on the pa
31310 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20  ge, then put it 
31320 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a  there.  If it.**
31330 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74   will not fit, t
31340 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  hen make a copy 
31350 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
31360 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69  ent into pTemp i
31370 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f  f.** pTemp is no
31380 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c  t null.  Regardl
31390 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c  ess of pTemp, al
313a0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74  locate a new ent
313b0 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e  ry.** in pPage->
313c0 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b  apOvfl[] and mak
313d0 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  e it point to th
313e0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28  e cell content (
313f0 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65  either.** in pTe
31400 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  mp or the origin
31410 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c  al pCell) and al
31420 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e  so record its in
31430 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74  dex. .** Allocat
31440 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ing a new entry 
31450 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b  in pPage->aCell[
31460 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a  ] implies that .
31470 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ** pPage->nOverf
31480 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  low is increment
31490 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
314a0 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20  id insertCell(. 
314b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
314c0 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20     /* Page into 
314d0 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70  which we are cop
314e0 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ying */.  int i,
314f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
31500 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20  ew cell becomes 
31510 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66  the i-th cell of
31520 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
31530 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
31540 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
31550 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20  he new cell */. 
31560 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20   int sz,        
31570 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63     /* Bytes of c
31580 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20  ontent in pCell 
31590 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20  */.  u8 *pTemp, 
315a0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
315b0 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72  torage space for
315c0 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65   pCell, if neede
315d0 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69  d */.  Pgno iChi
315e0 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e  ld,      /* If n
315f0 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65  on-zero, replace
31600 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 77   first 4 bytes w
31610 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a  ith this value *
31620 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20  /.  int *pRC    
31630 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e        /* Read an
31640 64 20 77 72 69 74 65 20 72 65 74 75 72 6e 20 63  d write return c
31650 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f  ode from here */
31660 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20  .){.  int idx = 
31670 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  0;      /* Where
31680 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65   to write new ce
31690 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61  ll content in da
316a0 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ta[] */.  int j;
316b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
316c0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
316d0 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20   int end;       
316e0 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
316f0 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 63   past the last c
31700 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
31710 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ata[] */.  int i
31720 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ns;          /* 
31730 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20  Index in data[] 
31740 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70  where new cell p
31750 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74  ointer is insert
31760 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ed */.  int cell
31770 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64  Offset;   /* Add
31780 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63 65  ress of first ce
31790 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61  ll pointer in da
317a0 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61  ta[] */.  u8 *da
317b0 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ta;         /* T
317c0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
317d0 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a  e whole page */.
317e0 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
317f0 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
31800 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67   i>=0 && i<=pPag
31810 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e  e->nCell+pPage->
31820 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61  nOverflow );.  a
31830 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70  ssert( MX_CELL(p
31840 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32  Page->pBt)<=1092
31850 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
31860 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f  Page->nCell<=MX_
31870 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
31880 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
31890 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
318a0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72  e->nOverflow<=Ar
318b0 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
318c0 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  pOvfl) );.  asse
318d0 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 50  rt( ArraySize(pP
318e0 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72  age->apOvfl)==Ar
318f0 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
31900 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  iOvfl) );.  asse
31910 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
31920 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
31930 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
31940 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c  * The cell shoul
31950 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69  d normally be si
31960 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  zed correctly.  
31970 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f  However, when mo
31980 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66  ving a.  ** malf
31990 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20  ormed cell from 
319a0 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61  a leaf page to a
319b0 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c  n interior page,
319c0 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a   if the cell siz
319d0 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f  e.  ** wanted to
319e0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20   be less than 4 
319f0 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20  but got rounded 
31a00 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c  up to 4 on the l
31a10 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20  eaf, then size. 
31a20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73   ** might be les
31a30 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73  s than 8 (leaf-s
31a40 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f  ize + pointer) o
31a50 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e  n the interior n
31a60 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a  ode.  Hence.  **
31a70 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20   the term after 
31a80 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f  the || in the fo
31a90 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
31aa0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  . */.  assert( s
31ab0 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  z==cellSizePtr(p
31ac0 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20  Page, pCell) || 
31ad0 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64  (sz==8 && iChild
31ae0 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  >0) );.  if( pPa
31af0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c  ge->nOverflow ||
31b00 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72   sz+2>pPage->nFr
31b10 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  ee ){.    if( pT
31b20 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  emp ){.      mem
31b30 63 70 79 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c  cpy(pTemp, pCell
31b40 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 70 43 65  , sz);.      pCe
31b50 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
31b60 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  }.    if( iChild
31b70 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
31b80 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64  te(pCell, iChild
31b90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d  );.    }.    j =
31ba0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
31bb0 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  w++;.    assert(
31bc0 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   j<(int)(sizeof(
31bd0 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73  pPage->apOvfl)/s
31be0 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f  izeof(pPage->apO
31bf0 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20  vfl[0])) );.    
31c00 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d  pPage->apOvfl[j]
31c10 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
31c20 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d  age->aiOvfl[j] =
31c30 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65   (u16)i;.  }else
31c40 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
31c50 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31c60 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
31c70 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
31c80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31c90 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
31ca0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
31cb0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
31cc0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
31cd0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
31ce0 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
31cf0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
31d00 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d      cellOffset =
31d10 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
31d20 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65  et;.    end = ce
31d30 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
31d40 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
31d50 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  ns = cellOffset 
31d60 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20  + 2*i;.    rc = 
31d70 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50  allocateSpace(pP
31d80 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a  age, sz, &idx);.
31d90 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70      if( rc ){ *p
31da0 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b  RC = rc; return;
31db0 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c   }.    /* The al
31dc0 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72 6f  locateSpace() ro
31dd0 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73  utine guarantees
31de0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
31df0 77 6f 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20  wo properties.  
31e00 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72    ** if it retur
31e10 6e 73 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20  ns success */.  
31e20 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d    assert( idx >=
31e30 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61 73   end+2 );.    as
31e40 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20  sert( idx+sz <= 
31e50 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
31e60 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
31e70 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
31e80 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  +;.    pPage->nF
31e90 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b  ree -= (u16)(2 +
31ea0 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79   sz);.    memcpy
31eb0 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 70 43 65  (&data[idx], pCe
31ec0 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 69 66 28  ll, sz);.    if(
31ed0 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   iChild ){.     
31ee0 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
31ef0 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20  idx], iChild);. 
31f00 20 20 20 7d 0a 20 20 20 20 6d 65 6d 6d 6f 76 65     }.    memmove
31f10 28 26 64 61 74 61 5b 69 6e 73 2b 32 5d 2c 20 26  (&data[ins+2], &
31f20 64 61 74 61 5b 69 6e 73 5d 2c 20 65 6e 64 2d 69  data[ins], end-i
31f30 6e 73 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  ns);.    put2byt
31f40 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64  e(&data[ins], id
31f50 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  x);.    put2byte
31f60 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  (&data[pPage->hd
31f70 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67  rOffset+3], pPag
31f80 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64  e->nCell);.#ifnd
31f90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
31fa0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
31fb0 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75  ( pPage->pBt->au
31fc0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
31fd0 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61    /* The cell ma
31fe0 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e  y contain a poin
31ff0 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  ter to an overfl
32000 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20  ow page. If so, 
32010 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  write.      ** t
32020 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
32030 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
32040 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
32050 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  map..      */.  
32060 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66      ptrmapPutOvf
32070 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
32080 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23  l, pRC);.    }.#
32090 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  endif.  }.}../*.
320a0 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66  ** Add a list of
320b0 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65   cells to a page
320c0 2e 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75  .  The page shou
320d0 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20  ld be initially 
320e0 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65  empty..** The ce
320f0 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lls are guarante
32100 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ed to fit on the
32110 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
32120 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61   void assemblePa
32130 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
32140 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70  Page,   /* The p
32150 61 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62  age to be assemb
32160 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  led */.  int nCe
32170 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ll,        /* Th
32180 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  e number of cell
32190 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73  s to add to this
321a0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
321b0 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20  apCell,      /* 
321c0 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c  Pointers to cell
321d0 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36   bodies */.  u16
321e0 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f   *aSize        /
321f0 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63  * Sizes of the c
32200 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ells */.){.  int
32210 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
32220 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
32230 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  /.  u8 *pCellptr
32240 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
32250 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f   of next cell po
32260 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  inter */.  int c
32270 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20  ellbody;     /* 
32280 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
32290 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75  cell body */.  u
322a0 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d  8 * const data =
322b0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20   pPage->aData;  
322c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
322d0 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f  inter to data fo
322e0 72 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e  r pPage */.  con
322f0 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  st int hdr = pPa
32300 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ge->hdrOffset;  
32310 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
32320 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20  et of header on 
32330 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pPage */.  const
32340 20 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70   int nUsable = p
32350 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
32360 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65  eSize; /* Usable
32370 20 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f   size of page */
32380 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
32390 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
323a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
323b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
323c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
323d0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
323e0 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c  nCell>=0 && nCel
323f0 6c 3c 3d 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28  l<=(int)MX_CELL(
32400 70 50 61 67 65 2d 3e 70 42 74 29 0a 20 20 20 20  pPage->pBt).    
32410 20 20 20 20 20 20 20 20 26 26 20 28 69 6e 74 29          && (int)
32420 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
32430 42 74 29 3c 3d 31 30 39 32 31 29 3b 0a 20 20 61  Bt)<=10921);.  a
32440 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
32450 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
32460 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
32470 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
32480 61 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20  at the page has 
32490 6a 75 73 74 20 62 65 65 6e 20 7a 65 72 6f 65 64  just been zeroed
324a0 20 62 79 20 7a 65 72 6f 50 61 67 65 28 29 20 2a   by zeroPage() *
324b0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
324c0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
324d0 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74   assert( get2byt
324e0 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
324f0 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20  dr+5])==nUsable 
32500 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d  );..  pCellptr =
32510 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64   &pPage->aCellId
32520 78 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65  x[nCell*2];.  ce
32530 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65  llbody = nUsable
32540 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d  ;.  for(i=nCell-
32550 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
32560 20 20 20 75 31 36 20 73 7a 20 3d 20 61 53 69 7a     u16 sz = aSiz
32570 65 5b 69 5d 3b 0a 20 20 20 20 70 43 65 6c 6c 70  e[i];.    pCellp
32580 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c  tr -= 2;.    cel
32590 6c 62 6f 64 79 20 2d 3d 20 73 7a 3b 0a 20 20 20  lbody -= sz;.   
325a0 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70   put2byte(pCellp
325b0 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  tr, cellbody);. 
325c0 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
325d0 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c  cellbody], apCel
325e0 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 7d 0a 20  l[i], sz);.  }. 
325f0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
32600 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a  hdr+3], nCell);.
32610 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
32620 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64  [hdr+5], cellbod
32630 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  y);.  pPage->nFr
32640 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b  ee -= (nCell*2 +
32650 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62   nUsable - cellb
32660 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ody);.  pPage->n
32670 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c  Cell = (u16)nCel
32680 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  l;.}../*.** The 
32690 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65  following parame
326a0 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68  ters determine h
326b0 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74  ow many adjacent
326c0 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c   pages get invol
326d0 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61  ved.** in a bala
326e0 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
326f0 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62    NN is the numb
32700 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
32710 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a  on either side.*
32720 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  * of the page th
32730 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69  at participate i
32740 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20  n the balancing 
32750 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69  operation.  NB i
32760 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e  s the.** total n
32770 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
32780 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c  hat participate,
32790 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
327a0 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a  arget page and.*
327b0 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f  * NN neighbors o
327c0 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a  n either side..*
327d0 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d  *.** The minimum
327e0 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20   value of NN is 
327f0 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20  1 (of course).  
32800 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62  Increasing NN ab
32810 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f  ove 1.** (to 2 o
32820 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64  r 3) gives a mod
32830 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  est improvement 
32840 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45  in SELECT and DE
32850 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  LETE performance
32860 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20  .** in exchange 
32870 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67  for a larger deg
32880 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45  radation in INSE
32890 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65  RT and UPDATE pe
328a0 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
328b0 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70  e value of NN ap
328c0 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68  pears to give th
328d0 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f  e best results o
328e0 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69  verall..*/.#defi
328f0 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20  ne NN 1         
32900 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
32910 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
32920 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
32930 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42  ge */.#define NB
32940 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f   (NN*2+1)      /
32950 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e  * Total pages in
32960 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61  volved in the ba
32970 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64  lance */...#ifnd
32980 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
32990 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a  UICKBALANCE./*.*
329a0 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
329b0 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64  f balance() hand
329c0 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73  les the common s
329d0 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
329e0 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79  e.** a new entry
329f0 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74   is being insert
32a00 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d  ed on the extrem
32a10 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74  e right-end of t
32a20 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f  he.** tree, in o
32a30 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e  ther words, when
32a40 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
32a50 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c  ill become the l
32a60 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20  argest.** entry 
32a70 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a  in the tree..**.
32a80 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72  ** Instead of tr
32a90 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65 20  ying to balance 
32aa0 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74  the 3 right-most
32ab0 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73   leaf pages, jus
32ac0 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70  t add.** a new p
32ad0 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  age to the right
32ae0 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70  -hand side and p
32af0 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65  ut the one new e
32b00 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20  ntry in.** that 
32b10 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76  page.  This leav
32b20 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64  es the right sid
32b30 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f  e of the tree so
32b40 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61  mewhat.** unbala
32b50 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20  nced.  But odds 
32b60 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c  are that we will
32b70 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65   be inserting ne
32b80 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20  w entries.** at 
32b90 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74  the end soon aft
32ba0 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e  erwards so the n
32bb0 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65  early empty page
32bc0 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a   will quickly.**
32bd0 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76   fill up.  On av
32be0 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  erage..**.** pPa
32bf0 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70  ge is the leaf p
32c00 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65  age which is the
32c10 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65   right-most page
32c20 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
32c30 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20   pParent is its 
32c40 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d  parent.  pPage m
32c50 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c  ust have a singl
32c60 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79  e overflow entry
32c70 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73  .** which is als
32c80 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
32c90 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61   entry on the pa
32ca0 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53  ge..**.** The pS
32cb0 70 61 63 65 20 62 75 66 66 65 72 20 69 73 20 75  pace buffer is u
32cc0 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 74  sed to store a t
32cd0 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f 66  emporary copy of
32ce0 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a 20   the divider.** 
32cf0 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62  cell that will b
32d00 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
32d10 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20  pParent. Such a 
32d20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
32d30 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61 67   a 4.** byte pag
32d40 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65  e number followe
32d50 64 20 62 79 20 61 20 76 61 72 69 61 62 6c 65 20  d by a variable 
32d60 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20  length integer. 
32d70 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
32d80 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79  s, at most 13 by
32d90 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70  tes. Hence the p
32da0 53 70 61 63 65 20 62 75 66 66 65 72 20 6d 75 73  Space buffer mus
32db0 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74  t be at.** least
32dc0 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a   13 bytes in siz
32dd0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
32de0 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d   balance_quick(M
32df0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
32e00 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
32e10 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20 20   u8 *pSpace){.  
32e20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74 20  BtShared *const 
32e30 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
32e40 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 44  ;    /* B-Tree D
32e50 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d  atabase */.  Mem
32e60 50 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20 20  Page *pNew;     
32e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e80 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63    /* Newly alloc
32e90 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69  ated page */.  i
32ea0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
32eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ec0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
32ed0 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  de */.  Pgno pgn
32ee0 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  oNew;           
32ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32f00 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70  Page number of p
32f10 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  New */..  assert
32f20 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
32f30 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
32f40 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
32f50 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
32f60 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
32f70 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
32f80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
32f90 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  e->nOverflow==1 
32fa0 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 65 72  );..  /* This er
32fb0 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  ror condition is
32fc0 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f   now caught prio
32fd0 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68  r to reaching th
32fe0 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
32ff0 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
33000 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
33010 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
33020 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  T;..  /* Allocat
33030 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68  e a new page. Th
33040 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
33050 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73 69  ome the right-si
33060 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70  bling of .  ** p
33070 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70  Page. Make the p
33080 61 72 65 6e 74 20 70 61 67 65 20 77 72 69 74 61  arent page writa
33090 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65  ble, so that the
330a0 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
330b0 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  l.  ** may be in
330c0 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68 20  serted. If both 
330d0 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73  these operations
330e0 20 61 72 65 20 73 75 63 63 65 73 73 66 75 6c 2c   are successful,
330f0 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
33100 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
33110 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
33120 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c  ew, &pgnoNew, 0,
33130 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d   0);..  if( rc==
33140 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20  SQLITE_OK ){..  
33150 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 53    u8 *pOut = &pS
33160 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20  pace[4];.    u8 
33170 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e  *pCell = pPage->
33180 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 75  apOvfl[0];.    u
33190 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c  16 szCell = cell
331a0 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
331b0 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70  Cell);.    u8 *p
331c0 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72  Stop;..    asser
331d0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
331e0 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d  swriteable(pNew-
331f0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
33200 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
33210 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49  aData[0]==(PTF_I
33220 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
33230 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a  TA|PTF_LEAF) );.
33240 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
33250 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  w, PTF_INTKEY|PT
33260 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c  F_LEAFDATA|PTF_L
33270 45 41 46 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  EAF);.    assemb
33280 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20  lePage(pNew, 1, 
33290 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29  &pCell, &szCell)
332a0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
332b0 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
332c0 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
332d0 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
332e0 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68   map.    ** with
332f0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
33300 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61   new page, and a
33310 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  ny pointer from 
33320 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  the .    ** cell
33330 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20   on the page to 
33340 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
33350 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  . If either of t
33360 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72  hese.    ** oper
33370 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68  ations fails, th
33380 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  e return code is
33390 20 73 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f   set, but the co
333a0 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ntents.    ** of
333b0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
333c0 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70   are still manip
333d0 75 6c 61 74 65 64 20 62 79 20 74 68 68 20 63 6f  ulated by thh co
333e0 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  de below..    **
333f0 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20   That is Ok, at 
33400 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
33410 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 67 75  arent page is gu
33420 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20  aranteed to.    
33430 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
33440 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67  dirty. Returning
33450 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
33460 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20  ill cause a.    
33470 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64  ** rollback, und
33480 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73  oing any changes
33490 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61 72   made to the par
334a0 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
334b0 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
334c0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70  ACUUM ){.      p
334d0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
334e0 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54  noNew, PTRMAP_BT
334f0 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  REE, pParent->pg
33500 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
33510 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d  if( szCell>pNew-
33520 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >minLocal ){.   
33530 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
33540 66 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c  flPtr(pNew, pCel
33550 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d  l, &rc);.      }
33560 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
33570 20 43 72 65 61 74 65 20 61 20 64 69 76 69 64 65   Create a divide
33580 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74  r cell to insert
33590 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54   into pParent. T
335a0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a  he divider cell.
335b0 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20      ** consists 
335c0 6f 66 20 61 20 34 2d 62 79 74 65 20 70 61 67 65  of a 4-byte page
335d0 20 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61 67   number (the pag
335e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67  e number of pPag
335f0 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20  e) and.    ** a 
33600 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
33610 6b 65 79 20 76 61 6c 75 65 20 28 77 68 69 63 68  key value (which
33620 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
33630 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20  e value as the. 
33640 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65     ** largest ke
33650 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20  y on pPage)..   
33660 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69   **.    ** To fi
33670 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  nd the largest k
33680 65 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67  ey value on pPag
33690 65 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74 68  e, first find th
336a0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20  e right-most .  
336b0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61    ** cell on pPa
336c0 67 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 77  ge. The first tw
336d0 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73  o fields of this
336e0 20 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20   cell are the . 
336f0 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e     ** record-len
33700 67 74 68 20 28 61 20 76 61 72 69 61 62 6c 65 20  gth (a variable 
33710 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61  length integer a
33720 74 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69  t most 32-bits i
33730 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61  n size).    ** a
33740 6e 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  nd the key value
33750 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e   (a variable len
33760 67 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79  gth integer, may
33770 20 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29   have any value)
33780 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72  ..    ** The fir
33790 73 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28  st of the while(
337a0 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77  ...) loops below
337b0 20 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20   skips over the 
337c0 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20  record-length.  
337d0 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20    ** field. The 
337e0 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e  second while(...
337f0 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68  ) loop copies th
33800 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d  e key value from
33810 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c   the.    ** cell
33820 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74   on pPage into t
33830 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
33840 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65  ..    */.    pCe
33850 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
33860 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  age, pPage->nCel
33870 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  l-1);.    pStop 
33880 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
33890 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c   while( (*(pCell
338a0 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70 43 65  ++)&0x80) && pCe
338b0 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20  ll<pStop );.    
338c0 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39  pStop = &pCell[9
338d0 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28  ];.    while( ((
338e0 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43  *(pOut++) = *(pC
338f0 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26  ell++))&0x80) &&
33900 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a   pCell<pStop );.
33910 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
33920 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
33930 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ell into pParent
33940 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43  . */.    insertC
33950 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 50 61  ell(pParent, pPa
33960 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70  rent->nCell, pSp
33970 61 63 65 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d  ace, (int)(pOut-
33980 70 53 70 61 63 65 29 2c 0a 20 20 20 20 20 20 20  pSpace),.       
33990 20 20 20 20 20 20 20 20 30 2c 20 70 50 61 67 65          0, pPage
339a0 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20  ->pgno, &rc);.. 
339b0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69     /* Set the ri
339c0 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  ght-child pointe
339d0 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20  r of pParent to 
339e0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
339f0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75   page. */.    pu
33a00 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
33a10 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
33a20 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
33a30 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f  noNew);.  .    /
33a40 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65  * Release the re
33a50 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e  ference to the n
33a60 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ew page. */.    
33a70 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
33a80 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
33a90 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
33aa0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
33ab0 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69  CKBALANCE */..#i
33ac0 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  f 0./*.** This f
33ad0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
33ae0 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74   contribute anyt
33af0 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72  hing to the oper
33b00 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e  ation of SQLite.
33b10 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69  .** it is someti
33b20 6d 65 73 20 61 63 74 69 76 61 74 65 64 20 74 65  mes activated te
33b30 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20  mporarily while 
33b40 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72  debugging code r
33b50 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66  esponsible .** f
33b60 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74  or setting point
33b70 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a  er-map entries..
33b80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
33b90 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d  rmapCheckPages(M
33ba0 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c  emPage **apPage,
33bb0 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69   int nPage){.  i
33bc0 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69  nt i, j;.  for(i
33bd0 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b  =0; i<nPage; i++
33be0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20  ){.    Pgno n;. 
33bf0 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d     u8 e;.    Mem
33c00 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70  Page *pPage = ap
33c10 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53  Page[i];.    BtS
33c20 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
33c30 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73  ge->pBt;.    ass
33c40 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
33c50 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a  it );..    for(j
33c60 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; j<pPage->nCe
33c70 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; j++){.      
33c80 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
33c90 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20       u8 *z;.    
33ca0 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64   .      z = find
33cb0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a  Cell(pPage, j);.
33cc0 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
33cd0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a  CellPtr(pPage, z
33ce0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
33cf0 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
33d00 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ow ){.        Pg
33d10 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79  no ovfl = get4by
33d20 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72  te(&z[info.iOver
33d30 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20  flow]);.        
33d40 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f  ptrmapGet(pBt, o
33d50 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  vfl, &e, &n);.  
33d60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
33d70 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
33d80 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
33d90 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OW1 );.      }. 
33da0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
33db0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
33dc0 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65   Pgno child = ge
33dd0 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20  t4byte(z);.     
33de0 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
33df0 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29  , child, &e, &n)
33e00 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
33e10 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ( n==pPage->pgno
33e20 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54   && e==PTRMAP_BT
33e30 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  REE );.      }. 
33e40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50     }.    if( !pP
33e50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
33e60 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20     Pgno child = 
33e70 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
33e80 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
33e90 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
33ea0 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
33eb0 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29  , child, &e, &n)
33ec0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
33ed0 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
33ee0 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  & e==PTRMAP_BTRE
33ef0 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  E );.    }.  }. 
33f00 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
33f10 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
33f20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
33f30 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e   to copy the con
33f40 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74  tents of the b-t
33f50 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20  ree node stored 
33f60 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f  .** on page pFro
33f70 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49  m to page pTo. I
33f80 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73  f page pFrom was
33f90 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65   not a leaf page
33fa0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f  , then.** the po
33fb0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
33fc0 73 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64  s for each child
33fd0 20 70 61 67 65 20 61 72 65 20 75 70 64 61 74 65   page are update
33fe0 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  d so that the.**
33ff0 20 70 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f   parent page sto
34000 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  red in the point
34010 65 72 20 6d 61 70 20 69 73 20 70 61 67 65 20 70  er map is page p
34020 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e  To. If pFrom con
34030 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65  tained.** any ce
34040 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f  lls with overflo
34050 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c  w page pointers,
34060 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73   then the corres
34070 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a  ponding pointer.
34080 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61  ** map entries a
34090 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20  re also updated 
340a0 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 72 65  so that the pare
340b0 6e 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20  nt page is page 
340c0 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46  pTo..**.** If pF
340d0 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79  rom is currently
340e0 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76   carrying any ov
340f0 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e  erflow cells (en
34100 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20  tries in the.** 
34110 4d 65 6d 50 61 67 65 2e 61 70 4f 76 66 6c 5b 5d  MemPage.apOvfl[]
34120 20 61 72 72 61 79 29 2c 20 74 68 65 79 20 61 72   array), they ar
34130 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20  e not copied to 
34140 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  pTo. .**.** Befo
34150 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61  re returning, pa
34160 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74  ge pTo is reinit
34170 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62 74  ialized using bt
34180 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a  reeInitPage()..*
34190 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d  *.** The perform
341a0 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e  ance of this fun
341b0 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69  ction is not cri
341c0 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c  tical. It is onl
341d0 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68  y used by .** th
341e0 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  e balance_shallo
341f0 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63  wer() and balanc
34200 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63 65  e_deeper() proce
34210 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f  dures, neither o
34220 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63  f.** which are c
34230 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65  alled often unde
34240 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73  r normal circums
34250 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tances..*/.stati
34260 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43  c void copyNodeC
34270 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a  ontent(MemPage *
34280 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a  pFrom, MemPage *
34290 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  pTo, int *pRC){.
342a0 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
342b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42  LITE_OK ){.    B
342c0 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74 20  tShared * const 
342d0 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74  pBt = pFrom->pBt
342e0 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74  ;.    u8 * const
342f0 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e   aFrom = pFrom->
34300 61 44 61 74 61 3b 0a 20 20 20 20 75 38 20 2a 20  aData;.    u8 * 
34310 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d  const aTo = pTo-
34320 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20  >aData;.    int 
34330 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d  const iFromHdr =
34340 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65   pFrom->hdrOffse
34350 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  t;.    int const
34360 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d   iToHdr = ((pTo-
34370 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20  >pgno==1) ? 100 
34380 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72 63  : 0);.    int rc
34390 3b 0a 20 20 20 20 69 6e 74 20 69 44 61 74 61 3b  ;.    int iData;
343a0 0a 20 20 0a 20 20 0a 20 20 20 20 61 73 73 65 72  .  .  .    asser
343b0 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74  t( pFrom->isInit
343c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
343d0 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54  pFrom->nFree>=iT
343e0 6f 48 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65  oHdr );.    asse
343f0 72 74 28 20 67 65 74 32 62 79 74 65 28 26 61 46  rt( get2byte(&aF
34400 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29  rom[iFromHdr+5])
34410 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73   <= (int)pBt->us
34420 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20  ableSize );.  . 
34430 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62     /* Copy the b
34440 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65  -tree node conte
34450 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72  nt from page pFr
34460 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20  om to page pTo. 
34470 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20 67  */.    iData = g
34480 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69  et2byte(&aFrom[i
34490 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20  FromHdr+5]);.   
344a0 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44 61   memcpy(&aTo[iDa
344b0 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74  ta], &aFrom[iDat
344c0 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  a], pBt->usableS
344d0 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20 20  ize-iData);.    
344e0 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f 48  memcpy(&aTo[iToH
344f0 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f  dr], &aFrom[iFro
34500 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65  mHdr], pFrom->ce
34510 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46 72  llOffset + 2*pFr
34520 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20  om->nCell);.  . 
34530 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69     /* Reinitiali
34540 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20 74  ze page pTo so t
34550 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
34560 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
34570 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a 2a  structure.    **
34580 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 64   match the new d
34590 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61 6c  ata. The initial
345a0 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63  ization of pTo c
345b0 61 6e 20 61 63 74 75 61 6c 6c 79 20 66 61 69 6c  an actually fail
345c0 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 66 61   under.    ** fa
345d0 69 72 6c 79 20 6f 62 73 63 75 72 65 20 63 69 72  irly obscure cir
345e0 63 75 6d 73 74 61 6e 63 65 73 2c 20 65 76 65 6e  cumstances, even
345f0 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 61 20   though it is a 
34600 63 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 69  copy of initiali
34610 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  zed .    ** page
34620 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20   pFrom..    */. 
34630 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d     pTo->isInit =
34640 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   0;.    rc = btr
34650 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f 29 3b  eeInitPage(pTo);
34660 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
34670 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34680 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
34690 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
346a0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
346b0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
346c0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
346d0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
346e0 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20  map entries.    
346f0 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65  ** for any b-tre
34700 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  e or overflow pa
34710 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77  ges that pTo now
34720 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
34730 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a  inters to..    *
34740 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  /.    if( ISAUTO
34750 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
34760 2a 70 52 43 20 3d 20 73 65 74 43 68 69 6c 64 50  *pRC = setChildP
34770 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20 20  trmaps(pTo);.   
34780 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
34790 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64  This routine red
347a0 69 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73  istributes cells
347b0 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49   on the iParentI
347c0 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70  dx'th child of p
347d0 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61  Parent.** (herea
347e0 66 74 65 72 20 22 74 68 65 20 70 61 67 65 22 29  fter "the page")
347f0 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62   and up to 2 sib
34800 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c  lings so that al
34810 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f  l pages have abo
34820 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  ut the.** same a
34830 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70  mount of free sp
34840 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73  ace. Usually a s
34850 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e  ingle sibling on
34860 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
34870 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20  the.** page are 
34880 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  used in the bala
34890 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f  ncing, though bo
348a0 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  th siblings migh
348b0 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a  t come from one.
348c0 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65 20 70  ** side if the p
348d0 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74  age is the first
348e0 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f   or last child o
348f0 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66  f its parent. If
34900 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61   the page .** ha
34910 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 20 73  s fewer than 2 s
34920 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69  iblings (somethi
34930 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c  ng which can onl
34940 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
34950 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f  page.** is a roo
34960 74 20 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c  t page or a chil
34970 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65  d of a root page
34980 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c  ) then all avail
34990 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  able siblings.**
349a0 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
349b0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a  the balancing..*
349c0 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
349d0 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74  of siblings of t
349e0 68 65 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  he page might be
349f0 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
34a00 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f  creased by .** o
34a10 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20  ne or two in an 
34a20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70  effort to keep p
34a30 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ages nearly full
34a40 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75   but not over fu
34a50 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ll. .**.** Note 
34a60 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72  that when this r
34a70 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
34a80 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65  , some of the ce
34a90 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  lls on the page.
34aa0 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74  ** might not act
34ab0 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ually be stored 
34ac0 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  in MemPage.aData
34ad0 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70  []. This can hap
34ae0 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  pen.** if the pa
34af0 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ge is overfull. 
34b00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
34b10 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65  ures that all ce
34b20 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  lls allocated.**
34b30 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64   to the page and
34b40 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69   its siblings fi
34b50 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61  t into MemPage.a
34b60 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65  Data[] before re
34b70 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
34b80 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
34b90 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61  balancing the pa
34ba0 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
34bb0 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62  ngs, cells may b
34bc0 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e  e.** inserted in
34bd0 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72  to or removed fr
34be0 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
34bf0 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f  ge (pParent). Do
34c00 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61  ing so.** may ca
34c10 75 73 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  use the parent p
34c20 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76  age to become ov
34c30 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66  erfull or underf
34c40 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20  ull. If this.** 
34c50 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74  happens, it is t
34c60 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
34c70 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
34c80 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  to invoke the co
34c90 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69  rrect.** balanci
34ca0 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69  ng routine to fi
34cb0 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  x this problem (
34cc0 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28  see the balance(
34cd0 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a  ) routine). .**.
34ce0 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
34cf0 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  ne fails for any
34d00 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68   reason, it migh
34d10 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  t leave the data
34d20 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72  base.** in a cor
34d30 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f  rupted state. So
34d40 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
34d50 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61   fails, the data
34d60 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  base should.** b
34d70 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
34d80 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61  *.** The third a
34d90 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
34da0 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53  function, aOvflS
34db0 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74  pace, is a point
34dc0 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65  er to a.** buffe
34dd0 72 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  r big enough to 
34de0 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e 20 49  hold one page. I
34df0 66 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69 6e  f while insertin
34e00 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65  g cells into the
34e10 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67 65 20   parent.** page 
34e20 28 70 50 61 72 65 6e 74 29 20 74 68 65 20 70 61  (pParent) the pa
34e30 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65  rent page become
34e40 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 69 73  s overfull, this
34e50 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 75 73   buffer is.** us
34e60 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
34e70 70 61 72 65 6e 74 27 73 20 6f 76 65 72 66 6c 6f  parent's overflo
34e80 77 20 63 65 6c 6c 73 2e 20 42 65 63 61 75 73 65  w cells. Because
34e90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
34ea0 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61 78 69  nserts.** a maxi
34eb0 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64 69 76 69  mum of four divi
34ec0 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  der cells into t
34ed0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20  he parent page, 
34ee0 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a  and the maximum.
34ef0 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20 63 65 6c  ** size of a cel
34f00 6c 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20  l stored within 
34f10 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  an internal node
34f20 20 69 73 20 61 6c 77 61 79 73 20 6c 65 73 73 20   is always less 
34f30 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20 74  than 1/4.** of t
34f40 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68  he page-size, th
34f50 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62  e aOvflSpace[] b
34f60 75 66 66 65 72 20 69 73 20 67 75 61 72 61 6e 74  uffer is guarant
34f70 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 0a  eed to be large.
34f80 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c  ** enough for al
34f90 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  l overflow cells
34fa0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76 66 6c  ..**.** If aOvfl
34fb0 53 70 61 63 65 20 69 73 20 73 65 74 20 74 6f 20  Space is set to 
34fc0 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  a null pointer, 
34fd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
34fe0 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
34ff0 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 23 69 66 20 64  _NOMEM..*/.#if d
35000 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
35010 20 26 26 20 5f 4d 53 43 5f 56 45 52 20 3e 3d 20   && _MSC_VER >= 
35020 31 37 30 30 20 26 26 20 64 65 66 69 6e 65 64 28  1700 && defined(
35030 5f 4d 5f 41 52 4d 29 0a 23 70 72 61 67 6d 61 20  _M_ARM).#pragma 
35040 6f 70 74 69 6d 69 7a 65 28 22 22 2c 20 6f 66 66  optimize("", off
35050 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ).#endif.static 
35060 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  int balance_nonr
35070 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  oot(.  MemPage *
35080 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20  pParent,        
35090 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74         /* Parent
350a0 20 70 61 67 65 20 6f 66 20 73 69 62 6c 69 6e 67   page of sibling
350b0 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64  s being balanced
350c0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
350d0 74 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  tIdx,           
350e0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
350f0 66 20 22 74 68 65 20 70 61 67 65 22 20 69 6e 20  f "the page" in 
35100 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75 38 20  pParent */.  u8 
35110 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20 20 20 20  *aOvflSpace,    
35120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35130 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73 20  page-size bytes 
35140 6f 66 20 73 70 61 63 65 20 66 6f 72 20 70 61 72  of space for par
35150 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e  ent ovfl */.  in
35160 74 20 69 73 52 6f 6f 74 2c 20 20 20 20 20 20 20  t isRoot,       
35170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35180 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74   True if pParent
35190 20 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65 20   is a root-page 
351a0 2a 2f 0a 20 20 69 6e 74 20 62 42 75 6c 6b 20 20  */.  int bBulk  
351b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
351c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
351d0 74 68 69 73 20 63 61 6c 6c 20 69 73 20 70 61 72  this call is par
351e0 74 20 6f 66 20 61 20 62 75 6c 6b 20 6c 6f 61 64  t of a bulk load
351f0 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
35200 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  d *pBt;         
35210 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f        /* The who
35220 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
35230 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20   int nCell = 0; 
35240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35250 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
35260 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
35270 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20    int nMaxCells 
35280 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
35290 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
352a0 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65   of apCell, szCe
352b0 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20  ll, aFrom. */.  
352c0 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20  int nNew = 0;   
352d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
352e0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
352f0 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20  in apNew[] */.  
35300 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20  int nOld;       
35310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35320 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
35330 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20  in apOld[] */.  
35340 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20  int i, j, k;    
35350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35360 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
35370 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20  .  int nxDiv;   
35380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35390 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20  /* Next divider 
353a0 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d  slot in pParent-
353b0 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  >aCell[] */.  in
353c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
353d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
353e0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
353f0 0a 20 20 75 31 36 20 6c 65 61 66 43 6f 72 72 65  .  u16 leafCorre
35400 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
35410 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73  /* 4 if pPage is
35420 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e   a leaf.  0 if n
35430 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66  ot */.  int leaf
35440 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
35450 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
35460 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20  pPage is a leaf 
35470 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72  of a LEAFDATA tr
35480 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ee */.  int usab
35490 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  leSpace;        
354a0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e       /* Bytes in
354b0 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68   pPage beyond th
354c0 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
354d0 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20  t pageFlags;    
354e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
354f0 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  lue of pPage->aD
35500 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20  ata[0] */.  int 
35510 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20  subtotal;       
35520 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74           /* Subt
35530 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e  otal of bytes in
35540 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61   cells on one pa
35550 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61  ge */.  int iSpa
35560 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ce1 = 0;        
35570 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
35580 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70  used byte of aSp
35590 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  ace1[] */.  int 
355a0 69 4f 76 66 6c 53 70 61 63 65 20 3d 20 30 3b 20  iOvflSpace = 0; 
355b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
355c0 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
355d0 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 2a 2f   aOvflSpace[] */
355e0 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68  .  int szScratch
355f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35600 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74  /* Size of scrat
35610 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73  ch memory reques
35620 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ted */.  MemPage
35630 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20   *apOld[NB];    
35640 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
35650 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62  nd up to two sib
35660 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  lings */.  MemPa
35670 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20  ge *apCopy[NB]; 
35680 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61          /* Priva
35690 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f  te copies of apO
356a0 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20  ld[] pages */.  
356b0 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e  MemPage *apNew[N
356c0 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  B+2];        /* 
356d0 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
356e0 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65  NB siblings afte
356f0 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20  r balancing */. 
35700 20 75 38 20 2a 70 52 69 67 68 74 3b 20 20 20 20   u8 *pRight;    
35710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35720 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20 70 61 72   Location in par
35730 65 6e 74 20 6f 66 20 72 69 67 68 74 2d 73 69 62  ent of right-sib
35740 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  ling pointer */.
35750 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d 31    u8 *apDiv[NB-1
35760 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
35770 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * Divider cells 
35780 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
35790 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d  int cntNew[NB+2]
357a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
357b0 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d  Index in aCell[]
357c0 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69   of cell after i
357d0 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  -th page */.  in
357e0 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  t szNew[NB+2];  
357f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
35800 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63  mbined size of c
35810 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d  ells place on i-
35820 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  th page */.  u8 
35830 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20  **apCell = 0;   
35840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
35850 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c   cells begin bal
35860 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
35870 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
35880 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
35890 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
358a0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
358b0 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b  /.  u8 *aSpace1;
358c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358d0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f   /* Space for co
358e0 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73  pies of dividers
358f0 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f   cells */.  Pgno
35900 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
35910 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
35920 20 76 61 72 20 74 6f 20 73 74 6f 72 65 20 61 20   var to store a 
35930 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 2a  page number in *
35940 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 72 65  /..  pBt = pPare
35950 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  nt->pBt;.  asser
35960 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
35970 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
35980 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
35990 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
359a0 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
359b0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 23 69 66  pDbPage) );..#if
359c0 20 30 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c   0.  TRACE(("BAL
359d0 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65  ANCE: begin page
359e0 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c   %d child of %d\
359f0 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
35a00 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29   pParent->pgno))
35a10 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
35a20 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 50 61  t this point pPa
35a30 72 65 6e 74 20 6d 61 79 20 68 61 76 65 20 61 74  rent may have at
35a40 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66 6c   most one overfl
35a50 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66 0a  ow cell. And if.
35a60 20 20 2a 2a 20 74 68 69 73 20 6f 76 65 72 66 6c    ** this overfl
35a70 6f 77 20 63 65 6c 6c 20 69 73 20 70 72 65 73 65  ow cell is prese
35a80 6e 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74  nt, it must be t
35a90 68 65 20 63 65 6c 6c 20 77 69 74 68 20 0a 20 20  he cell with .  
35aa0 2a 2a 20 69 6e 64 65 78 20 69 50 61 72 65 6e 74  ** index iParent
35ab0 49 64 78 2e 20 54 68 69 73 20 73 63 65 6e 61 72  Idx. This scenar
35ac0 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 77  io comes about w
35ad0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
35ae0 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64  n.  ** is called
35af0 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20 66 72   (indirectly) fr
35b00 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  om sqlite3BtreeD
35b10 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  elete()..  */.  
35b20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
35b30 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c  >nOverflow==0 ||
35b40 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
35b50 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  low==1 );.  asse
35b60 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  rt( pParent->nOv
35b70 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61  erflow==0 || pPa
35b80 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3d  rent->aiOvfl[0]=
35b90 3d 69 50 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a  =iParentIdx );..
35ba0 20 20 69 66 28 20 21 61 4f 76 66 6c 53 70 61 63    if( !aOvflSpac
35bb0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
35bc0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
35bd0 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  }..  /* Find the
35be0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74   sibling pages t
35bf0 6f 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20  o balance. Also 
35c00 6c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 73  locate the cells
35c10 20 69 6e 20 70 50 61 72 65 6e 74 20 0a 20 20 2a   in pParent .  *
35c20 2a 20 74 68 61 74 20 64 69 76 69 64 65 20 74 68  * that divide th
35c30 65 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61  e siblings. An a
35c40 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
35c50 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e  o find NN siblin
35c60 67 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68  gs on .  ** eith
35c70 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
35c80 2e 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20  . More siblings 
35c90 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f  are taken from o
35ca0 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72  ne side, however
35cb0 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65  , .  ** if there
35cc0 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20   are fewer than 
35cd0 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74  NN siblings on t
35ce0 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 49  he other side. I
35cf0 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68  f pParent.  ** h
35d00 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63  as NB or fewer c
35d10 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c  hildren then all
35d20 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61   children of pPa
35d30 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 20  rent are taken. 
35d40 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
35d50 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73   loop also drops
35d60 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
35d70 6c 73 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ls from the pare
35d80 6e 74 20 70 61 67 65 2e 20 54 68 69 73 0a 20 20  nt page. This.  
35d90 2a 2a 20 77 61 79 2c 20 74 68 65 20 72 65 6d 61  ** way, the rema
35da0 69 6e 64 65 72 20 6f 66 20 74 68 65 20 66 75 6e  inder of the fun
35db0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68  ction does not h
35dc0 61 76 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ave to deal with
35dd0 20 61 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c   any.  ** overfl
35de0 6f 77 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20  ow cells in the 
35df0 70 61 72 65 6e 74 20 70 61 67 65 2c 20 73 69 6e  parent page, sin
35e00 63 65 20 69 66 20 61 6e 79 20 65 78 69 73 74 65  ce if any existe
35e10 64 20 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a  d they will.  **
35e20 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
35e30 65 6e 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f  en removed..  */
35e40 0a 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e  .  i = pParent->
35e50 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72  nOverflow + pPar
35e60 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66  ent->nCell;.  if
35e70 28 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44  ( i<2 ){.    nxD
35e80 69 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  iv = 0;.  }else{
35e90 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 42 75  .    assert( bBu
35ea0 6c 6b 3d 3d 30 20 7c 7c 20 62 42 75 6c 6b 3d 3d  lk==0 || bBulk==
35eb0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 69 50 61  1 );.    if( iPa
35ec0 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20 20  rentIdx==0 ){   
35ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
35ee0 20 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a       nxDiv = 0;.
35ef0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50      }else if( iP
35f00 61 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20  arentIdx==i ){. 
35f10 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d 32       nxDiv = i-2
35f20 2b 62 42 75 6c 6b 3b 0a 20 20 20 20 7d 65 6c 73  +bBulk;.    }els
35f30 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
35f40 20 62 42 75 6c 6b 3d 3d 30 20 29 3b 0a 20 20 20   bBulk==0 );.   
35f50 20 20 20 6e 78 44 69 76 20 3d 20 69 50 61 72 65     nxDiv = iPare
35f60 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20  ntIdx-1;.    }. 
35f70 20 20 20 69 20 3d 20 32 2d 62 42 75 6c 6b 3b 0a     i = 2-bBulk;.
35f80 20 20 7d 0a 20 20 6e 4f 6c 64 20 3d 20 69 2b 31    }.  nOld = i+1
35f90 3b 0a 20 20 69 66 28 20 28 69 2b 6e 78 44 69 76  ;.  if( (i+nxDiv
35fa0 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
35fb0 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  low)==pParent->n
35fc0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69 67  Cell ){.    pRig
35fd0 68 74 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61  ht = &pParent->a
35fe0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
35ff0 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d 65  rOffset+8];.  }e
36000 6c 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74 20  lse{.    pRight 
36010 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  = findCell(pPare
36020 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
36030 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b  ent->nOverflow);
36040 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67 65  .  }.  pgno = ge
36050 74 34 62 79 74 65 28 70 52 69 67 68 74 29 3b 0a  t4byte(pRight);.
36060 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
36070 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
36080 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
36090 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 30 29 3b 0a   &apOld[i], 0);.
360a0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
360b0 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64      memset(apOld
360c0 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f  , 0, (i+1)*sizeo
360d0 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20  f(MemPage*));.  
360e0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
360f0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a  _cleanup;.    }.
36100 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d      nMaxCells +=
36110 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65   1+apOld[i]->nCe
36120 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76  ll+apOld[i]->nOv
36130 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20  erflow;.    if( 
36140 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b  (i--)==0 ) break
36150 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e 78 44  ;..    if( i+nxD
36160 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 69 4f  iv==pParent->aiO
36170 76 66 6c 5b 30 5d 20 26 26 20 70 50 61 72 65 6e  vfl[0] && pParen
36180 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  t->nOverflow ){.
36190 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
361a0 20 70 50 61 72 65 6e 74 2d 3e 61 70 4f 76 66 6c   pParent->apOvfl
361b0 5b 30 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20  [0];.      pgno 
361c0 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
361d0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65  [i]);.      szNe
361e0 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  w[i] = cellSizeP
361f0 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
36200 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50 61  v[i]);.      pPa
36210 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
36220 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
36230 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
36240 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e   findCell(pParen
36250 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  t, i+nxDiv-pPare
36260 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a  nt->nOverflow);.
36270 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74        pgno = get
36280 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b  4byte(apDiv[i]);
36290 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20  .      szNew[i] 
362a0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
362b0 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29  arent, apDiv[i])
362c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f 70  ;..      /* Drop
362d0 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74   the cell from t
362e0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
362f0 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70  apDiv[i] still p
36300 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a  oints to.      *
36310 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69  * the cell withi
36320 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65 76  n the parent, ev
36330 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61 73  en though it has
36340 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20   been dropped.. 
36350 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
36360 73 61 66 65 20 62 65 63 61 75 73 65 20 64 72 6f  safe because dro
36370 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c  pping a cell onl
36380 79 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65  y overwrites the
36390 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20   first.      ** 
363a0 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 74  four bytes of it
363b0 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  , and this funct
363c0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
363d0 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  d the first.    
363e0 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20    ** four bytes 
363f0 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
36400 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e  ell. So the poin
36410 74 65 72 20 69 73 20 73 61 66 65 20 74 6f 20 75  ter is safe to u
36420 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74 65  se.      ** late
36430 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a  r on.  .      **
36440 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f  .      ** But no
36450 74 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 73  t if we are in s
36460 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
36470 65 2e 20 49 6e 20 73 65 63 75 72 65 2d 64 65 6c  e. In secure-del
36480 65 74 65 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20  ete mode,.      
36490 2a 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c 28  ** the dropCell(
364a0 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  ) routine will o
364b0 76 65 72 77 72 69 74 65 20 74 68 65 20 65 6e 74  verwrite the ent
364c0 69 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a 65  ire cell with ze
364d0 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49  roes..      ** I
364e0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 65 6d  n this case, tem
364f0 70 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74 68  porarily copy th
36500 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  e cell into the 
36510 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20  aOvflSpace[].   
36520 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49 74     ** buffer. It
36530 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20   will be copied 
36540 6f 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f 6f  out again as soo
36550 6e 20 61 73 20 74 68 65 20 61 53 70 61 63 65 5b  n as the aSpace[
36560 5d 20 62 75 66 66 65 72 0a 20 20 20 20 20 20 2a  ] buffer.      *
36570 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20  * is allocated. 
36580 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
36590 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
365a0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
365b0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
365c0 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 69 4f  Off;..        iO
365d0 66 66 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  ff = SQLITE_PTR_
365e0 54 4f 5f 49 4e 54 28 61 70 44 69 76 5b 69 5d 29  TO_INT(apDiv[i])
365f0 20 2d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   - SQLITE_PTR_TO
36600 5f 49 4e 54 28 70 50 61 72 65 6e 74 2d 3e 61 44  _INT(pParent->aD
36610 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ata);.        if
36620 28 20 28 69 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d  ( (iOff+szNew[i]
36630 29 3e 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  )>(int)pBt->usab
36640 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
36650 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
36660 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
36670 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61          memset(a
36680 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73  pOld, 0, (i+1)*s
36690 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29  izeof(MemPage*))
366a0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
366b0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
366c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
366d0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
366e0 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f  y(&aOvflSpace[iO
366f0 66 66 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73  ff], apDiv[i], s
36700 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zNew[i]);.      
36710 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26      apDiv[i] = &
36720 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76  aOvflSpace[apDiv
36730 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61  [i]-pParent->aDa
36740 74 61 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ta];.        }. 
36750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 72 6f       }.      dro
36760 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  pCell(pParent, i
36770 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
36780 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77  nOverflow, szNew
36790 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  [i], &rc);.    }
367a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
367b0 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74  nMaxCells a mult
367c0 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64  iple of 4 in ord
367d0 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38  er to preserve 8
367e0 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e  -byte.  ** align
367f0 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65  ment */.  nMaxCe
36800 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73  lls = (nMaxCells
36810 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a   + 3)&~3;..  /*.
36820 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    ** Allocate sp
36830 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73  ace for memory s
36840 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20  tructures.  */. 
36850 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69   k = pBt->pageSi
36860 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65  ze + ROUND8(size
36870 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
36880 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20  szScratch =.    
36890 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a     nMaxCells*siz
368a0 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20  eof(u8*)        
368b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
368c0 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * apCell */.    
368d0 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a   + nMaxCells*siz
368e0 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 20 20  eof(u16)        
368f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36900 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * szCell */.    
36910 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   + pBt->pageSize
36920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36940 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20  * aSpace1 */.   
36950 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20    + k*nOld;     
36960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36980 2f 2a 20 50 61 67 65 20 63 6f 70 69 65 73 20 28  /* Page copies (
36990 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43  apCopy) */.  apC
369a0 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72  ell = sqlite3Scr
369b0 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63  atchMalloc( szSc
369c0 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20  ratch ); .  if( 
369d0 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  apCell==0 ){.   
369e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
369f0 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c  EM;.    goto bal
36a00 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
36a10 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31  }.  szCell = (u1
36a20 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43  6*)&apCell[nMaxC
36a30 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31  ells];.  aSpace1
36a40 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b   = (u8*)&szCell[
36a50 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73  nMaxCells];.  as
36a60 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
36a70 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63  _ALIGNMENT(aSpac
36a80 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  e1) );..  /*.  *
36a90 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20  * Load pointers 
36aa0 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  to all cells on 
36ab0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e  sibling pages an
36ac0 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  d the divider ce
36ad0 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  lls.  ** into th
36ae0 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d  e local apCell[]
36af0 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f   array.  Make co
36b00 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  pies of the divi
36b10 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
36b20 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
36b30 65 64 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b  ed from aSpace1[
36b40 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65  ] and remove the
36b50 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
36b60 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74   ** from pParent
36b70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
36b80 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
36b90 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74  on leaf pages, t
36ba0 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f  hen the child po
36bb0 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20  inters of the.  
36bc0 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ** divider cells
36bd0 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72   are stripped fr
36be0 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66  om the cells bef
36bf0 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70  ore they are cop
36c00 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53  ied.  ** into aS
36c10 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69  pace1[].  In thi
36c20 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  s way, all cells
36c30 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65   in apCell[] are
36c40 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68   without.  ** ch
36c50 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49  ild pointers.  I
36c60 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e  f siblings are n
36c70 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20  ot leaves, then 
36c80 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a  all cell in.  **
36c90 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64   apCell[] includ
36ca0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
36cb0 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
36cc0 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
36cd0 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c  ll[].  ** are al
36ce0 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c  ike..  **.  ** l
36cf0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20  eafCorrection:  
36d00 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  4 if pPage is a 
36d10 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61 67  leaf.  0 if pPag
36d20 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e  e is not a leaf.
36d30 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66  .  **       leaf
36d40 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61 67  Data:  1 if pPag
36d50 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61  e holds key+data
36d60 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c   and pParent hol
36d70 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20  ds only keys..  
36d80 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74  */.  leafCorrect
36d90 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ion = apOld[0]->
36da0 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61  leaf*4;.  leafDa
36db0 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 69  ta = apOld[0]->i
36dc0 6e 74 4b 65 79 4c 65 61 66 3b 0a 20 20 66 6f 72  ntKeyLeaf;.  for
36dd0 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
36de0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69  +){.    int limi
36df0 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42  t;.    .    /* B
36e00 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
36e10 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20  hing else, take 
36e20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27  a copy of the i'
36e30 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c  th original sibl
36e40 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  ing.    ** The r
36e50 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63  est of this func
36e60 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61  tion will use da
36e70 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69  ta from the copi
36e80 65 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a  es rather.    **
36e90 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
36ea0 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74  al pages since t
36eb0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
36ec0 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65  s will be in the
36ed0 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
36ee0 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  of being overwri
36ef0 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65  tten.  */.    Me
36f00 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
36f10 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61  Copy[i] = (MemPa
36f20 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74  ge*)&aSpace1[pBt
36f30 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69  ->pageSize + k*i
36f40 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ];.    memcpy(pO
36f50 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69  ld, apOld[i], si
36f60 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
36f70 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20      pOld->aData 
36f80 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31  = (void*)&pOld[1
36f90 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ];.    memcpy(pO
36fa0 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64  ld->aData, apOld
36fb0 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  [i]->aData, pBt-
36fc0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20  >pageSize);..   
36fd0 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e   limit = pOld->n
36fe0 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72  Cell+pOld->nOver
36ff0 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 70 4f  flow;.    if( pO
37000 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ld->nOverflow>0 
37010 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  ){.      for(j=0
37020 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b  ; j<limit; j++){
37030 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
37040 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
37050 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65   );.        apCe
37060 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64  ll[nCell] = find
37070 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c  OverflowCell(pOl
37080 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 73  d, j);.        s
37090 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
370a0 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
370b0 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
370c0 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  .        nCell++
370d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
370e0 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 61  lse{.      u8 *a
370f0 44 61 74 61 20 3d 20 70 4f 6c 64 2d 3e 61 44 61  Data = pOld->aDa
37100 74 61 3b 0a 20 20 20 20 20 20 75 31 36 20 6d 61  ta;.      u16 ma
37110 73 6b 50 61 67 65 20 3d 20 70 4f 6c 64 2d 3e 6d  skPage = pOld->m
37120 61 73 6b 50 61 67 65 3b 0a 20 20 20 20 20 20 75  askPage;.      u
37130 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  16 cellOffset = 
37140 70 4f 6c 64 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  pOld->cellOffset
37150 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
37160 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a   j<limit; j++){.
37170 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
37180 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
37190 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c  );.        apCel
371a0 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 43  l[nCell] = findC
371b0 65 6c 6c 76 32 28 61 44 61 74 61 2c 20 6d 61 73  ellv2(aData, mas
371c0 6b 50 61 67 65 2c 20 63 65 6c 6c 4f 66 66 73 65  kPage, cellOffse
371d0 74 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 73  t, j);.        s
371e0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
371f0 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
37200 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
37210 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  .        nCell++
37220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
37230 20 20 20 20 20 20 0a 20 20 20 20 69 66 28 20 69        .    if( i
37240 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65 61 66  <nOld-1 && !leaf
37250 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75 31 36  Data){.      u16
37260 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e 65 77   sz = (u16)szNew
37270 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20 2a 70  [i];.      u8 *p
37280 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73 73 65  Temp;.      asse
37290 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65  rt( nCell<nMaxCe
372a0 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73 7a 43  lls );.      szC
372b0 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b  ell[nCell] = sz;
372c0 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26  .      pTemp = &
372d0 61 53 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d  aSpace1[iSpace1]
372e0 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65 31 20  ;.      iSpace1 
372f0 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73  += sz;.      ass
37300 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61  ert( sz<=pBt->ma
37310 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20  xLocal+23 );.   
37320 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63     assert( iSpac
37330 65 31 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  e1 <= (int)pBt->
37340 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
37350 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
37360 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20  apDiv[i], sz);. 
37370 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
37380 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43  l] = pTemp+leafC
37390 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
373a0 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
373b0 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65  rection==0 || le
373c0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
373d0 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
373e0 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b  nCell] = szCell[
373f0 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72  nCell] - leafCor
37400 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69  rection;.      i
37410 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29  f( !pOld->leaf )
37420 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
37430 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
37440 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
37450 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72  ssert( pOld->hdr
37460 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20  Offset==0 );.   
37470 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
37480 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t pointer of the
37490 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64   child page pOld
374a0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66   becomes the lef
374b0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69  t.        ** poi
374c0 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69  nter of the divi
374d0 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20  der cell */.    
374e0 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c      memcpy(apCel
374f0 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d  l[nCell], &pOld-
37500 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20  >aData[8], 4);. 
37510 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
37520 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
37530 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
37540 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
37550 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a  ell[nCell]<4 ){.
37560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
37570 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65  not allow any ce
37580 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  lls smaller than
37590 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20   4 bytes. */.   
375a0 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
375b0 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20  ell] = 4;.      
375c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
375d0 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
375e0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
375f0 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e  Figure out the n
37600 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e  umber of pages n
37610 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c  eeded to hold al
37620 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20  l nCell cells.. 
37630 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e   ** Store this n
37640 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41  umber in "k".  A
37650 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65  lso compute szNe
37660 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
37670 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65   total.  ** size
37680 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   of all cells on
37690 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61   the i-th page a
376a0 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63  nd cntNew[] whic
376b0 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20  h is the index. 
376c0 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20   ** in apCell[] 
376d0 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74  of the cell that
376e0 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20   divides page i 
376f0 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20  from page i+1.  
37700 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20  .  ** cntNew[k] 
37710 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65  should equal nCe
37720 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  ll..  **.  ** Va
37730 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79  lues computed by
37740 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a   this block:.  *
37750 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
37760 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75   k: The total nu
37770 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20  mber of sibling 
37780 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a  pages.  **    sz
37790 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75  New[i]: Spaced u
377a0 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  sed on the i-th 
377b0 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
377c0 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20  **   cntNew[i]: 
377d0 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b  Index in apCell[
377e0 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66  ] and szCell[] f
377f0 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  or the first cel
37800 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20  l to.  **       
37810 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
37820 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62   of the i-th sib
37830 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
37840 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d  usableSpace: Num
37850 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
37860 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
37870 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e  on each sibling.
37880 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73  .  ** .  */.  us
37890 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d  ableSpace = pBt-
378a0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32  >usableSize - 12
378b0 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
378c0 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61  n;.  for(subtota
378d0 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  l=k=i=0; i<nCell
378e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
378f0 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( i<nMaxCells 
37900 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20  );.    subtotal 
37910 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32  += szCell[i] + 2
37920 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74  ;.    if( subtot
37930 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65  al > usableSpace
37940 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b   ){.      szNew[
37950 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20  k] = subtotal - 
37960 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  szCell[i];.     
37970 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a   cntNew[k] = i;.
37980 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
37990 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ta ){ i--; }.   
379a0 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b     subtotal = 0;
379b0 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20  .      k++;.    
379c0 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20    if( k>NB+1 ){ 
379d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
379e0 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f 20 62  UPT_BKPT; goto b
379f0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20  alance_cleanup; 
37a00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a  }.    }.  }.  sz
37a10 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
37a20 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d  l;.  cntNew[k] =
37a30 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a   nCell;.  k++;..
37a40 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61    /*.  ** The pa
37a50 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62  cking computed b
37a60 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62  y the previous b
37a70 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74  lock is biased t
37a80 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e  oward the siblin
37a90 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  gs.  ** on the l
37aa0 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c  eft side.  The l
37ab0 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65  eft siblings are
37ac0 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66   always nearly f
37ad0 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20  ull, while the. 
37ae0 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73   ** right-most s
37af0 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
37b00 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54  nearly empty.  T
37b10 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  his block of cod
37b20 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20  e attempts.  ** 
37b30 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61  to adjust the pa
37b40 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67  cking of sibling
37b50 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65  s to get a bette
37b60 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a  r balance..  **.
37b70 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74    ** This adjust
37b80 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61  ment is more tha
37b90 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  n an optimizatio
37ba0 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20  n.  The packing 
37bb0 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a  above might.  **
37bc0 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61   be so out of ba
37bd0 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69  lance as to be i
37be0 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61  llegal.  For exa
37bf0 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d  mple, the right-
37c00 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e  most.  ** siblin
37c10 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c  g might be compl
37c20 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  etely empty.  Th
37c30 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
37c40 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20   not optional.. 
37c50 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b   */.  for(i=k-1;
37c60 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
37c70 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a  int szRight = sz
37c80 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65  New[i];  /* Size
37c90 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
37ca0 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
37cb0 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e  int szLeft = szN
37cc0 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65  ew[i-1]; /* Size
37cd0 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
37ce0 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69  he left */.    i
37cf0 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20  nt r;           
37d00 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
37d10 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69  ight-most cell i
37d20 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a  n left sibling *
37d30 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20  /.    int d;    
37d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
37d50 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ex of first cell
37d60 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
37d70 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f  right sibling */
37d80 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77  ..    r = cntNew
37d90 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64  [i-1] - 1;.    d
37da0 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
37db0 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ata;.    assert(
37dc0 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   d<nMaxCells );.
37dd0 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d      assert( r<nM
37de0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77  axCells );.    w
37df0 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30  hile( szRight==0
37e00 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 21 62 42   .       || (!bB
37e10 75 6c 6b 20 26 26 20 73 7a 52 69 67 68 74 2b 73  ulk && szRight+s
37e20 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65  zCell[d]+2<=szLe
37e30 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29  ft-(szCell[r]+2)
37e40 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
37e50 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c  szRight += szCel
37e60 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[d] + 2;.      
37e70 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c  szLeft -= szCell
37e80 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63  [r] + 2;.      c
37e90 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20  ntNew[i-1]--;.  
37ea0 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
37eb0 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64  -1] - 1;.      d
37ec0 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
37ed0 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ata;.    }.    s
37ee0 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68  zNew[i] = szRigh
37ef0 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31  t;.    szNew[i-1
37f00 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a  ] = szLeft;.  }.
37f10 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20  .  /* Either we 
37f20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  found one or mor
37f30 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b  e cells (cntnew[
37f40 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67 65 20  0])>0) or pPage 
37f50 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61  is.  ** a virtua
37f60 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20  l root page.  A 
37f70 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
37f80 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72 65  e is when the re
37f90 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67  al root.  ** pag
37fa0 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64 20  e is page 1 and 
37fb0 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20  we are the only 
37fc0 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61  child of that pa
37fd0 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 50  ge..  **.  ** UP
37fe0 44 41 54 45 3a 20 20 54 68 65 20 61 73 73 65 72  DATE:  The asser
37ff0 74 28 29 20 62 65 6c 6f 77 20 69 73 20 6e 6f 74  t() below is not
38000 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74 72 75   necessarily tru
38010 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
38020 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 63  e.  ** file is c
38030 6f 72 72 75 70 74 2e 20 20 54 68 65 20 63 6f 72  orrupt.  The cor
38040 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ruption will be 
38050 64 65 74 65 63 74 65 64 20 61 6e 64 20 72 65 70  detected and rep
38060 6f 72 74 65 64 20 6c 61 74 65 72 0a 20 20 2a 2a  orted later.  **
38070 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 64 75   in this procedu
38080 72 65 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  re so there is n
38090 6f 20 6e 65 65 64 20 74 6f 20 61 63 74 20 75 70  o need to act up
380a0 6f 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  on it now..  */.
380b0 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
380c0 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28  cntNew[0]>0 || (
380d0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31  pParent->pgno==1
380e0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
380f0 6c 6c 3d 3d 30 29 20 29 3b 0a 23 65 6e 64 69 66  ll==0) );.#endif
38100 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ..  TRACE(("BALA
38110 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20  NCE: old: %d %d 
38120 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64  %d  ",.    apOld
38130 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  [0]->pgno, .    
38140 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b  nOld>=2 ? apOld[
38150 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20  1]->pgno : 0,.  
38160 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c    nOld>=3 ? apOl
38170 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20  d[2]->pgno : 0. 
38180 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20   ));..  /*.  ** 
38190 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70  Allocate k new p
381a0 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64  ages.  Reuse old
381b0 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73   pages where pos
381c0 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  sible..  */.  if
381d0 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f  ( apOld[0]->pgno
381e0 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  <=1 ){.    rc = 
381f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
38200 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  KPT;.    goto ba
38210 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
38220 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d   }.  pageFlags =
38230 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61   apOld[0]->aData
38240 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  [0];.  for(i=0; 
38250 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  i<k; i++){.    M
38260 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20  emPage *pNew;.  
38270 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a    if( i<nOld ){.
38280 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e        pNew = apN
38290 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d  ew[i] = apOld[i]
382a0 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ;.      apOld[i]
382b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
382c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
382d0 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  te(pNew->pDbPage
382e0 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  );.      nNew++;
382f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
38300 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
38310 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  anup;.    }else{
38320 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
38330 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  >0 );.      rc =
38340 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
38350 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
38360 70 67 6e 6f 2c 20 28 62 42 75 6c 6b 20 3f 20 31  pgno, (bBulk ? 1
38370 20 3a 20 70 67 6e 6f 29 2c 20 30 29 3b 0a 20 20   : pgno), 0);.  
38380 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
38390 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
383a0 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  p;.      apNew[i
383b0 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  ] = pNew;.      
383c0 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  nNew++;..      /
383d0 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
383e0 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r-map entry for 
383f0 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  the new sibling 
38400 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  page. */.      i
38410 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
38420 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  ){.        ptrma
38430 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e  pPut(pBt, pNew->
38440 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
38450 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
38460 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  o, &rc);.       
38470 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
38480 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){