/ Hex Artifact Content
Login

Artifact 88c87803b334807da3150245987139baacea4e6e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e     iTab = pIdx->
1850: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20  pTable->tnum;.  
1860: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1870: 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20  lse{.    iTab = 
1880: 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iRoot;.  }..  /*
1890: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
18a0: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45  required lock. E
18b0: 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f  ither a write-lo
18c0: 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20  ck on root-page 
18d0: 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72  iTab, a .  ** wr
18e0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
18f0: 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72  schema table, or
1900: 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20   (if the client 
1910: 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20  is reading) a.  
1920: 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  ** read-lock on 
1930: 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63  iTab will suffic
1940: 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61  e. Return 1 if a
1950: 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ny of these are 
1960: 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72  found.  */.  for
1970: 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70  (pLock=pBtree->p
1980: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
1990: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
19a0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
19b0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42  Lock->pBtree==pB
19c0: 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70  tree .     && (p
19d0: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Lock->iTable==iT
19e0: 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c  ab || (pLock->eL
19f0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1a00: 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  && pLock->iTable
1a10: 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c  ==1)).     && pL
1a20: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ock->eLock>=eLoc
1a30: 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20  kType .    ){.  
1a40: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1a50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61    }.  }..  /* Fa
1a60: 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  iled to find the
1a70: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1a80: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
1a90: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1aa0: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64  E_DEBUG */..#ifd
1ab0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1ac0: 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e  /*.**** This fun
1ad0: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65  ction may be use
1ae0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
1af0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1b00: 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a   only. ****.**.*
1b10: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1b20: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c   it would be ill
1b30: 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20  egal for pBtree 
1b40: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
1b50: 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1b60: 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52  dex rooted at iR
1b70: 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65  oot because othe
1b80: 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  r shared connect
1b90: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75  ions are.** simu
1ba0: 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69  ltaneously readi
1bb0: 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62  ng that same tab
1bc0: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  le or index..**.
1bd0: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
1be0: 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77   for pBtree to w
1bf0: 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68  rite if some oth
1c00: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1c10: 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74  that.** shares t
1c20: 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64  he same BtShared
1c30: 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65   object is curre
1c40: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
1c50: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69  writing.** the i
1c60: 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63  Root table.  Exc
1c70: 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65  ept, if the othe
1c80: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68  r Btree object h
1c90: 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75  as the.** read-u
1ca0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1cb0: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
1cc0: 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  OK for the other
1cd0: 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61   object to.** ha
1ce0: 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  ve a read cursor
1cf0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1d00: 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74  ple, before writ
1d10: 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20  ing to any part 
1d20: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1d30: 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20  index.** rooted 
1d40: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f  at page iRoot, o
1d50: 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a  ne should call:.
1d60: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
1d70: 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1d80: 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74  ts(pBtree, iRoot
1d90: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
1da0: 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  nt hasReadConfli
1db0: 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cts(Btree *pBtre
1dc0: 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a  e, Pgno iRoot){.
1dd0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1de0: 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1df0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1e00: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1e10: 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1e20: 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26  ==iRoot .     &&
1e30: 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72   p->pBtree!=pBtr
1e40: 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70  ee.     && 0==(p
1e50: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c  ->pBtree->db->fl
1e60: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
1e70: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20  dUncommitted).  
1e80: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
1e90: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1ea0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1eb0: 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66  dif    /* #ifdef
1ec0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
1ed0: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
1ee0: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
1ef0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
1f00: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
1f10: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
1f20: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
1f30: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
1f40: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
1f50: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
1f60: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
1f70: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
1f80: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
1f90: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
1fa0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
1fb0: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
1fc0: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
1fd0: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
1fe0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1ff0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
2000: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
2010: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2020: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
2030: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
2040: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2050: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2060: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2070: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2080: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2090: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
20a0: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
20b0: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
20c0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
20d0: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c  eadUncommitted)|
20e0: 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  |eLock==WRITE_LO
20f0: 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20  CK||iTab==1 );. 
2100: 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73   .  /* If reques
2110: 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ting a write-loc
2120: 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65  k, then the Btre
2130: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f  e must have an o
2140: 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74  pen write.  ** t
2150: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2160: 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62  is file. And, ob
2170: 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69  viously, for thi
2180: 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65  s to be so there
2190: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61   .  ** must be a
21a0: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
21b0: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
21c0: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  file itself..  *
21d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  /.  assert( eLoc
21e0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
21f0: 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72  (p==pBt->pWriter
2200: 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
2210: 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a  TRANS_WRITE) );.
2220: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2230: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42  =READ_LOCK || pB
2240: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2250: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
2260: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  .  .  /* This ro
2270: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2280: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
2290: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
22a0: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d  led */.  if( !p-
22b0: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
22c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22d0: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
22e0: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
22f0: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
2300: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
2310: 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71  ck, the.  ** req
2320: 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20  uested lock may 
2330: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
2340: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2350: 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28  >pWriter!=p && (
2360: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2370: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  BTS_EXCLUSIVE)!=
2380: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2390: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
23a0: 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57  d(p->db, pBt->pW
23b0: 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20  riter->db);.    
23c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
23d0: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
23e0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74  ;.  }..  for(pIt
23f0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
2400: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
2410: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  r->pNext){.    /
2420: 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  * The condition 
2430: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
2440: 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c  Lock) in the fol
2450: 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a  lowing if(...) .
2460: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
2470: 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61   is a simplifica
2480: 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  tion of:.    **.
2490: 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d      **   (eLock=
24a0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70  =WRITE_LOCK || p
24b0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
24c0: 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a  TE_LOCK).    **.
24d0: 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
24e0: 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f  know that if eLo
24f0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20  ck==WRITE_LOCK, 
2500: 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f  then no other co
2510: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nnection.    ** 
2520: 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45  may hold a WRITE
2530: 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62  _LOCK on any tab
2540: 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  le in this file 
2550: 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e  (since there can
2560: 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20  .    ** only be 
2570: 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29  a single writer)
2580: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2590: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63  ert( pIter->eLoc
25a0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
25b0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
25c0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  ITE_LOCK );.    
25d0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
25e0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
25f0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20  r->pBtree==p || 
2600: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
2610: 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  AD_LOCK);.    if
2620: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
2630: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
2640: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74  ble==iTab && pIt
2650: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
2660: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2670: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2680: 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d  ed(p->db, pIter-
2690: 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
26a0: 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57      if( eLock==W
26b0: 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RITE_LOCK ){.   
26c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
26d0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
26e0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73          pBt->bts
26f0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e  Flags |= BTS_PEN
2700: 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DING;.      }.  
2710: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2720: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2730: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
2740: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2750: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2760: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2770: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2780: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2790: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
27a0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
27b0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
27c0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
27d0: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
27e0: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
27f0: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
2800: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
2810: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
2820: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
2830: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
2840: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2850: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2860: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2870: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2880: 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ed Btree object 
2890: 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  p is connected t
28a0: 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20  o a sharable.** 
28b0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
28c0: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53  one with the BtS
28d0: 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66  hared.sharable f
28e0: 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a  lag set), and.**
28f0: 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68  .**   (b) No oth
2900: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73  er Btree objects
2910: 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61   hold a lock tha
2920: 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20  t conflicts.**  
2930: 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65       with the re
2940: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e  quested lock (i.
2950: 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61  e. querySharedCa
2960: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68  cheTableLock() h
2970: 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65  as.**       alre
2980: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2990: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c  and returned SQL
29a0: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53  ITE_OK)..**.** S
29b0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
29c0: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
29d0: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
29e0: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e  sfully. SQLITE_N
29f0: 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75  OMEM .** is retu
2a00: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2a10: 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a   attempt fails..
2a20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2a30: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2a40: 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  eLock(Btree *p, 
2a50: 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20  Pgno iTable, u8 
2a60: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
2a70: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2a80: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
2a90: 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  k = 0;.  BtLock 
2aa0: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2ab0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2ac0: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2ad0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2ae0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
2af0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2b00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2b10: 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  db!=0 );..  /* A
2b20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
2b30: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
2b40: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77  itted flag set w
2b50: 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f  ill never try to
2b60: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72  .  ** obtain a r
2b70: 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74  ead-lock using t
2b80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  his function. Th
2b90: 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b  e only read-lock
2ba0: 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62   obtained.  ** b
2bb0: 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  y a connection i
2bc0: 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  n read-uncommitt
2bd0: 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68  ed mode is on th
2be0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2bf0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  .  ** table, and
2c00: 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62   that lock is ob
2c10: 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42  tained in BtreeB
2c20: 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f  eginTrans().  */
2c30: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70  .  assert( 0==(p
2c40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
2c50: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2c60: 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  ed) || eLock==WR
2c70: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  ITE_LOCK );..  /
2c80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2c90: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2ca0: 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61  alled on a shara
2cb0: 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72  ble b-tree after
2cc0: 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65   it .  ** has be
2cd0: 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  en determined th
2ce0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72  at no other b-tr
2cf0: 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c  ee holds a confl
2d00: 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f  icting lock.  */
2d10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2d20: 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  arable );.  asse
2d30: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
2d40: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2d50: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
2d60: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
2d70: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
2d80: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
2d90: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
2da0: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
2db0: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
2dc0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
2dd0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2de0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
2df0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2e00: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
2e10: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
2e20: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
2e30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2e40: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
2e50: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
2e60: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
2e70: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
2e80: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
2e90: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
2ea0: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
2eb0: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
2ec0: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
2ed0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
2ee0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
2ef0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
2f00: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
2f10: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
2f20: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
2f30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2f40: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2f50: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
2f60: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
2f70: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
2f80: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
2f90: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
2fa0: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
2fb0: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
2fc0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
2fd0: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
2fe0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
2ff0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
3000: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
3010: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
3020: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
3030: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
3040: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
3050: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
3060: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
3070: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
3080: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
3090: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
30a0: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
30b0: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
30c0: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
30d0: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
30e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
30f0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
3100: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
3110: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
3120: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
3130: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
3140: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
3150: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
3160: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
3170: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
3180: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
3190: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20  calls to.** the 
31a0: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
31b0: 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64  bleLock() proced
31c0: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
31d0: 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a  ee object p..**.
31e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
31f0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42 74   assumes that Bt
3200: 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65  ree p has an ope
3210: 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  n read or write 
3220: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
3230: 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c   If it does not,
3240: 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45   then the BTS_PE
3250: 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61  NDING flag.** ma
3260: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3270: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3280: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3290: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
32a0: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
32b0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
32c0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
32d0: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
32e0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
32f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
3300: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
3310: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
3320: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
3330: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3340: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3350: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3360: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3370: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3380: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3390: 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
33a0: 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49  gs & BTS_EXCLUSI
33b0: 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  VE)==0 || pBt->p
33c0: 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70  Writer==pLock->p
33d0: 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73  Btree );.    ass
33e0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  ert( pLock->pBtr
33f0: 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f  ee->inTrans>=pLo
3400: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck->eLock );.   
3410: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72   if( pLock->pBtr
3420: 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a  ee==p ){.      *
3430: 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e  ppIter = pLock->
3440: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73  pNext;.      ass
3450: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  ert( pLock->iTab
3460: 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d  le!=1 || pLock==
3470: 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20  &p->lock );.    
3480: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61    if( pLock->iTa
3490: 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ble!=1 ){.      
34a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
34b0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Lock);.      }. 
34c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34d0: 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d  ppIter = &pLock-
34e0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
34f0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  }..  assert( (pB
3500: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
3510: 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c  S_PENDING)==0 ||
3520: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b   pBt->pWriter );
3530: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3540: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42  ter==p ){.    pB
3550: 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a  t->pWriter = 0;.
3560: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
3570: 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55  s &= ~(BTS_EXCLU
3580: 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47  SIVE|BTS_PENDING
3590: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
35a0: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
35b0: 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==2 ){.    /* Th
35c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
35d0: 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65  alled when Btree
35e0: 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67   p is concluding
35f0: 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61   its .    ** tra
3600: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65  nsaction. If the
3610: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  re currently exi
3620: 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e  sts a writer, an
3630: 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  d p is not.    *
3640: 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74  * that writer, t
3650: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
3660: 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
3670: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
3680: 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68  r.    ** than th
3690: 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65  e writer must be
36a0: 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74   about to drop t
36b0: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
36c0: 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20  case.    ** set 
36d0: 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20  the BTS_PENDING 
36e0: 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a  flag to 0..    *
36f0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72  *.    ** If ther
3700: 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  e is not current
3710: 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65  ly a writer, the
3720: 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75  n BTS_PENDING mu
3730: 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72  st.    ** be zer
3740: 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68  o already. So th
3750: 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20  is next line is 
3760: 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74  harmless in that
3770: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
3780: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3790: 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b  &= ~BTS_PENDING;
37a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
37b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e  is function chan
37c0: 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f  ges all write-lo
37d0: 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72 65  cks held by Btre
37e0: 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f  e p into read-lo
37f0: 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  cks..*/.static v
3800: 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c  oid downgradeAll
3810: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
3820: 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b  Locks(Btree *p){
3830: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3840: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28   = p->pBt;.  if(
3850: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
3860: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3870: 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e  pLock;.    pBt->
3880: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3890: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
38a0: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
38b0: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
38c0: 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42      for(pLock=pB
38d0: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b  t->pLock; pLock;
38e0: 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e   pLock=pLock->pN
38f0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
3900: 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  rt( pLock->eLock
3910: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
3920: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3930: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  );.      pLock->
3940: 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
3950: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  K;.    }.  }.}..
3960: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3970: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3980: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
3990: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
39a0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
39b0: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
39c0: 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a  rence */../*.***
39d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
39e0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
39f0: 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20  f assert() only 
3a00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66  ****.**.** Verif
3a10: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
3a20: 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65  r holds the mute
3a30: 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65  x on its BtShare
3a40: 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d.*/.#ifdef SQLI
3a50: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
3a60: 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  int cursorHoldsM
3a70: 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70  utex(BtCursor *p
3a80: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
3a90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3aa0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ->pBt->mutex);.}
3ab0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
3ac0: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
3ad0: 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20  erflow cache of 
3ae0: 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65  the cursor passe
3af0: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
3b00: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74  rgument..** on t
3b10: 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  he shared btree 
3b20: 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a  structure pBt..*
3b30: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69  /.#define invali
3b40: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
3b50: 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63  e(pCur) (pCur->c
3b60: 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
3b70: 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a  _ValidOvfl)../*.
3b80: 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68  ** Invalidate th
3b90: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
3ba0: 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61  list cache for a
3bb0: 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
3bc0: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  d.** on the shar
3bd0: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
3be0: 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69  re pBt..*/.stati
3bf0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
3c00: 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
3c10: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
3c20: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3c30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3c40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
3c50: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  t->mutex) );.  f
3c60: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
3c70: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
3c80: 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
3c90: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
3ca0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
3cb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
3cc0: 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69  CRBLOB./*.** Thi
3cd0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
3ce0: 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69  lled before modi
3cf0: 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  fying the conten
3d00: 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a  ts of a table.**
3d10: 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
3d20: 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  ny incrblob curs
3d30: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65  ors that are ope
3d40: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20  n on the.** row 
3d50: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  or one of the ro
3d60: 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  ws being modifie
3d70: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  d..**.** If argu
3d80: 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c  ment isClearTabl
3d90: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
3da0: 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
3db0: 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61  nts of the.** ta
3dc0: 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ble is about to 
3dd0: 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  be deleted. In t
3de0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3df0: 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62  ate all incrblob
3e00: 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  .** cursors open
3e10: 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68   on any row with
3e20: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  in the table wit
3e30: 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f  h root-page pgno
3e40: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  Root..**.** Othe
3e50: 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65  rwise, if argume
3e60: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
3e70: 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74  is false, then t
3e80: 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72  he row with.** r
3e90: 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69  owid iRow is bei
3ea0: 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64  ng replaced or d
3eb0: 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20  eleted. In this 
3ec0: 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a  case invalidate.
3ed0: 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e  ** only those in
3ee0: 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f  crblob cursors o
3ef0: 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63  pen on that spec
3f00: 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  ific row..*/.sta
3f10: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
3f20: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
3f30: 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  rs(.  Btree *pBt
3f40: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ree,          /*
3f50: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
3f60: 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
3f70: 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20   i64 iRow,      
3f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3f90: 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74  rowid that might
3fa0: 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a   be changing */.
3fb0: 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62    int isClearTab
3fc0: 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  le        /* Tru
3fd0: 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72  e if all rows ar
3fe0: 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  e being deleted 
3ff0: 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  */.){.  BtCursor
4000: 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20   *p;.  BtShared 
4010: 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70  *pBt = pBtree->p
4020: 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
4030: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
4040: 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a  utex(pBtree) );.
4050: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
4060: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
4070: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ext){.    if( (p
4080: 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
4090: 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 0a 20  F_Incrblob)!=0. 
40a0: 20 20 20 20 26 26 20 28 69 73 43 6c 65 61 72 54      && (isClearT
40b0: 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e  able || p->info.
40c0: 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20  nKey==iRow).    
40d0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61  ){.      p->eSta
40e0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
40f0: 4c 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  LID;.    }.  }.}
4100: 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75  ..#else.  /* Stu
4110: 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20  b function when 
4120: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
4130: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
4140: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4150: 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a  lobCursors(x,y,z
4160: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
4170: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
4180: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62   */../*.** Set b
4190: 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42  it pgno of the B
41a0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
41b0: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
41c0: 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77   is called .** w
41d0: 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74 20  hen a page that 
41e0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61  previously conta
41f0: 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65  ined data become
4200: 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  s a free-list le
4210: 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a  af .** page..**.
4220: 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64 2e  ** The BtShared.
4230: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4240: 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72  ec exists to wor
4250: 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63  k around an obsc
4260: 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65  ure.** bug cause
4270: 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61 63  d by the interac
4280: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66  tion of two usef
4290: 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69  ul IO optimizati
42a0: 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a  ons surrounding.
42b0: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ** free-list lea
42c0: 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  f pages:.**.**  
42d0: 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74   1) When all dat
42e0: 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  a is deleted fro
42f0: 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68 65  m a page and the
4300: 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a   page becomes.**
4310: 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73        a free-lis
4320: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
4330: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69   page is not wri
4340: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
4350: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73  base.**      (as
4360: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4370: 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f  pages contain no
4380: 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61   meaningful data
4390: 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ). Sometimes.** 
43a0: 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67 65       such a page
43b0: 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75   is not even jou
43c0: 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77  rnalled (as it w
43d0: 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66  ill not be modif
43e0: 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79  ied,.**      why
43f0: 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c   bother journall
4400: 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ing it?)..**.** 
4410: 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65 65    2) When a free
4420: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4430: 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20 63  is reused, its c
4440: 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65  ontent is not re
4450: 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
4460: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
4470: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
4480: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79  ournal file (why
4490: 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20   should it.**   
44a0: 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73 20     be, if it is 
44b0: 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69  not at all meani
44c0: 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42  ngful?)..**.** B
44d0: 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68  y themselves, th
44e0: 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ese optimization
44f0: 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20  s work fine and 
4500: 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a  provide a handy.
4510: 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  ** performance b
4520: 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c  oost to bulk del
4530: 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70  ete or insert op
4540: 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65  erations. Howeve
4550: 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20  r, if.** a page 
4560: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
4570: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68  free-list and th
4580: 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69 6e  en reused within
4590: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61   the same.** tra
45a0: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62  nsaction, a prob
45b0: 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66  lem comes up. If
45c0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
45d0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
45e0: 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20  .** it is moved 
45f0: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
4600: 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20   and it is also 
4610: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
4620: 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74  hen it.** is ext
4630: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
4640: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65  free-list and re
4650: 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f  used, then the o
4660: 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20  riginal data.** 
4670: 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20  may be lost. In 
4680: 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
4690: 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20  ollback, it may 
46a0: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
46b0: 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
46c0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
46d0: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
46e0: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  guration..**.** 
46f0: 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
4700: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4710: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4720: 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67 65   Whenever a page
4730: 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f   is .** moved to
4740: 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c   become a free-l
4750: 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74  ist leaf page, t
4760: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
4770: 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69   bit is.** set i
4780: 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57 68  n the bitvec. Wh
4790: 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70 61  enever a leaf pa
47a0: 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ge is extracted 
47b0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
47c0: 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  st,.** optimizat
47d0: 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f  ion 2 above is o
47e0: 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63 6f  mitted if the co
47f0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4800: 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65  is already.** se
4810: 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48  t in BtShared.pH
4820: 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63  asContent. The c
4830: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
4840: 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72 65  itvec are cleare
4850: 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  d.** at the end 
4860: 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61 63  of every transac
4870: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
4880: 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73 43  int btreeSetHasC
4890: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
48a0: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
48b0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
48c0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
48d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
48e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
48f0: 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20  gno<=pBt->nPage 
4900: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61 73  );.    pBt->pHas
4910: 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65  Content = sqlite
4920: 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 42  3BitvecCreate(pB
4930: 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  t->nPage);.    i
4940: 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e  f( !pBt->pHasCon
4950: 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  tent ){.      rc
4960: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
4970: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4980: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4990: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
49a0: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
49b0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
49c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
49d0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
49e0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
49f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4a00: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4a10: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4a20: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4a30: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4a40: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4a50: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4a60: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4a70: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4a80: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4a90: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4aa0: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4ab0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4ac0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ad0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4ae0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4af0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4b00: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4b10: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4b20: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4b30: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4b40: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4b50: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4b60: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4b70: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4b80: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4b90: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4ba0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4bb0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4bc0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4bd0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4be0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4bf0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4c00: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4c10: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4c20: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
4c30: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4c40: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
4c50: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
4c60: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
4c70: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
4c80: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
4c90: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
4ca0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
4cb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
4cc0: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
4cd0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
4ce0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
4cf0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
4d00: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
4d10: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
4d20: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
4d30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
4d40: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
4d50: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
4d60: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
4d70: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
4d80: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
4d90: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
4da0: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  1;.}.../*.** Sav
4db0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
4dc0: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e  rsor position in
4dd0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42   the variables B
4de0: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a  tCursor.nKey .**
4df0: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b   and BtCursor.pK
4e00: 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73  ey. The cursor's
4e10: 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
4e20: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
4e30: 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  EEK..**.** The c
4e40: 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
4e50: 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
4e60: 72 20 69 73 20 76 61 6c 69 64 20 28 68 61 73 20  r is valid (has 
4e70: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
4e80: 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74  ALID).** prior t
4e90: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
4ea0: 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61  outine.  .*/.sta
4eb0: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
4ec0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
4ed0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
4ee0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
4ef0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
4f00: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
4f10: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
4f20: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
4f30: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
4f40: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
4f50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
4f60: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
4f70: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20  &pCur->nKey);.  
4f80: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
4f90: 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65 79  TE_OK );  /* Key
4fa0: 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61  Size() cannot fa
4fb0: 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  il */..  /* If t
4fc0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
4fd0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
4fe0: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
4ff0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
5000: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
5010: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
5020: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
5030: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
5040: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
5050: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
5060: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
5070: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
5080: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
5090: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
50a0: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
50b0: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
50c0: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
50d0: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
50e0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43 75   */.  if( 0==pCu
50f0: 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
5100: 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f 69 64  tKey ){.    void
5110: 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   *pKey = sqlite3
5120: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
5130: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
5140: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
5150: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
5160: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
5170: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
5180: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5190: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
51a0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
51b0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
51c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
51d0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
51e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
51f0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5200: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5210: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
5220: 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   !pCur->apPage[0
5230: 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  ]->intKey || !pC
5240: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
5250: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5260: 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c   ){.    btreeRel
5270: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5280: 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43  es(pCur);.    pC
5290: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
52a0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
52b0: 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61  .  }..  invalida
52c0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
52d0: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
52e0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
52f0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
5300: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
5310: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
5320: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
5330: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
5340: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
5350: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
5360: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
5370: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
5380: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5390: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
53a0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
53b0: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
53c0: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
53d0: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
53e0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
53f0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
5400: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
5410: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
5420: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
5430: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
5440: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
5450: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
5460: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
5470: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
5480: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
5490: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
54a0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
54b0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
54c0: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
54d0: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
54e0: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
54f0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
5500: 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f  n note:  This ro
5510: 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65  utine merely che
5520: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
5530: 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65  y cursors.** nee
5540: 64 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20  d to be saved.  
5550: 49 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20  It calls out to 
5560: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
5570: 74 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73  t() in the (unus
5580: 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68  ual).** event th
5590: 61 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69  at cursors are i
55a0: 6e 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20  n need to being 
55b0: 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  saved..*/.static
55c0: 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73   int saveAllCurs
55d0: 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
55e0: 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42  t, Pgno iRoot, B
55f0: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
5600: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
5610: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5620: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5630: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5640: 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d  assert( pExcept=
5650: 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70  =0 || pExcept->p
5660: 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72  Bt==pBt );.  for
5670: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
5680: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
5690: 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63  .    if( p!=pExc
56a0: 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74  ept && (0==iRoot
56b0: 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   || p->pgnoRoot=
56c0: 3d 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b  =iRoot) ) break;
56d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 20  .  }.  return p 
56e0: 3f 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  ? saveCursorsOnL
56f0: 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45  ist(p, iRoot, pE
5700: 78 63 65 70 74 29 20 3a 20 53 51 4c 49 54 45 5f  xcept) : SQLITE_
5710: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68  OK;.}../* This h
5720: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f  elper routine to
5730: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20   saveAllCursors 
5740: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20  does the actual 
5750: 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a  work of saving.*
5760: 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66  * the cursors if
5770: 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73   and when a curs
5780: 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  or is found that
5790: 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
57a0: 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68  es saving..** Th
57b0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73  e common case is
57c0: 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73   that no cursors
57d0: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
57e0: 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  d, so this routi
57f0: 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20  ne is.** broken 
5800: 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c  out from its cal
5810: 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ler to avoid unn
5820: 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70  ecessary stack p
5830: 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e  ointer movement.
5840: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
5850: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
5860: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5870: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c  (.  BtCursor *p,
5880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5890: 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61  first cursor tha
58a0: 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a  t needs saving *
58b0: 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  /.  Pgno iRoot, 
58c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
58d0: 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74   save cursor wit
58e0: 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61  h this iRoot. Sa
58f0: 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a  ve all if zero *
5900: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45  /.  BtCursor *pE
5910: 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e  xcept    /* Do n
5920: 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72  ot save this cur
5930: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a  sor */.){.  do{.
5940: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
5950: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
5960: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
5970: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
5980: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
5990: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
59a0: 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
59b0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
59c0: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  on(p);.        i
59d0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
59e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
59f0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
5a00: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
5a10: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
5a20: 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  ( p->iPage>0 );.
5a30: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c          btreeRel
5a40: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5a50: 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  es(p);.      }. 
5a60: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
5a70: 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28  pNext;.  }while(
5a80: 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53   p );.  return S
5a90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5aa0: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72  ** Clear the cur
5ab0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
5ac0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
5ad0: 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
5ae0: 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
5af0: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
5b00: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5b10: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
5b20: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
5b30: 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70  pKey);.  pCur->p
5b40: 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Key = 0;.  pCur-
5b50: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5b60: 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  _INVALID;.}../*.
5b70: 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69  ** In this versi
5b80: 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74  on of BtreeMovet
5b90: 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63  o, pKey is a pac
5ba0: 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ked index record
5bb0: 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67  .** such as is g
5bc0: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
5bd0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
5be0: 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68  code.  Unpack th
5bf0: 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20  e.** record and 
5c00: 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d  then call BtreeM
5c10: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
5c20: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a  to do the work..
5c30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
5c40: 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43  reeMoveto(.  BtC
5c50: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
5c60: 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20   /* Cursor open 
5c70: 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20  on the btree to 
5c80: 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  be searched */. 
5c90: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
5ca0: 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b  y,   /* Packed k
5cb0: 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20  ey if the btree 
5cc0: 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20  is an index */. 
5cd0: 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20   i64 nKey,      
5ce0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
5cf0: 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20  key for tables. 
5d00: 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f   Size of pKey fo
5d10: 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  r indices */.  i
5d20: 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20  nt bias,        
5d30: 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63     /* Bias searc
5d40: 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
5d50: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
5d60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
5d70: 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
5d80: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
5d90: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
5da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
5db0: 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55  atus code */.  U
5dc0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
5dd0: 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70  IdxKey;   /* Unp
5de0: 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
5df0: 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63 65  */.  char aSpace
5e00: 5b 32 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20  [200];          
5e10: 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f  /* Temp space fo
5e20: 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61  r pIdxKey - to a
5e30: 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f  void a malloc */
5e40: 0a 20 20 63 68 61 72 20 2a 70 46 72 65 65 20 3d  .  char *pFree =
5e50: 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20   0;..  if( pKey 
5e60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
5e70: 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e  Key==(i64)(int)n
5e80: 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b  Key );.    pIdxK
5e90: 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
5ea0: 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
5eb0: 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70 43 75  ord(.        pCu
5ec0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70  r->pKeyInfo, aSp
5ed0: 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61  ace, sizeof(aSpa
5ee0: 63 65 29 2c 20 26 70 46 72 65 65 0a 20 20 20 20  ce), &pFree.    
5ef0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
5f00: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
5f10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5f20: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
5f30: 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70  rdUnpack(pCur->p
5f40: 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b  KeyInfo, (int)nK
5f50: 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65  ey, pKey, pIdxKe
5f60: 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  y);.    if( pIdx
5f70: 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29  Key->nField==0 )
5f80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
5f90: 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  bFree(pCur->pKey
5fa0: 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29  Info->db, pFree)
5fb0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
5fc0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
5fd0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  PT;.    }.  }els
5fe0: 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  e{.    pIdxKey =
5ff0: 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   0;.  }.  rc = s
6000: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
6010: 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20  oUnpacked(pCur, 
6020: 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62  pIdxKey, nKey, b
6030: 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66  ias, pRes);.  if
6040: 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73  ( pFree ){.    s
6050: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75  qlite3DbFree(pCu
6060: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  r->pKeyInfo->db,
6070: 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72   pFree);.  }.  r
6080: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6090: 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  ** Restore the c
60a0: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73  ursor to the pos
60b0: 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20  ition it was in 
60c0: 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20  (or as close to 
60d0: 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20  as possible).** 
60e0: 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50  when saveCursorP
60f0: 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61  osition() was ca
6100: 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20  lled. Note that 
6110: 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65  this call delete
6120: 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20  s the .** saved 
6130: 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74  position info st
6140: 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73  ored by saveCurs
6150: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f  orPosition(), so
6160: 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
6170: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66   at most one eff
6180: 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75  ective restoreCu
6190: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63  rsorPosition() c
61a0: 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a  all after each .
61b0: 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  ** saveCursorPos
61c0: 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74  ition()..*/.stat
61d0: 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73 74  ic int btreeRest
61e0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
61f0: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
6200: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
6210: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
6220: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
6230: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
6240: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
6250: 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
6260: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
6270: 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
6280: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
6290: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
62a0: 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  }.  pCur->eState
62b0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
62c0: 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d  D;.  rc = btreeM
62d0: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
62e0: 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b  ->pKey, pCur->nK
62f0: 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b  ey, 0, &pCur->sk
6300: 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72  ipNext);.  if( r
6310: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6320: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6330: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
6340: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
6350: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
6360: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
6370: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
6380: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6390: 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  _INVALID );.    
63a0: 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
63b0: 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  xt && pCur->eSta
63c0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
63d0: 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
63e0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
63f0: 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a  SKIPNEXT;.    }.
6400: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6410: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
6420: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6430: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
6440: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
6450: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
6460: 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72       btreeRestor
6470: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6480: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
6490: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
64a0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
64b0: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
64c0: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
64d0: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
64e0: 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20  where.** it was 
64f0: 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20  last placed, or 
6500: 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64  has been invalid
6510: 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68  ated for any oth
6520: 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75  er reason..** Cu
6530: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
6540: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
6550: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74   are pointing at
6560: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a   is deleted out.
6570: 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ** from under th
6580: 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  em, for example.
6590: 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61    Cursor might a
65a0: 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74  lso move if a bt
65b0: 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61  ree.** is rebala
65c0: 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  nced..**.** Call
65d0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
65e0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72   with a NULL cur
65f0: 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75  sor pointer retu
6600: 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a  rns false..**.**
6610: 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74   Use the separat
6620: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
6630: 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f  rsorRestore() ro
6640: 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65  utine to restore
6650: 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63   a cursor.** bac
6660: 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75  k to where it ou
6670: 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69  ght to be if thi
6680: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
6690: 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s true..*/.int s
66a0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
66b0: 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73  rHasMoved(BtCurs
66c0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
66d0: 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65  urn pCur->eState
66e0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  !=CURSOR_VALID;.
66f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6700: 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61  utine restores a
6710: 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20   cursor back to 
6720: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73  its original pos
6730: 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a  ition after it.*
6740: 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64  * has been moved
6750: 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65   by some outside
6760: 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68 20   activity (such 
6770: 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61 6c  as a btree rebal
6780: 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77  ance or.** a row
6790: 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c   having been del
67a0: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
67b0: 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e  der the cursor).
67c0: 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63    .**.** On succ
67d0: 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65  ess, the *pDiffe
67e0: 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65  rentRow paramete
67f0: 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  r is false if th
6800: 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
6810: 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  .** pointing at 
6820: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
6830: 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e   row.  *pDiffern
6840: 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20  tRow is the row 
6850: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
6860: 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61  s pointing to ha
6870: 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20  s been deleted, 
6880: 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72 73  forcing the curs
6890: 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73  or to point to s
68a0: 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f  ome.** nearby ro
68b0: 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  w..**.** This ro
68c0: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
68d0: 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20  y be called for 
68e0: 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75  a cursor that ju
68f0: 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54  st returned.** T
6900: 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  RUE from sqlite3
6910: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
6920: 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ved()..*/.int sq
6930: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
6940: 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72  Restore(BtCursor
6950: 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69   *pCur, int *pDi
6960: 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69  fferentRow){.  i
6970: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
6980: 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61  ( pCur!=0 );.  a
6990: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
69a0: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
69b0: 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  D );.  rc = rest
69c0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
69d0: 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
69e0: 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  c ){.    *pDiffe
69f0: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20  rentRow = 1;.   
6a00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6a10: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
6a20: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
6a30: 20 7c 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e   || NEVER(pCur->
6a40: 73 6b 69 70 4e 65 78 74 21 3d 30 29 20 29 7b 0a  skipNext!=0) ){.
6a50: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
6a60: 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ow = 1;.  }else{
6a70: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
6a80: 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Row = 0;.  }.  r
6a90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6aa0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
6ab0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
6ac0: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
6ad0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
6ae0: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
6af0: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
6b00: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
6b10: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
6b20: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
6b30: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
6b40: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
6b50: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
6b60: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
6b70: 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61   (not a valid pa
6b80: 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20  ge) for pgno==1 
6b90: 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a  since there is.*
6ba0: 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70  * no pointer map
6bb0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6bc0: 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e   page 1.  The in
6bd0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f  tegrity_check lo
6be0: 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20  gic.** requires 
6bf0: 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e  that ptrmapPagen
6c00: 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74  o(*,1)!=1..*/.st
6c10: 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70  atic Pgno ptrmap
6c20: 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20  Pageno(BtShared 
6c30: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
6c40: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65  {.  int nPagesPe
6c50: 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f  rMapPage;.  Pgno
6c60: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
6c70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6c80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
6c90: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
6ca0: 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e   pgno<2 ) return
6cb0: 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d   0;.  nPagesPerM
6cc0: 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75  apPage = (pBt->u
6cd0: 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a  sableSize/5)+1;.
6ce0: 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e    iPtrMap = (pgn
6cf0: 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61  o-2)/nPagesPerMa
6d00: 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28  pPage;.  ret = (
6d10: 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65  iPtrMap*nPagesPe
6d20: 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a  rMapPage) + 2; .
6d30: 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49    if( ret==PENDI
6d40: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
6d50: 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a  ) ){.    ret++;.
6d60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
6d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
6d80: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
6d90: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
6da0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6db0: 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70  ne updates the p
6dc0: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
6dd0: 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
6de0: 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61   'key'.** so tha
6df0: 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70  t it maps to typ
6e00: 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61  e 'eType' and pa
6e10: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
6e20: 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49   'pgno'..**.** I
6e30: 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61  f *pRC is initia
6e40: 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f  lly non-zero (no
6e50: 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65  n-SQLITE_OK) the
6e60: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
6e70: 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  s.** a no-op.  I
6e80: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
6e90: 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  s, the appropria
6ea0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
6eb0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
6ec0: 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63   *pRC..*/.static
6ed0: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28   void ptrmapPut(
6ee0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
6ef0: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
6f00: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20  e, Pgno parent, 
6f10: 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50  int *pRC){.  DbP
6f20: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
6f30: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6f40: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
6f50: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
6f60: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6f70: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
6f80: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
6f90: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
6fa0: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
6fb0: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
6fc0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
6fd0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
6fe0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
6ff0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
7000: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  n code from subf
7010: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69  unctions */..  i
7020: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
7030: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
7040: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7050: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
7060: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
7070: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
7080: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
7090: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
70a0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
70b0: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
70c0: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
70d0: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
70e0: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
70f0: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
7100: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
7110: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  y==0 ){.    *pRC
7120: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7130: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
7140: 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61  rn;.  }.  iPtrma
7150: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
7160: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
7170: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
7180: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
7190: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
71a0: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
71b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
71c0: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
71d0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
71e0: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
71f0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
7200: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
7210: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
7220: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7230: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
7240: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
7250: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7260: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7270: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7280: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
7290: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
72a0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
72b0: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
72c0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
72d0: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
72e0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
72f0: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
7300: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
7310: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
7320: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
7330: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
7340: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
7350: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
7360: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
7370: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7380: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
7390: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
73a0: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
73b0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
73c0: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
73d0: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
73e0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
73f0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
7400: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
7410: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
7420: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
7430: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7440: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
7450: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
7460: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
7470: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
7480: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
7490: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
74a0: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
74b0: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
74c0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
74d0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
74e0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
74f0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
7500: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
7510: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
7520: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
7530: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
7540: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
7550: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
7560: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
7570: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7580: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
7590: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
75a0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
75b0: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
75c0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
75d0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
75e0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
75f0: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
7600: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
7610: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
7620: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
7630: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7640: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7650: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
7660: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
7670: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
7680: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
7690: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
76a0: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
76b0: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
76c0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
76d0: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
76e0: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
76f0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
7700: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
7710: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
7720: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
7730: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
7740: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
7750: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
7760: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
7770: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7780: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
7790: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
77a0: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
77b0: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
77c0: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
77d0: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
77e0: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
77f0: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
7800: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
7810: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
7820: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
7830: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
7840: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
7850: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
7860: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7870: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74  RUPT_BKPT;.  ret
7880: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7890: 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65  ..#else /* if de
78a0: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
78b0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
78c0: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
78d0: 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a  Put(w,x,y,z,rc).
78e0: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
78f0: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
7900: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
7910: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
7920: 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64  r(x, y, rc).#end
7930: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
7940: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
7950: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
7960: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
7970: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
7980: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
7990: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
79a0: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
79b0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
79c0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
79d0: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tent..**.** This
79e0: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f   routine works o
79f0: 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68  nly for pages th
7a00: 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  at do not contai
7a10: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
7a20: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e  ..*/.#define fin
7a30: 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28  dCell(P,I) \.  (
7a40: 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50  (P)->aData + ((P
7a50: 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  )->maskPage & ge
7a60: 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 43 65  t2byte(&(P)->aCe
7a70: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
7a80: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
7a90: 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b 28  v2(D,M,O,I) (D+(
7aa0: 4d 26 67 65 74 32 62 79 74 65 28 44 2b 28 4f 2b  M&get2byte(D+(O+
7ab0: 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a 2a  2*(I))))).../*.*
7ac0: 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f  * This a more co
7ad0: 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66  mplex version of
7ae0: 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74   findCell() that
7af0: 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61   works for.** pa
7b00: 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74  ges that do cont
7b10: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
7b20: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ls..*/.static u8
7b30: 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65   *findOverflowCe
7b40: 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
7b50: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
7b60: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
7b70: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7b80: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
7b90: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72  >mutex) );.  for
7ba0: 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  (i=pPage->nOverf
7bb0: 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  low-1; i>=0; i--
7bc0: 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  ){.    int k;.  
7bd0: 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e 61 69 4f    k = pPage->aiO
7be0: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  vfl[i];.    if( 
7bf0: 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k<=iCell ){.    
7c00: 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29    if( k==iCell )
7c10: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
7c20: 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 69   pPage->apOvfl[i
7c30: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
7c40: 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a   iCell--;.    }.
7c50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e    }.  return fin
7c60: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
7c70: 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ll);.}../*.** Pa
7c80: 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65  rse a cell conte
7c90: 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c  nt block and fil
7ca0: 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66  l in the CellInf
7cb0: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
7cc0: 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76  ere.** are two v
7cd0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
7ce0: 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65 65  function.  btree
7cf0: 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65  ParseCell() take
7d00: 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64  s a .** cell ind
7d10: 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ex as the second
7d20: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62 74   argument and bt
7d30: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7d40: 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f  ) .** takes a po
7d50: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64  inter to the bod
7d60: 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73  y of the cell as
7d70: 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75   its second argu
7d80: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
7d90: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
7da0: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
7db0: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
7dc0: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
7dd0: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
7de0: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
7e00: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
7e10: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
7e20: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
7e30: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
7e40: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
7e50: 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  /.){.  u8 *pIter
7e60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7e70: 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74  * For scanning t
7e80: 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a  hrough pCell */.
7e90: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
7ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7eb0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
7ec0: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
7ed0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7ee0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
7ef0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
7f00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
7f10: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
7f20: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
7f30: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
7f40: 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
7f50: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
7f60: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20  childPtrSize==0 
7f70: 29 3b 0a 20 20 20 20 70 49 74 65 72 20 3d 20 70  );.    pIter = p
7f80: 43 65 6c 6c 20 2b 20 67 65 74 56 61 72 69 6e 74  Cell + getVarint
7f90: 33 32 28 70 43 65 6c 6c 2c 20 6e 50 61 79 6c 6f  32(pCell, nPaylo
7fa0: 61 64 29 3b 0a 20 20 20 20 70 49 74 65 72 20 2b  ad);.    pIter +
7fb0: 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74 65  = getVarint(pIte
7fc0: 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  r, (u64*)&pInfo-
7fd0: 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 20  >nKey);.  }else 
7fe0: 69 66 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79  if( pPage->noPay
7ff0: 6c 6f 61 64 20 29 7b 0a 20 20 20 20 61 73 73 65  load ){.    asse
8000: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
8010: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
8020: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
8030: 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26   4 + getVarint(&
8040: 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29  pCell[4], (u64*)
8050: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
8060: 20 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f     pInfo->nPaylo
8070: 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e 66  ad = 0;.    pInf
8080: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20  o->nLocal = 0;. 
8090: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
80a0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e  low = 0;.    pIn
80b0: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30  fo->pPayload = 0
80c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
80d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
80e0: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
80f0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
8100: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
8110: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
8120: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70  nPayload);.    p
8130: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
8140: 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e  yload;.  }.  pIn
8150: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
8160: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
8170: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
8180: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
8190: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
81a0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
81b0: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
81c0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
81d0: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
81e0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
81f0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
8200: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
8210: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
8220: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
8230: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
8240: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
8250: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
8260: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
8270: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
8280: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
8290: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
82a0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
82b0: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
82c0: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
82d0: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
82e0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
82f0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
8300: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8310: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
8320: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
8330: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
8340: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
8350: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
8360: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
8370: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
8380: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
8390: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
83a0: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
83b0: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
83c0: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
83d0: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
83e0: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
83f0: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
8400: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
8410: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
8420: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
8430: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
8440: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
8450: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
8460: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
8470: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
8480: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
8490: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
84a0: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
84b0: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
84c0: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
84d0: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
84e0: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
84f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
8500: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
8510: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8520: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8530: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
8540: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
8550: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8560: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8570: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
8580: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
8590: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
85a0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
85b0: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
85c0: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
85d0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
85e0: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
85f0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
8600: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
8610: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
8620: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
8630: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
8640: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
8650: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
8660: 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ==maxLocal );.  
8670: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8680: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
8690: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
86a0: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
86b0: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
86c0: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
86d0: 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  plus;.    }else{
86e0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
86f0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
8700: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
8710: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8720: 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d   = (u16)(&pInfo-
8730: 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d  >pPayload[pInfo-
8740: 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c  >nLocal] - pCell
8750: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  );.    pInfo->nS
8760: 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76  ize = pInfo->iOv
8770: 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a  erflow + 4;.  }.
8780: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
8790: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
87a0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
87b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
87c0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
87d0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
87e0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
87f0: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
8800: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
8810: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
8820: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
8830: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
8840: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
8850: 7b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  {.  btreeParseCe
8860: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e  llPtr(pPage, fin
8870: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
8880: 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ll), pInfo);.}..
8890: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
88a0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
88b0: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
88c0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
88d0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
88e0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
88f0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
8900: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
8910: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
8920: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
8930: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
8940: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
8950: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
8960: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
8970: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
8980: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ter..*/.static u
8990: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d  16 cellSizePtr(M
89a0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
89b0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
89c0: 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b  *pIter = pCell +
89d0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
89e0: 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f  Size; /* For loo
89f0: 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20  ping over bytes 
8a00: 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  of pCell */.  u8
8a10: 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *pEnd;         
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
8a40: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
8a50: 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20  */.  u32 nSize; 
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8a80: 20 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72   Size value to r
8a90: 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66  eturn */..#ifdef
8aa0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
8ab0: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  /* The value ret
8ac0: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
8ad0: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c  nction should al
8ae0: 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65  ways be the same
8af0: 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65   as.  ** the (Ce
8b00: 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61  llInfo.nSize) va
8b10: 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69  lue found by doi
8b20: 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20  ng a full parse 
8b30: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  of the.  ** cell
8b40: 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55  . If SQLITE_DEBU
8b50: 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  G is defined, an
8b60: 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65   assert() at the
8b70: 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20   bottom of.  ** 
8b80: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65  this function ve
8b90: 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73  rifies that this
8ba0: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f   invariant is no
8bb0: 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20  t violated. */. 
8bc0: 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69   CellInfo debugi
8bd0: 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72 73  nfo;.  btreePars
8be0: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
8bf0: 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66  pCell, &debuginf
8c00: 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  o);.#endif..  if
8c10: 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f  ( pPage->noPaylo
8c20: 61 64 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d  ad ){.    pEnd =
8c30: 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20   &pIter[9];.    
8c40: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
8c50: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
8c60: 70 45 6e 64 20 29 3b 0a 20 20 20 20 61 73 73 65  pEnd );.    asse
8c70: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
8c80: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
8c90: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 28 70    return (u16)(p
8ca0: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
8cb0: 20 7d 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49   }.  nSize = *pI
8cc0: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
8cd0: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
8ce0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a  nd = &pIter[9];.
8cf0: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
8d00: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
8d10: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
8d20: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
8d30: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
8d40: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
8d50: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
8d60: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
8d70: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
8d80: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
8d90: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
8da0: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
8db0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
8dc0: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
8dd0: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
8de0: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
8df0: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
8e00: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
8e10: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
8e20: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
8e30: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
8e40: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
8e50: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
8e60: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
8e70: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
8e80: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
8e90: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
8ea0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
8eb0: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
8ec0: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
8ed0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
8ee0: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
8ef0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
8f00: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
8f10: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
8f20: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
8f30: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
8f40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
8f50: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
8f60: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
8f70: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
8f80: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
8f90: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
8fa0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
8fb0: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
8fc0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
8fd0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
8fe0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
8ff0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
9000: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
9010: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
9020: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
9030: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
9040: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
9050: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
9060: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
9070: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
9080: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
9090: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
90a0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
90b0: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64  6)nSize;.}..#ifd
90c0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
90d0: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
90e0: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
90f0: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
9100: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
9110: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
9120: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
9130: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
9140: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
9150: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65  ll){.  return ce
9160: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
9170: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
9180: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
9190: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
91a0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
91b0: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
91c0: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
91d0: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
91e0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
91f0: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
9200: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
9210: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
9220: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
9230: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
9240: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
9250: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
9260: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
9270: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
9280: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
9290: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
92a0: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
92b0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
92c0: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72  Cell!=0 );.  btr
92d0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
92e0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
92f0: 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
9300: 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
9310: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
9320: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
9330: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
9340: 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61     ptrmapPut(pPa
9350: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
9360: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
9370: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52   pPage->pgno, pR
9380: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
9390: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
93a0: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
93b0: 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61  en.  All Cells a
93c0: 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
93d0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  ** end of the pa
93e0: 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20  ge and all free 
93f0: 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74  space is collect
9400: 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62  ed into one.** b
9410: 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20  ig FreeBlk that 
9420: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
9430: 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  n the header and
9440: 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72   cell.** pointer
9450: 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63   array and the c
9460: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
9470: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9480: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d  defragmentPage(M
9490: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
94a0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94c0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
94d0: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94f0: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  Address of the i
9500: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
9510: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
9520: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
9530: 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  et to the page h
9540: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73  eader */.  int s
9550: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
9560: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
9570: 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74   a cell */.  int
9580: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
9590: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
95a0: 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65  r of usable byte
95b0: 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s on a page */. 
95c0: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
95e0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
95f0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
9600: 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20  */.  int cbrk;  
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
9630: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
9640: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ea */.  int nCel
9650: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
9660: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9670: 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
9680: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
9690: 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
96a0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61    /* The page da
96b0: 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ta */.  unsigned
96c0: 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20   char *temp;    
96d0: 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20     /* Temp area 
96e0: 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  for cell content
96f0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
9700: 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20  har *src;       
9710: 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f   /* Source of co
9720: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntent */.  int i
9730: 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20  CellFirst;      
9740: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
9750: 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e  llowable cell in
9760: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  dex */.  int iCe
9770: 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20  llLast;         
9780: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
9790: 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  ible cell index 
97a0: 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73  */...  assert( s
97b0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
97c0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
97d0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
97e0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
97f0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
9800: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
9810: 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f  eSize <= SQLITE_
9820: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
9830: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9840: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
9850: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
9860: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
9870: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
9880: 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b  ) );.  temp = 0;
9890: 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20  .  src = data = 
98a0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
98b0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
98c0: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
98d0: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
98e0: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
98f0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
9900: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
9910: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
9920: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75  a[hdr+3]) );.  u
9930: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
9940: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
9950: 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61  ze;.  cbrk = usa
9960: 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c  bleSize;.  iCell
9970: 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73  First = cellOffs
9980: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20  et + 2*nCell;.  
9990: 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62  iCellLast = usab
99a0: 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f  leSize - 4;.  fo
99b0: 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
99c0: 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41  i++){.    u8 *pA
99d0: 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ddr;     /* The 
99e0: 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65  i-th cell pointe
99f0: 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d  r */.    pAddr =
9a00: 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65   &data[cellOffse
9a10: 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63  t + i*2];.    pc
9a20: 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64   = get2byte(pAdd
9a30: 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  r);.    testcase
9a40: 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc==iCellFirst
9a50: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
9a60: 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20  ( pc==iCellLast 
9a70: 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  );.#if !defined(
9a80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
9a90: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
9aa0: 4b 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20  K).    /* These 
9ab0: 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20  conditions have 
9ac0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72  already been ver
9ad0: 69 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e  ified in btreeIn
9ae0: 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20  itPage().    ** 
9af0: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
9b00: 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43  _OVERSIZE_CELL_C
9b10: 48 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64 20  HECK is defined 
9b20: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
9b30: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
9b40: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
9b50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9b60: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9b70: 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  T;.    }.#endif.
9b80: 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d      assert( pc>=
9b90: 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63  iCellFirst && pc
9ba0: 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  <=iCellLast );. 
9bb0: 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69     size = cellSi
9bc0: 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 73 72  zePtr(pPage, &sr
9bd0: 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  c[pc]);.    cbrk
9be0: 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65   -= size;.#if de
9bf0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
9c00: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
9c10: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28  L_CHECK).    if(
9c20: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
9c30: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9c40: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9c50: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  BKPT;.    }.#els
9c60: 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  e.    if( cbrk<i
9c70: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
9c80: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
9c90: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9ca0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9cb0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  KPT;.    }.#endi
9cc0: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62  f.    assert( cb
9cd0: 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53  rk+size<=usableS
9ce0: 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65  ize && cbrk>=iCe
9cf0: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
9d00: 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69  estcase( cbrk+si
9d10: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
9d20: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
9d30: 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  pc+size==usableS
9d40: 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62  ize );.    put2b
9d50: 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29  yte(pAddr, cbrk)
9d60: 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d  ;.    if( temp==
9d70: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  0 ){.      int x
9d80: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62 72 6b  ;.      if( cbrk
9d90: 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==pc ) continue;
9da0: 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71  .      temp = sq
9db0: 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
9dc0: 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ace(pPage->pBt->
9dd0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78  pPager);.      x
9de0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9df0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20  a[hdr+5]);.     
9e00: 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d   memcpy(&temp[x]
9e10: 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72  , &data[x], (cbr
9e20: 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20  k+size) - x);.  
9e30: 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a      src = temp;.
9e40: 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
9e50: 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73  (&data[cbrk], &s
9e60: 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  rc[pc], size);. 
9e70: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72   }.  assert( cbr
9e80: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
9e90: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
9ea0: 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b  a[hdr+5], cbrk);
9eb0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d  .  data[hdr+1] =
9ec0: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32   0;.  data[hdr+2
9ed0: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
9ee0: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73  r+7] = 0;.  mems
9ef0: 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69  et(&data[iCellFi
9f00: 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43  rst], 0, cbrk-iC
9f10: 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73  ellFirst);.  ass
9f20: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
9f30: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
9f40: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
9f50: 20 20 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c    if( cbrk-iCell
9f60: 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46  First!=pPage->nF
9f70: 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ree ){.    retur
9f80: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9f90: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
9fa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
9fb0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74  ../*.** Search t
9fc0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20  he free-list on 
9fd0: 70 61 67 65 20 70 50 67 20 66 6f 72 20 73 70 61  page pPg for spa
9fe0: 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65  ce to store a ce
9ff0: 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20 69  ll nByte bytes i
a000: 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e  n.** size. If on
a010: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  e can be found, 
a020: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
a030: 20 74 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e   to the space an
a040: 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66  d remove it.** f
a050: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
a060: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73  t..**.** If no s
a070: 75 69 74 61 62 6c 65 20 73 70 61 63 65 20 63 61  uitable space ca
a080: 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68  n be found on th
a090: 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74  e free-list, ret
a0a0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
a0b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
a0c0: 79 20 64 65 74 65 63 74 20 63 6f 72 72 75 70 74  y detect corrupt
a0d0: 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20  ion within pPg. 
a0e0: 20 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69   If corruption i
a0f0: 73 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68  s.** detected th
a100: 65 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20 74  en *pRc is set t
a110: 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  o SQLITE_CORRUPT
a120: 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74   and NULL is ret
a130: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
a140: 61 20 73 6c 6f 74 20 6f 66 20 61 74 20 6c 65 61  a slot of at lea
a150: 73 74 20 6e 42 79 74 65 20 62 79 74 65 73 20 69  st nByte bytes i
a160: 73 20 66 6f 75 6e 64 20 62 75 74 20 63 61 6e 6e  s found but cann
a170: 6f 74 20 62 65 20 75 73 65 64 20 62 65 63 61 75  ot be used becau
a180: 73 65 20 0a 2a 2a 20 74 68 65 72 65 20 61 72 65  se .** there are
a190: 20 61 6c 72 65 61 64 79 20 61 74 20 6c 65 61 73   already at leas
a1a0: 74 20 36 30 20 66 72 61 67 6d 65 6e 74 65 64 20  t 60 fragmented 
a1b0: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
a1c0: 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  e, return NULL..
a1d0: 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  ** In this case,
a1e0: 20 69 66 20 70 62 44 65 66 72 61 67 20 70 61 72   if pbDefrag par
a1f0: 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55  ameter is not NU
a200: 4c 4c 2c 20 73 65 74 20 2a 70 62 44 65 66 72 61  LL, set *pbDefra
a210: 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  g to true..*/.st
a220: 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69 6e  atic u8 *pageFin
a230: 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70  dSlot(MemPage *p
a240: 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  Pg, int nByte, i
a250: 6e 74 20 2a 70 52 63 2c 20 69 6e 74 20 2a 70 62  nt *pRc, int *pb
a260: 44 65 66 72 61 67 29 7b 0a 20 20 63 6f 6e 73 74  Defrag){.  const
a270: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e   int hdr = pPg->
a280: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38 20  hdrOffset;.  u8 
a290: 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20  * const aData = 
a2a0: 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69 6e  pPg->aData;.  in
a2b0: 74 20 69 41 64 64 72 3b 0a 20 20 69 6e 74 20 70  t iAddr;.  int p
a2c0: 63 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  c;.  int usableS
a2d0: 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e  ize = pPg->pBt->
a2e0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 66  usableSize;..  f
a2f0: 6f 72 28 69 41 64 64 72 3d 68 64 72 2b 31 3b 20  or(iAddr=hdr+1; 
a300: 28 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26  (pc = get2byte(&
a310: 61 44 61 74 61 5b 69 41 64 64 72 5d 29 29 3e 30  aData[iAddr]))>0
a320: 3b 20 69 41 64 64 72 3d 70 63 29 7b 0a 20 20 20  ; iAddr=pc){.   
a330: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
a340: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
a350: 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a   the free slot *
a360: 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73 61  /.    if( pc>usa
a370: 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c  bleSize-4 || pc<
a380: 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20  iAddr+4 ){.     
a390: 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43   *pRc = SQLITE_C
a3a0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
a3b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
a3c0: 20 7d 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65   }.    size = ge
a3d0: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
a3e0: 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 73 69  +2]);.    if( si
a3f0: 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20  ze>=nByte ){.   
a400: 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20     int x = size 
a410: 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 74  - nByte;.      t
a420: 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b  estcase( x==4 );
a430: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
a440: 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69   x==3 );.      i
a450: 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20  f( x<4 ){.      
a460: 20 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b    if( aData[hdr+
a470: 37 5d 3e 3d 36 30 20 29 7b 0a 20 20 20 20 20 20  7]>=60 ){.      
a480: 20 20 20 20 69 66 28 20 70 62 44 65 66 72 61 67      if( pbDefrag
a490: 20 29 20 2a 70 62 44 65 66 72 61 67 20 3d 20 31   ) *pbDefrag = 1
a4a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
a4b0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 0;.        }.
a4c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
a4d0: 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20  e the slot from 
a4e0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55  the free-list. U
a4f0: 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  pdate the number
a500: 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   of.        ** f
a510: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
a520: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
a530: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   */.        memc
a540: 70 79 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d  py(&aData[iAddr]
a550: 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29  , &aData[pc], 2)
a560: 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74 61 5b  ;.        aData[
a570: 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b  hdr+7] += (u8)x;
a580: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
a590: 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c   size+pc > usabl
a5a0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
a5b0: 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43   *pRc = SQLITE_C
a5c0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
a5d0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
a5e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a5f0: 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20      /* The slot 
a600: 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66  remains on the f
a610: 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65  ree-list. Reduce
a620: 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63   its size to acc
a630: 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a  ount.         **
a640: 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e   for the portion
a650: 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77   used by the new
a660: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a   allocation. */.
a670: 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65          put2byte
a680: 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78  (&aData[pc+2], x
a690: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a6a0: 20 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70   return &aData[p
a6b0: 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20  c + x];.    }.  
a6c0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
a6d0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
a6e0: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
a6f0: 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69  space from withi
a700: 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67  n the B-Tree pag
a710: 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  e passed.** as t
a720: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
a730: 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  t. Write into *p
a740: 49 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e  Idx the index in
a750: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  to pPage->aData[
a760: 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73  ].** of the firs
a770: 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61  t byte of alloca
a780: 74 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72  ted space. Retur
a790: 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  n either SQLITE_
a7a0: 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f  OK or.** an erro
a7b0: 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20  r code (usually 
a7c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e  SQLITE_CORRUPT).
a7d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
a7e0: 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  r guarantees tha
a7f0: 74 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69  t there is suffi
a800: 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d  cient space to m
a810: 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63  ake the.** alloc
a820: 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75  ation.  This rou
a830: 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20  tine might need 
a840: 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e  to defragment in
a850: 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a   order to bring.
a860: 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65  ** all the space
a870: 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76   together, howev
a880: 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  er.  This routin
a890: 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69  e will avoid usi
a8a0: 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  ng.** the first 
a8b0: 74 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74  two bytes past t
a8c0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
a8d0: 61 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75  area since presu
a8e0: 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c  mably this.** al
a8f0: 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e  location is bein
a900: 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20  g made in order 
a910: 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20  to insert a new 
a920: 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c  cell, so we will
a930: 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20  .** also end up 
a940: 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65  needing a new ce
a950: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ll pointer..*/.s
a960: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
a970: 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  teSpace(MemPage 
a980: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74  *pPage, int nByt
a990: 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20  e, int *pIdx){. 
a9a0: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
a9b0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
a9c0: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
a9d0: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68  ache of pPage->h
a9e0: 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38  drOffset */.  u8
a9f0: 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20   * const data = 
aa00: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
aa10: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
aa20: 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
aa30: 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  a */.  int top; 
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
aa60: 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c  irst byte of cel
aa70: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
aa80: 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20  /.  int gap;    
aa90: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
aaa0: 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e  e of gap between
aab0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
aac0: 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  nd cell content 
aad0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
aae0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
aaf0: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
ab00: 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
ab10: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
ab20: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
ab30: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
ab40: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
ab50: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ab60: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
ab70: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
ab80: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
ab90: 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69  e>=0 );  /* Mini
aba0: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
abb0: 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
abc0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42  pPage->nFree>=nB
abd0: 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  yte );.  assert(
abe0: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
abf0: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
ac00: 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28  ( nByte < (int)(
ac10: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
ac20: 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20  leSize-8) );..  
ac30: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
ac40: 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72  ellOffset == hdr
ac50: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
ac60: 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d  >leaf );.  gap =
ac70: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
ac80: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
ac90: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67  ell;.  assert( g
aca0: 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 74  ap<=65536 );.  t
acb0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
acc0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69  ata[hdr+5]);.  i
acd0: 66 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20  f( gap>top ){.  
ace0: 20 20 69 66 28 20 74 6f 70 3d 3d 30 20 29 7b 0a    if( top==0 ){.
acf0: 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33        top = 6553
ad00: 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  6;.    }else{.  
ad10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ad20: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
ad30: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
ad40: 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  If there is enou
ad50: 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65 6e  gh space between
ad60: 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72   gap and top for
ad70: 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70   one more cell p
ad80: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61  ointer.  ** arra
ad90: 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20  y entry offset, 
ada0: 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c  and if the freel
adb0: 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ist is not empty
adc0: 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68  , then search th
add0: 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20  e.  ** freelist 
ade0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72  looking for a fr
adf0: 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75  ee slot big enou
ae00: 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  gh to satisfy th
ae10: 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a  e request..  */.
ae20: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
ae30: 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74  2==top );.  test
ae40: 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70  case( gap+1==top
ae50: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
ae60: 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66  gap==top );.  if
ae70: 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 26 26 20  ( gap+2<=top && 
ae80: 28 64 61 74 61 5b 68 64 72 2b 31 5d 20 7c 7c 20  (data[hdr+1] || 
ae90: 64 61 74 61 5b 68 64 72 2b 32 5d 29 20 29 7b 0a  data[hdr+2]) ){.
aea0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
aeb0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20  ITE_OK;.    int 
aec0: 62 44 65 66 72 61 67 20 3d 20 30 3b 0a 20 20 20  bDefrag = 0;.   
aed0: 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61   u8 *pSpace = pa
aee0: 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65  geFindSlot(pPage
aef0: 2c 20 6e 42 79 74 65 2c 20 26 72 63 2c 20 26 62  , nByte, &rc, &b
af00: 44 65 66 72 61 67 29 3b 0a 20 20 20 20 69 66 28  Defrag);.    if(
af10: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
af20: 0a 20 20 20 20 69 66 28 20 62 44 65 66 72 61 67  .    if( bDefrag
af30: 20 29 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65   ) goto defragme
af40: 6e 74 5f 70 61 67 65 3b 0a 20 20 20 20 69 66 28  nt_page;.    if(
af50: 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20   pSpace ){.     
af60: 20 2a 70 49 64 78 20 3d 20 70 53 70 61 63 65 20   *pIdx = pSpace 
af70: 2d 20 64 61 74 61 3b 0a 20 20 20 20 20 20 72 65  - data;.      re
af80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
af90: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
afa0: 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c  The request coul
afb0: 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c  d not be fulfill
afc0: 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c  ed using a freel
afd0: 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b  ist slot.  Check
afe0: 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  .  ** to see if 
aff0: 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  defragmentation 
b000: 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
b010: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
b020: 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20  ap+2+nByte==top 
b030: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e  );.  if( gap+2+n
b040: 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 64 65 66  Byte>top ){. def
b050: 72 61 67 6d 65 6e 74 5f 70 61 67 65 3a 0a 20 20  ragment_page:.  
b060: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
b070: 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
b080: 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65     rc = defragme
b090: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
b0a0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
b0b0: 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d  rn rc;.    top =
b0c0: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
b0d0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
b0e0: 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b      assert( gap+
b0f0: 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20  nByte<=top );.  
b100: 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  }...  /* Allocat
b110: 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68  e memory from th
b120: 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e  e gap in between
b130: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
b140: 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64  r array.  ** and
b150: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
b160: 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74 72  t area.  The btr
b170: 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c  eeInitPage() cal
b180: 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20  l has already.  
b190: 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65  ** validated the
b1a0: 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65   freelist.  Give
b1b0: 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c  n that the freel
b1c0: 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68  ist is valid, th
b1d0: 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
b1e0: 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  ay that the allo
b1f0: 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e  cation can exten
b200: 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  d off the end of
b210: 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20   the page..  ** 
b220: 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c  The assert() bel
b230: 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20  ow verifies the 
b240: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
b250: 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d  e..  */.  top -=
b260: 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79   nByte;.  put2by
b270: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
b280: 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28   top);.  assert(
b290: 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69   top+nByte <= (i
b2a0: 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
b2b0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a  sableSize );.  *
b2c0: 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65  pIdx = top;.  re
b2d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b2e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
b2f0: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
b300: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
b310: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
b320: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
b330: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
b340: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
b350: 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a  >aData[iStart].*
b360: 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  * and the size o
b370: 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69  f the block is i
b380: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
b390: 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62  * Adjacent freeb
b3a0: 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73  locks are coales
b3b0: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ced..**.** Note 
b3c0: 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68  that even though
b3d0: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c   the freeblock l
b3e0: 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20  ist was checked 
b3f0: 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  by btreeInitPage
b400: 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74  (),.** that rout
b410: 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74  ine will not det
b420: 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77  ect overlap betw
b430: 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65  een cells or fre
b440: 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a  eblocks.  Nor.**
b450: 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20   does it detect 
b460: 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f  cells or freeblo
b470: 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63  cks that encrouc
b480: 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72  h into the reser
b490: 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20  ved bytes.** at 
b4a0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
b4b0: 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69  age.  So do addi
b4c0: 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  tional corruptio
b4d0: 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20  n checks inside 
b4e0: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
b4f0: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
b500: 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79  E_CORRUPT if any
b510: 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f   problems are fo
b520: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
b530: 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d  nt freeSpace(Mem
b540: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36  Page *pPage, u16
b550: 20 69 53 74 61 72 74 2c 20 75 31 36 20 69 53 69   iStart, u16 iSi
b560: 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b  ze){.  u16 iPtr;
b570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b590: 41 64 64 72 65 73 73 20 6f 66 20 70 74 72 20 74  Address of ptr t
b5a0: 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  o next freeblock
b5b0: 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42   */.  u16 iFreeB
b5c0: 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lk;             
b5d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
b5e0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
b5f0: 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a  xt freeblock */.
b600: 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20    u8 hdr;       
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b620: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
b630: 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20  header size.  0 
b640: 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e  or 100 */.  u8 n
b650: 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20  Frag = 0;       
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b670: 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69    /* Reduction i
b680: 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  n fragmentation 
b690: 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69  */.  u16 iOrigSi
b6a0: 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20  ze = iSize;     
b6b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
b6c0: 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
b6d0: 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69  iSize */.  u32 i
b6e0: 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  Last = pPage->pB
b6f0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b  t->usableSize-4;
b700: 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73   /* Largest poss
b710: 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f  ible freeblock o
b720: 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32 20 69  ffset */.  u32 i
b730: 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69  End = iStart + i
b740: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
b750: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
b760: 61 73 74 20 74 68 65 20 69 53 74 61 72 74 20 62  ast the iStart b
b770: 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  uffer */.  unsig
b780: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
b790: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20   pPage->aData;  
b7a0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74   /* Page content
b7b0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
b7c0: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
b7d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b7e0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
b7f0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
b800: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
b810: 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64  Start>=pPage->hd
b820: 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d  rOffset+6+pPage-
b830: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b  >childPtrSize );
b840: 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
b850: 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d  PT_DB || iEnd <=
b860: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
b870: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
b880: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
b890: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
b8a0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
b8b0: 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34  assert( iSize>=4
b8c0: 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d   );   /* Minimum
b8d0: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
b8e0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
b8f0: 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20  art<=iLast );.. 
b900: 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65   /* Overwrite de
b910: 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
b920: 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65  n with zeros whe
b930: 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  n the secure_del
b940: 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  ete.  ** option 
b950: 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
b960: 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
b970: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
b980: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
b990: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
b9a0: 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69  [iStart], 0, iSi
b9b0: 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ze);.  }..  /* T
b9c0: 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62  he list of freeb
b9d0: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
b9e0: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
b9f0: 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a  .  Find the .  *
ba00: 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69  * spot on the li
ba10: 73 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20  st where iStart 
ba20: 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
ba30: 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d  ed..  */.  hdr =
ba40: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
ba50: 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20  t;.  iPtr = hdr 
ba60: 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b  + 1;.  if( data[
ba70: 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61  iPtr+1]==0 && da
ba80: 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20  ta[iPtr]==0 ){. 
ba90: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b     iFreeBlk = 0;
baa0: 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f    /* Shortcut fo
bab0: 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20  r the case when 
bac0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
bad0: 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65  empty */.  }else
bae0: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46  {.    while( (iF
baf0: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
bb00: 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3e  e(&data[iPtr]))>
bb10: 30 20 26 26 20 69 46 72 65 65 42 6c 6b 3c 69 53  0 && iFreeBlk<iS
bb20: 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66  tart ){.      if
bb30: 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b  ( iFreeBlk<iPtr+
bb40: 34 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  4 ) return SQLIT
bb50: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
bb60: 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72        iPtr = iFr
bb70: 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eeBlk;.    }.   
bb80: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c   if( iFreeBlk>iL
bb90: 61 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ast ) return SQL
bba0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
bbb0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46  ;.    assert( iF
bbc0: 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69  reeBlk>iPtr || i
bbd0: 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20  FreeBlk==0 );.  
bbe0: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
bbf0: 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20  point:.    **   
bc00: 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72   iFreeBlk:   Fir
bc10: 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74  st freeblock aft
bc20: 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65  er iStart, or ze
bc30: 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a  ro if none.    *
bc40: 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20  *    iPtr:      
bc50: 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   The address of 
bc60: 61 20 70 6f 69 6e 74 65 72 20 69 46 72 65 65 42  a pointer iFreeB
bc70: 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  lk.    **.    **
bc80: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
bc90: 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64   iFreeBlk should
bca0: 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e   be coalesced on
bcb0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53  to the end of iS
bcc0: 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tart..    */.   
bcd0: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26   if( iFreeBlk &&
bce0: 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c   iEnd+3>=iFreeBl
bcf0: 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67  k ){.      nFrag
bd00: 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45   = iFreeBlk - iE
bd10: 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  nd;.      if( iE
bd20: 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65  nd>iFreeBlk ) re
bd30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
bd40: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
bd50: 69 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20  iEnd = iFreeBlk 
bd60: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
bd70: 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20  [iFreeBlk+2]);. 
bd80: 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e       iSize = iEn
bd90: 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20  d - iStart;.    
bda0: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74    iFreeBlk = get
bdb0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
bdc0: 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  eBlk]);.    }.  
bdd0: 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20  .    /* If iPtr 
bde0: 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62  is another freeb
bdf0: 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69  lock (that is, i
be00: 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68  f iPtr is not th
be10: 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a  e freelist.    *
be20: 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  * pointer in the
be30: 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68   page header) th
be40: 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  en check to see 
be50: 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  if iStart should
be60: 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65   be.    ** coale
be70: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
be80: 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a  d of iPtr..    *
be90: 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68  /.    if( iPtr>h
bea0: 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  dr+1 ){.      in
beb0: 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72  t iPtrEnd = iPtr
bec0: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
bed0: 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20  a[iPtr+2]);.    
bee0: 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e    if( iPtrEnd+3>
bef0: 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  =iStart ){.     
bf00: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69     if( iPtrEnd>i
bf10: 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53  Start ) return S
bf20: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
bf30: 50 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61  PT;.        nFra
bf40: 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50  g += iStart - iP
bf50: 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69  trEnd;.        i
bf60: 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50  Size = iEnd - iP
bf70: 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  tr;.        iSta
bf80: 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20  rt = iPtr;.     
bf90: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
bfa0: 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b   nFrag>data[hdr+
bfb0: 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  7] ) return SQLI
bfc0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
bfd0: 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
bfe0: 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20   -= nFrag;.  }. 
bff0: 20 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65 74   if( iStart==get
c000: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
c010: 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  5]) ){.    /* Th
c020: 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20  e new freeblock 
c030: 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  is at the beginn
c040: 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ing of the cell 
c050: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20  content area,.  
c060: 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74    ** so just ext
c070: 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  end the cell con
c080: 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72  tent area rather
c090: 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f   than create ano
c0a0: 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65  ther.    ** free
c0b0: 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  list entry */.  
c0c0: 20 20 69 66 28 20 69 50 74 72 21 3d 68 64 72 2b    if( iPtr!=hdr+
c0d0: 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
c0e0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
c0f0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
c100: 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65  ta[hdr+1], iFree
c110: 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79  Blk);.    put2by
c120: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
c130: 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b   iEnd);.  }else{
c140: 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
c150: 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
c160: 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69   into the freeli
c170: 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79  st */.    put2by
c180: 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20  te(&data[iPtr], 
c190: 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75 74  iStart);.    put
c1a0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
c1b0: 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a  rt], iFreeBlk);.
c1c0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
c1d0: 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53  ta[iStart+2], iS
c1e0: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ize);.  }.  pPag
c1f0: 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69  e->nFree += iOri
c200: 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  gSize;.  return 
c210: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
c220: 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66  .** Decode the f
c230: 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66  lags byte (the f
c240: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
c250: 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70   header) for a p
c260: 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  age.** and initi
c270: 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20  alize fields of 
c280: 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
c290: 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c  cture accordingl
c2a0: 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  y..**.** Only th
c2b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
c2c0: 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70  inations are sup
c2d0: 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e  ported.  Anythin
c2e0: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69  g different.** i
c2f0: 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75  ndicates a corru
c300: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
c310: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
c320: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a   PTF_ZERODATA.**
c330: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
c340: 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46  ODATA | PTF_LEAF
c350: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
c360: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
c370: 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20  NTKEY.**        
c380: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
c390: 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46  PTF_INTKEY | PTF
c3a0: 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20  _LEAF.*/.static 
c3b0: 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28  int decodeFlags(
c3c0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
c3d0: 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20  int flagByte){. 
c3e0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
c3f0: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
c400: 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a   pPage->pBt */..
c410: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
c420: 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61  >hdrOffset==(pPa
c430: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
c440: 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65  0 : 0) );.  asse
c450: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
c460: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
c470: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
c480: 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38  Page->leaf = (u8
c490: 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20  )(flagByte>>3); 
c4a0: 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41   assert( PTF_LEA
c4b0: 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66  F == 1<<3 );.  f
c4c0: 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f  lagByte &= ~PTF_
c4d0: 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63  LEAF;.  pPage->c
c4e0: 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d  hildPtrSize = 4-
c4f0: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
c500: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
c510: 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74  t;.  if( flagByt
c520: 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41  e==(PTF_LEAFDATA
c530: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29   | PTF_INTKEY) )
c540: 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  {.    pPage->int
c550: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  Key = 1;.    pPa
c560: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d  ge->intKeyLeaf =
c570: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
c580: 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f    pPage->noPaylo
c590: 61 64 20 3d 20 21 70 50 61 67 65 2d 3e 6c 65 61  ad = !pPage->lea
c5a0: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  f;.    pPage->ma
c5b0: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
c5c0: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
c5d0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
c5e0: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
c5f0: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
c600: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
c610: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
c620: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ey = 0;.    pPag
c630: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
c640: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f  0;.    pPage->no
c650: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
c660: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
c670: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
c680: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
c690: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
c6a0: 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
c6b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c6c0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
c6d0: 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78    }.  pPage->max
c6e0: 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70  1bytePayload = p
c6f0: 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
c700: 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  oad;.  return SQ
c710: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
c720: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
c730: 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
c740: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73  mation for a dis
c750: 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52  k block..**.** R
c760: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
c770: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
c780: 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20  we see that the 
c790: 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  page does.** not
c7a0: 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d   contain a well-
c7b0: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
c7c0: 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72  page, then retur
c7d0: 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  n .** SQLITE_COR
c7e0: 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74  RUPT.  Note that
c7f0: 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c   a return of SQL
c800: 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a  ITE_OK does not.
c810: 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ** guarantee tha
c820: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65  t the page is we
c830: 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f  ll-formed.  It o
c840: 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a  nly shows that.*
c850: 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64  * we failed to d
c860: 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70  etect any corrup
c870: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
c880: 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67  int btreeInitPag
c890: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
c8a0: 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  ){..  assert( pP
c8b0: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
c8c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c8d0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
c8e0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
c8f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
c900: 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
c910: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
c920: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c930: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
c940: 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ge == sqlite3Pag
c950: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
c960: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
c970: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
c980: 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50  Data == sqlite3P
c990: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
c9a0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
c9b0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73    if( !pPage->is
c9c0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20  Init ){.    u16 
c9d0: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pc;            /
c9e0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66  * Address of a f
c9f0: 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20  reeblock within 
ca00: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a  pPage->aData[] *
ca10: 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20 20  /.    u8 hdr;   
ca20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
ca30: 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20  et to beginning 
ca40: 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
ca50: 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20  /.    u8 *data; 
ca60: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
ca70: 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
ca80: 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65  a */.    BtShare
ca90: 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f  d *pBt;        /
caa0: 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65  * The main btree
cab0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
cac0: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
cad0: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
cae0: 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f  f usable space o
caf0: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
cb00: 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65     u16 cellOffse
cb10: 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
cb20: 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
cb30: 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
cb40: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
cb50: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
cb60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
cb70: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
cb80: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
cb90: 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20  int top;        
cba0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
cbb0: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
cbc0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20  tent area */.   
cbd0: 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b   int iCellFirst;
cbe0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
cbf0: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66  owable cell or f
cc00: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
cc10: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
cc20: 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73  Last;     /* Las
cc30: 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
cc40: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
cc50: 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20  set */..    pBt 
cc60: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20  = pPage->pBt;.. 
cc70: 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e     hdr = pPage->
cc80: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64  hdrOffset;.    d
cc90: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
cca0: 74 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f  ta;.    if( deco
ccb0: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64  deFlags(pPage, d
ccc0: 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75  ata[hdr]) ) retu
ccd0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
cce0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65  T_BKPT;.    asse
ccf0: 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
cd00: 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
cd10: 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29  ageSize<=65536 )
cd20: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73  ;.    pPage->mas
cd30: 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42  kPage = (u16)(pB
cd40: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29  t->pageSize - 1)
cd50: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76  ;.    pPage->nOv
cd60: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
cd70: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
cd80: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
cd90: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
cda0: 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  set = cellOffset
cdb0: 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a   = hdr + 12 - 4*
cdc0: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20  pPage->leaf;.   
cdd0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
cde0: 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53   = &data[usableS
cdf0: 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d  ize];.    pPage-
ce00: 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
ce10: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20  a[cellOffset];. 
ce20: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
ce30: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
ce40: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67  dr+5]);.    pPag
ce50: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  e->nCell = get2b
ce60: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
ce70: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
ce80: 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28  ->nCell>MX_CELL(
ce90: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
cea0: 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66   To many cells f
ceb0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  or a single page
cec0: 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74  .  The page must
ced0: 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20   be corrupt */. 
cee0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
cef0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
cf00: 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
cf10: 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ase( pPage->nCel
cf20: 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  l==MX_CELL(pBt) 
cf30: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c  );..    /* A mal
cf40: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
cf50: 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73 65  page might cause
cf60: 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73 74   us to read past
cf70: 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20   the end.    ** 
cf80: 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72  of page when par
cf90: 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20  sing a cell.  . 
cfa0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
cfb0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
cfc0: 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20   of code checks 
cfd0: 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20  early to see if 
cfe0: 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20  a cell extends. 
cff0: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
d000: 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75  nd of a page bou
d010: 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73  ndary and causes
d020: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
d030: 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65  to be .    ** re
d040: 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65  turned if it doe
d050: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43  s..    */.    iC
d060: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
d070: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
d080: 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c  >nCell;.    iCel
d090: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
d0a0: 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64 65 66 69  ze - 4;.#if defi
d0b0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
d0c0: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
d0d0: 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20  CHECK).    {.   
d0e0: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
d0f0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
d100: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
d110: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  ter array */.   
d120: 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20     int sz;      
d130: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
d140: 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20  a cell */..     
d150: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
d160: 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b  f ) iCellLast--;
d170: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
d180: 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
d190: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63  i++){.        pc
d1a0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
d1b0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32  a[cellOffset+i*2
d1c0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
d1d0: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
d1e0: 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  irst );.        
d1f0: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
d200: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20  ellLast );.     
d210: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
d220: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
d230: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
d240: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d250: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
d260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d270: 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  sz = cellSizePtr
d280: 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
d290: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
d2a0: 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
d2b0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
d2c0: 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61     if( pc+sz>usa
d2d0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
d2e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d2f0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d300: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d310: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   }.      if( !pP
d320: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
d330: 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20  lLast++;.    }  
d340: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
d350: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
d360: 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
d370: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
d380: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
d390: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
d3a0: 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
d3b0: 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20  r+7] + top;.    
d3c0: 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20  while( pc>0 ){. 
d3d0: 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73       u16 next, s
d3e0: 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
d3f0: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
d400: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
d410: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
d420: 20 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b 20 69   of free block i
d430: 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a  s off the page *
d440: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
d450: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d460: 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
d470: 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32       next = get2
d480: 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b  byte(&data[pc]);
d490: 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65  .      size = ge
d4a0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
d4b0: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  2]);.      if( (
d4c0: 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d  next>0 && next<=
d4d0: 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63  pc+size+3) || pc
d4e0: 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65  +size>usableSize
d4f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
d500: 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20  ree blocks must 
d510: 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  be in ascending 
d520: 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c  order. And the l
d530: 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20  ast byte of.    
d540: 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d      ** the free-
d550: 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f  block must lie o
d560: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  n the database p
d570: 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
d580: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d590: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
d5a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65      }.      nFre
d5b0: 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65  e = nFree + size
d5c0: 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78  ;.      pc = nex
d5d0: 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  t;.    }..    /*
d5e0: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
d5f0: 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74  nFree contains t
d600: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66  he sum of the of
d610: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
d620: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
d630: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
d640: 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65  a plus the numbe
d650: 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
d660: 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68  within.    ** th
d670: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
d680: 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20  rea. If this is 
d690: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
d6a0: 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20   usable-size.   
d6b0: 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c   ** of the page,
d6c0: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
d6d0: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  ust be corrupted
d6e0: 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73  . This check als
d6f0: 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20  o.    ** serves 
d700: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
d710: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
d720: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
d730: 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  ll-content.    *
d740: 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e  * area, accordin
d750: 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  g to the page he
d760: 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69  ader, lies withi
d770: 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20  n the page..    
d780: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  */.    if( nFree
d790: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
d7a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d7b0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d7c0: 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67   .    }.    pPag
d7d0: 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
d7e0: 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69  (nFree - iCellFi
d7f0: 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  rst);.    pPage-
d800: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d  >isInit = 1;.  }
d810: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d820: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
d830: 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
d840: 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
d850: 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
d860: 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
d870: 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
d880: 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
d890: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
d8a0: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
d8b0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
d8c0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
d8d0: 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
d8e0: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
d8f0: 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
d900: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d910: 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
d920: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d930: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
d940: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d950: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
d960: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d970: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
d980: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d990: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
d9a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
d9b0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
d9c0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d9d0: 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
d9e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
d9f0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
da00: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
da10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
da20: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
da30: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
da40: 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
da50: 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
da60: 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73  LETE ){.    mems
da70: 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30  et(&data[hdr], 0
da80: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
da90: 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20  e - hdr);.  }.  
daa0: 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61  data[hdr] = (cha
dab0: 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74  r)flags;.  first
dac0: 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73   = hdr + ((flags
dad0: 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20  &PTF_LEAF)==0 ? 
dae0: 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65  12 : 8);.  memse
daf0: 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
db00: 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64  0, 4);.  data[hd
db10: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32  r+7] = 0;.  put2
db20: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
db30: 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
db40: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
db50: 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  ree = (u16)(pBt-
db60: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
db70: 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c  rst);.  decodeFl
db80: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
db90: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  );.  pPage->cell
dba0: 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a  Offset = first;.
dbb0: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e    pPage->aDataEn
dbc0: 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75  d = &data[pBt->u
dbd0: 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50  sableSize];.  pP
dbe0: 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20  age->aCellIdx = 
dbf0: 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20  &data[first];.  
dc00: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
dc10: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
dc20: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
dc30: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
dc40: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
dc50: 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
dc60: 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67  = (u16)(pBt->pag
dc70: 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50  eSize - 1);.  pP
dc80: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
dc90: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
dca0: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  = 1;.}.../*.** C
dcb0: 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20  onvert a DbPage 
dcc0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68  obtained from th
dcd0: 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d  e pager into a M
dce0: 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a  emPage used by.*
dcf0: 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  * the btree laye
dd00: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  r..*/.static Mem
dd10: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46  Page *btreePageF
dd20: 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65  romDbPage(DbPage
dd30: 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20   *pDbPage, Pgno 
dd40: 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a  pgno, BtShared *
dd50: 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
dd60: 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  *pPage = (MemPag
dd70: 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
dd80: 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
dd90: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
dda0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
ddb0: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
ddc0: 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  .  pPage->pDbPag
ddd0: 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70  e = pDbPage;.  p
dde0: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
ddf0: 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d  .  pPage->pgno =
de00: 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e   pgno;.  pPage->
de10: 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  hdrOffset = pPag
de20: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
de30: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   : 0;.  return p
de40: 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
de50: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
de60: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
de70: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
de80: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
de90: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
dea0: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
deb0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43  **.** If the noC
dec0: 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73  ontent flag is s
ded0: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
dee0: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
def0: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
df00: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
df10: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
df20: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
df30: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
df40: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
df50: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
df60: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
df70: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
df80: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
df90: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
dfa0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
dfb0: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
dfc0: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
dfd0: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
dfe0: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
dff0: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
e000: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
e010: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
e020: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
e030: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
e040: 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
e050: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
e060: 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
e070: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
e080: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e090: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
e0a0: 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
e0b0: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
e0c0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
e0d0: 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
e0e0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ter */.  int fla
e0f0: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
e100: 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
e110: 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45  TENT or PAGER_GE
e120: 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b  T_READONLY */.){
e130: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
e140: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20  age *pDbPage;.. 
e150: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
e160: 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45  0 || flags==PAGE
e170: 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
e180: 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f  || flags==PAGER_
e190: 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a  GET_READONLY );.
e1a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e1b0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
e1c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
e1d0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
e1e0: 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
e1f0: 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
e200: 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c  e**)&pDbPage, fl
e210: 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ags);.  if( rc )
e220: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
e230: 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
e240: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
e250: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
e260: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e270: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
e280: 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
e290: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
e2a0: 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
e2b0: 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
e2c0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
e2d0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
e2e0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
e2f0: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
e300: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
e310: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
e320: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
e330: 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
e340: 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
e350: 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
e360: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
e370: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
e380: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e390: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
e3a0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
e3b0: 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
e3c0: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
e3d0: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
e3e0: 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
e3f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
e400: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
e410: 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
e420: 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
e430: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
e440: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
e450: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e460: 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
e470: 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
e480: 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
e490: 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
e4a0: 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
e4b0: 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61  tic Pgno btreePa
e4c0: 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
e4d0: 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e   *pBt){.  return
e4e0: 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75   pBt->nPage;.}.u
e4f0: 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  32 sqlite3BtreeL
e500: 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70  astPage(Btree *p
e510: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
e520: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
e530: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
e540: 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50  rt( ((p->pBt->nP
e550: 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29 3d  age)&0x8000000)=
e560: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  =0 );.  return b
e570: 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d  treePagecount(p-
e580: 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pBt);.}../*.** 
e590: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
e5a0: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
e5b0: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
e5c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75  is routine is ju
e5d0: 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65  st a.** convenie
e5e0: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
e5f0: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
e600: 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67  s to btreeGetPag
e610: 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65  e() and .** btre
e620: 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a  eInitPage()..**.
e630: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
e640: 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
e650: 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73  value *ppPage is
e660: 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66   set to is undef
e670: 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20  ined. It.** may 
e680: 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
e690: 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73  , or it may be s
e6a0: 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  et to an invalid
e6b0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
e6c0: 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
e6d0: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
e6e0: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
e6f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
e700: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
e710: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
e720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e730: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
e740: 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
e750: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
e760: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
e770: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
e780: 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65   page pointer he
e790: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61  re */.  int bRea
e7a0: 64 6f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20  donly           
e7b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
e7c0: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 6f 72  _GET_READONLY or
e7d0: 20 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72   0 */.){.  int r
e7e0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  c;.  assert( sql
e7f0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e800: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
e810: 20 61 73 73 65 72 74 28 20 62 52 65 61 64 6f 6e   assert( bReadon
e820: 6c 79 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45  ly==PAGER_GET_RE
e830: 41 44 4f 4e 4c 59 20 7c 7c 20 62 52 65 61 64 6f  ADONLY || bReado
e840: 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  nly==0 );..  if(
e850: 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63   pgno>btreePagec
e860: 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
e870: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
e880: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c  RUPT_BKPT;.  }el
e890: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  se{.    rc = btr
e8a0: 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
e8b0: 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 52 65  gno, ppPage, bRe
e8c0: 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 69 66 28  adonly);.    if(
e8d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
e8e0: 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  & (*ppPage)->isI
e8f0: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nit==0 ){.      
e900: 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
e910: 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
e920: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e930: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
e940: 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
e950: 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
e960: 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63    }.  }..  testc
e970: 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a  ase( pgno==0 );.
e980: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
e990: 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
e9a0: 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74  CORRUPT );.  ret
e9b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
e9c0: 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61   Release a MemPa
e9d0: 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ge.  This should
e9e0: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   be called once 
e9f0: 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a  for each prior.*
ea00: 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47  * call to btreeG
ea10: 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  etPage..*/.stati
ea20: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
ea30: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
ea40: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
ea50: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
ea60: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
ea70: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
ea80: 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73  ->pBt );.    ass
ea90: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50  ert( pPage->pDbP
eaa0: 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  age!=0 );.    as
eab0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
eac0: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
ead0: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
eae0: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
eaf0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
eb00: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
eb10: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
eb20: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
eb30: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
eb40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
eb50: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
eb60: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
eb70: 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
eb80: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
eb90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
eba0: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
ebb0: 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  , when the pager
ebc0: 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61   reloads informa
ebd0: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61  tion into the ca
ebe0: 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74  che.** so that t
ebf0: 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74  he cache is rest
ec00: 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
ec10: 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68  inal state at th
ec20: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
ec30: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66  e transaction, f
ec40: 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73  or each page res
ec50: 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69  tored this routi
ec60: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
ec70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ec80: 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20   needs to reset 
ec90: 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73  the extra data s
eca0: 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e  ection at the en
ecb0: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  d of the.** page
ecc0: 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
ecd0: 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61  he restored data
ece0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ecf0: 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61   pageReinit(DbPa
ed00: 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65  ge *pData){.  Me
ed10: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
ed20: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
ed30: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
ed40: 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
ed50: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ed60: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
ed70: 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20  nt(pData)>0 );. 
ed80: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
ed90: 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  it ){.    assert
eda0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
edb0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
edc0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70  >mutex) );.    p
edd0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
ede0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
edf0: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
ee00: 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20  nt(pData)>1 ){. 
ee10: 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69       /* pPage mi
ee20: 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72  ght not be a btr
ee30: 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67  ee page;  it mig
ee40: 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ht be an overflo
ee50: 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
ee60: 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f  or ptrmap page o
ee70: 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20  r a free page.  
ee80: 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20  In those cases, 
ee90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
eea0: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62      ** call to b
eeb0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77  treeInitPage() w
eec0: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72  ill likely retur
eed0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
eee0: 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e  ..      ** But n
eef0: 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62  o harm is done b
ef00: 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20  y this.  And it 
ef10: 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e  is very importan
ef20: 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  t that.      ** 
ef30: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
ef40: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65  be called on eve
ef50: 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f  ry btree page so
ef60: 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   we make.      *
ef70: 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65  * the call for e
ef80: 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63  very page that c
ef90: 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69  omes in for re-i
efa0: 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  niting. */.     
efb0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
efc0: 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
efd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
efe0: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
eff0: 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a  r for a btree..*
f000: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
f010: 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
f020: 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  ler(void *pArg){
f030: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
f040: 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41   = (BtShared*)pA
f050: 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rg;.  assert( pB
f060: 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72  t->db );.  asser
f070: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
f080: 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d  _held(pBt->db->m
f090: 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
f0a0: 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  n sqlite3InvokeB
f0b0: 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d  usyHandler(&pBt-
f0c0: 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72  >db->busyHandler
f0d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
f0e0: 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
f0f0: 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
f100: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
f110: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
f120: 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
f130: 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68  me is NULL.** th
f140: 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
f150: 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
f160: 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65  ted.  The epheme
f170: 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67  ral database mig
f180: 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69  ht.** be exclusi
f190: 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  vely in memory, 
f1a0: 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20  or it might use 
f1b0: 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d  a disk-based mem
f1c0: 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69  ory cache..** Ei
f1d0: 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70  ther way, the ep
f1e0: 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
f1f0: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
f200: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a  ically deleted .
f210: 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ** when sqlite3B
f220: 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
f230: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
f240: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
f250: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
f260: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
f270: 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
f280: 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
f290: 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
f2a0: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
f2b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66  ed..**.** The "f
f2c0: 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20  lags" parameter 
f2d0: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61  is a bitmask tha
f2e0: 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  t might contain 
f2f0: 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52  bits like.** BTR
f300: 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  EE_OMIT_JOURNAL 
f310: 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d  and/or BTREE_MEM
f320: 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ORY..**.** If th
f330: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
f340: 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20  ready opened in 
f350: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
f360: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
f370: 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68  and we are in sh
f380: 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c  ared cache mode,
f390: 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77   then the open w
f3a0: 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e  ill fail with an
f3b0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  .** SQLITE_CONST
f3c0: 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65  RAINT error.  We
f3d0: 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77   cannot allow tw
f3e0: 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72  o or more BtShar
f3f0: 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e  ed.** objects in
f400: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
f410: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69  se connection si
f420: 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c  nce doing so wil
f430: 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f  l lead.** to pro
f440: 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69  blems with locki
f450: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
f460: 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73  e3BtreeOpen(.  s
f470: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
f480: 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f  ,      /* VFS to
f490: 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d   use for this b-
f4a0: 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tree */.  const 
f4b0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
f4c0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
f4d0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
f4e0: 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
f4f0: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
f500: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
f510: 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
f520: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
f530: 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
f540: 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ree,        /* P
f550: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74  ointer to new Bt
f560: 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74  ree object writt
f570: 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  en here */.  int
f580: 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
f590: 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20       /* Options 
f5a0: 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
f5b0: 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
f5c0: 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
f5d0: 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
f5e0: 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
f5f0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
f600: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
f610: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
f620: 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
f630: 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
f640: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
f650: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
f660: 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
f670: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
f680: 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20  *mutexOpen = 0; 
f690: 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72   /* Prevents a r
f6a0: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54  ace condition. T
f6b0: 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20  icket #3537 */. 
f6c0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
f6d0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
f6e0: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
f6f0: 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
f700: 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72  n */.  u8 nReser
f710: 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ve;             
f720: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
f730: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   unused space on
f740: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
f750: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
f760: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f  bHeader[100];  /
f770: 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
f780: 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  r content */..  
f790: 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69  /* True if openi
f7a0: 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c  ng an ephemeral,
f7b0: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
f7c0: 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ase */.  const i
f7d0: 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46  nt isTempDb = zF
f7e0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
f7f0: 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a  ilename[0]==0;..
f800: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
f810: 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
f820: 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
f830: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
f840: 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
f850: 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
f860: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
f870: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
f880: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f  IT_MEMORYDB.  co
f890: 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
f8a0: 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e  = 0;.#else.  con
f8b0: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
f8c0: 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73   (zFilename && s
f8d0: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
f8e0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29   ":memory:")==0)
f8f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f900: 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65          || (isTe
f910: 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54  mpDb && sqlite3T
f920: 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29  empInMemory(db))
f930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f940: 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46          || (vfsF
f950: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
f960: 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23  EN_MEMORY)!=0;.#
f970: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
f980: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
f990: 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20  rt( pVfs!=0 );. 
f9a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f9b0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
f9c0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
f9d0: 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29  rt( (flags&0xff)
f9e0: 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20  ==flags );   /* 
f9f0: 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62  flags fit in 8 b
fa00: 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c  its */..  /* Onl
fa10: 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  y a BTREE_SINGLE
fa20: 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
fa30: 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
fa40: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
fa50: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f  lags & BTREE_UNO
fa60: 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66  RDERED)==0 || (f
fa70: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
fa80: 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  GLE)!=0 );..  /*
fa90: 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   A BTREE_SINGLE 
faa0: 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61  database is alwa
fab0: 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61  ys a temporary a
fac0: 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20  nd/or ephemeral 
fad0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
fae0: 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
faf0: 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70  LE)==0 || isTemp
fb00: 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d  Db );..  if( isM
fb10: 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67  emdb ){.    flag
fb20: 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52  s |= BTREE_MEMOR
fb30: 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66  Y;.  }.  if( (vf
fb40: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
fb50: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30  OPEN_MAIN_DB)!=0
fb60: 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20   && (isMemdb || 
fb70: 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20  isTempDb) ){.   
fb80: 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73   vfsFlags = (vfs
fb90: 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f  Flags & ~SQLITE_
fba0: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20  OPEN_MAIN_DB) | 
fbb0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
fbc0: 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  _DB;.  }.  p = s
fbd0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
fbe0: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
fbf0: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
fc00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
fc10: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
fc20: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
fc30: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
fc40: 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
fc50: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
fc60: 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42  CHE.  p->lock.pB
fc70: 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c  tree = p;.  p->l
fc80: 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a  ock.iTable = 1;.
fc90: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
fca0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
fcb0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
fcc0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
fcd0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
fce0: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
fcf0: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
fd00: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
fd10: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
fd20: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
fd30: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
fd40: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
fd50: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
fd60: 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d  .  if( isTempDb=
fd70: 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d  =0 && (isMemdb==
fd80: 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53  0 || (vfsFlags&S
fd90: 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21  QLITE_OPEN_URI)!
fda0: 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76  =0) ){.    if( v
fdb0: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
fdc0: 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
fdd0: 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E ){.      int n
fde0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
fdf0: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
fe00: 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
fe10: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
fe20: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75  qlite3Malloc(nFu
fe30: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
fe40: 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
fe50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
fe60: 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20  utexShared; ).  
fe70: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
fe80: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21  = 1;.      if( !
fe90: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
fea0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
feb0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
fec0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fed0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
fee0: 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62       if( isMemdb
fef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
ff00: 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  py(zFullPathname
ff10: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c  , zFilename, sql
ff20: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
ff30: 6c 65 6e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20  lename)+1);.    
ff40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ff50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
ff60: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
ff70: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
ff80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffa0: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  nFullPathname, z
ffb0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
ffc0: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
ffd0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ffe0: 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
fff0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
10000 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10010 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
10020 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
10030 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  }.      }.#if SQ
10040 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
10050 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20        mutexOpen 
10060 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
10070 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
10080 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20  _STATIC_OPEN);. 
10090 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
100a0 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70  ex_enter(mutexOp
100b0 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  en);.      mutex
100c0 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
100d0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
100e0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
100f0 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
10100 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
10110 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
10120 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72  #endif.      for
10130 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
10140 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
10150 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
10160 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
10170 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
10180 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
10190 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
101a0 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
101b0 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
101c0 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
101d0 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20  t->pPager, 0)). 
101e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101f0 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
10200 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
10210 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
10220 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
10230 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
10240 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
10250 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
10260 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
10270 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
10280 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
10290 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
102a0 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
102b0 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
102c0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
102d0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
102e0 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
102f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10300 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10310 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
10320 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10330 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
10340 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
10350 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
10360 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
10370 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10380 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
10390 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
103a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
103b0 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
103c0 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
103d0 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
103e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
103f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
10400 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10410 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
10420 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
10430 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
10440 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
10450 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
10460 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
10470 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
10480 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
10490 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
104a0 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
104b0 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
104c0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
104d0 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
104e0 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
104f0 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
10500 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
10510 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
10520 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10530 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
10540 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
10550 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
10560 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
10570 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
10580 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
10590 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
105a0 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
105b0 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
105c0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
105d0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
105e0 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
105f0 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
10600 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
10610 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
10620 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
10630 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
10640 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
10650 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
10660 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
10670 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
10680 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
10690 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c  sizeof(i64)==8 |
106a0 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34  | sizeof(i64)==4
106b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
106c0 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c  sizeof(u64)==8 |
106d0 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34  | sizeof(u64)==4
106e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
106f0 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
10700 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
10710 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
10720 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
10730 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
10740 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
10750 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
10760 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
10770 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
10780 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
10790 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
107a0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
107b0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
107c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
107d0 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
107e0 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
107f0 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58                EX
10810 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c  TRA_SIZE, flags,
10820 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52   vfsFlags, pageR
10830 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  einit);.    if( 
10840 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10850 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
10860 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
10870 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d  pBt->pPager, db-
10880 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20  >szMmap);.      
10890 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
108a0 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
108b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
108c0 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
108d0 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
108e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
108f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
10900 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
10910 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ut;.    }.    pB
10920 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28  t->openFlags = (
10930 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42  u8)flags;.    pB
10940 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  t->db = db;.    
10950 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
10960 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
10970 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76  pPager, btreeInv
10980 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20  okeBusyHandler, 
10990 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  pBt);.    p->pBt
109a0 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70   = pBt;.  .    p
109b0 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
109c0 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
109d0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
109e0 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
109f0 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
10a00 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ) ) pBt->btsFlag
10a10 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
10a20 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  LY;.#ifdef SQLIT
10a30 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
10a40 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
10a50 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
10a60 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20  DELETE;.#endif. 
10a70 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
10a80 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36   = (zDbHeader[16
10a90 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64  ]<<8) | (zDbHead
10aa0 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  er[17]<<16);.   
10ab0 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
10ac0 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
10ad0 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
10ae0 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
10af0 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
10b00 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
10b10 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
10b20 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
10b30 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
10b40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10b50 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
10b60 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
10b70 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
10b80 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
10b90 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
10ba0 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
10bb0 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
10bc0 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
10bd0 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
10be0 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
10bf0 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
10c00 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
10c10 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
10c20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
10c30 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
10c40 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
10c50 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
10c60 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
10c70 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
10c80 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
10c90 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
10ca0 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
10cb0 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
10cc0 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
10cd0 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
10ce0 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
10cf0 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
10d00 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
10d10 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
10d20 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
10d30 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
10d40 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
10d50 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
10d60 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
10d70 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
10d80 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
10d90 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
10da0 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72  se{.      nReser
10db0 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
10dc0 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  0];.      pBt->b
10dd0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
10de0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
10df0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10e00 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
10e10 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
10e20 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
10e30 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
10e40 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
10e50 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
10e60 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
10e70 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
10e80 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
10e90 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
10ea0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
10eb0 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
10ec0 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
10ed0 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
10ee0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
10ef0 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
10f00 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
10f10 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
10f20 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
10f30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
10f40 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
10f50 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
10f60 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
10f70 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a  pageSize */.   .
10f80 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
10f90 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
10fa0 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
10fb0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
10fc0 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
10fd0 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
10fe0 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
10ff0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
11000 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
11010 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
11020 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
11030 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
11040 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
11050 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a  *mutexShared; ).
11060 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20        pBt->nRef 
11070 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  = 1;.      MUTEX
11080 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61  _LOGIC( mutexSha
11090 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
110a0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
110b0 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
110c0 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20  ER);).      if( 
110d0 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
110e0 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  E && sqlite3Glob
110f0 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
11100 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  tex ){.        p
11110 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  Bt->mutex = sqli
11120 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
11130 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
11140 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  ;.        if( pB
11150 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  t->mutex==0 ){. 
11160 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
11170 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
11180 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
11190 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  Failed = 0;.    
111a0 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
111b0 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20  _open_out;.     
111c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
111d0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
111e0 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
111f0 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ed);.      pBt->
11200 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pNext = GLOBAL(B
11210 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
11220 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
11230 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  ;.      GLOBAL(B
11240 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
11250 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
11260 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71   = pBt;.      sq
11270 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
11280 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
11290 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
112a0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
112b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
112c0 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
112d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
112e0 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66  _DISKIO).  /* If
112f0 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75   the new Btree u
11300 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70  ses a sharable p
11310 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c  BtShared, then l
11320 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  ink the new.  **
11330 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20   Btree into the 
11340 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72  list of all shar
11350 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20  able Btrees for 
11360 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74  the same connect
11370 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69  ion..  ** The li
11380 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73  st is kept in as
11390 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
113a0 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20   pBt address..  
113b0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  */.  if( p->shar
113c0 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  able ){.    int 
113d0 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53  i;.    Btree *pS
113e0 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ib;.    for(i=0;
113f0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
11400 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69  {.      if( (pSi
11410 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  b = db->aDb[i].p
11420 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e  Bt)!=0 && pSib->
11430 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
11440 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
11450 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d  >pPrev ){ pSib =
11460 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a   pSib->pPrev; }.
11470 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
11480 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a  Bt<pSib->pBt ){.
11490 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
114a0 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  xt = pSib;.     
114b0 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
114c0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69  0;.          pSi
114d0 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  b->pPrev = p;.  
114e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
114f0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
11500 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69  ib->pNext && pSi
11510 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d  b->pNext->pBt<p-
11520 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
11530 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d      pSib = pSib-
11540 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
11550 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
11560 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70  >pNext = pSib->p
11570 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
11580 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b  p->pPrev = pSib;
11590 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
115a0 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
115b0 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d         p->pNext-
115c0 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
115d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
115e0 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20    pSib->pNext = 
115f0 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
11600 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11610 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
11620 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20  ndif.  *ppBtree 
11630 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
11640 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
11650 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11660 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
11670 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
11680 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
11690 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
116a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
116b0 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
116c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
116d0 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
116e0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
116f0 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72    /* If the B-Tr
11700 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ee was successfu
11710 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20  lly opened, set 
11720 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
11730 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20  size to the.    
11740 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
11750 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f  . Except, when o
11760 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69  pening on an exi
11770 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67  sting shared pag
11780 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a  er-cache,.    **
11790 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74   do not change t
117a0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
117b0 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
117c0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
117d0 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d  Schema(p, 0, 0)=
117e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
117f0 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
11800 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  size(p->pBt->pPa
11810 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ger, SQLITE_DEFA
11820 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b  ULT_CACHE_SIZE);
11830 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
11840 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20   mutexOpen ){.  
11850 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11860 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74  3_mutex_held(mut
11870 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73  exOpen) );.    s
11880 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
11890 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
118a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
118b0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
118c0 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  nt the BtShared.
118d0 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57  nRef counter.  W
118e0 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a  hen it reaches z
118f0 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74  ero,.** remove t
11900 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
11910 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73  cture from the s
11920 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65  haring list.  Re
11930 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
11940 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
11950 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65  f counter reache
11960 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  s zero and retur
11970 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74  n.** false if it
11980 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69   is still positi
11990 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ve..*/.static in
119a0 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  t removeFromShar
119b0 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64  ingList(BtShared
119c0 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20   *pBt){.#ifndef 
119d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
119e0 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58  ED_CACHE.  MUTEX
119f0 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
11a00 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
11a10 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ).  BtShared *pL
11a20 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
11a30 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
11a40 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11a50 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
11a60 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f  tex) );.  MUTEX_
11a70 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
11a80 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
11a90 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
11aa0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
11ab0 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
11ac0 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
11ad0 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
11ae0 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
11af0 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
11b00 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
11b10 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
11b20 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
11b30 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
11b40 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
11b50 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
11b60 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
11b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
11b80 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
11b90 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
11ba0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
11bb0 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
11bc0 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
11bd0 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
11be0 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
11bf0 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
11c00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11c10 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
11c20 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
11c30 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
11c40 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
11c50 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
11c60 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
11c70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
11c80 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
11c90 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
11ca0 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
11cb0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
11cc0 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
11cd0 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
11ce0 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
11cf0 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
11d00 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
11d10 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
11d20 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
11d30 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
11d40 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
11d50 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62 79  ytes with a 4-by
11d60 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61 20  te prefix for a 
11d70 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f  left-child.** po
11d80 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
11d90 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65   void allocateTe
11da0 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
11db0 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70   *pBt){.  if( !p
11dc0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
11dd0 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
11de0 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
11df0 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
11e00 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f  geSize );..    /
11e10 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65  * One of the use
11e20 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70  s of pBt->pTmpSp
11e30 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74  ace is to format
11e40 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20   cells before.  
11e50 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74    ** inserting t
11e60 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20  hem into a leaf 
11e70 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66  page (function f
11e80 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66  illInCell()). If
11e90 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69  .    ** a cell i
11ea0 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79  s less than 4 by
11eb0 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20  tes in size, it 
11ec0 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  is rounded up to
11ed0 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20   4 bytes.    ** 
11ee0 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72  by the various r
11ef0 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e  outines that man
11f00 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63  ipulate binary c
11f10 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20  ells. Which.    
11f20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74  ** can mean that
11f30 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e   fillInCell() on
11f40 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74  ly initializes t
11f50 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a  he first 2 or 3.
11f60 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
11f70 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74  pTmpSpace, but t
11f80 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20  hat the first 4 
11f90 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64  bytes are copied
11fa0 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20   from.    ** it 
11fb0 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  into a database 
11fc0 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f  page. This is no
11fd0 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f  t actually a pro
11fe0 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20  blem, but it.   
11ff0 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61   ** does cause a
12000 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20   valgrind error 
12010 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20  when the 1 or 2 
12020 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c  bytes of unitial
12030 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74  ized .    ** dat
12040 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73  a is passed to s
12050 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65  ystem call write
12060 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20  (). So to avoid 
12070 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20  this error,.    
12080 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73  ** zero the firs
12090 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d  t 4 bytes of tem
120a0 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20 20  p space here..  
120b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
120c0 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72 20  :  Provide four 
120d0 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61 6c  bytes of initial
120e0 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f 72  ized space befor
120f0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65 67  e the.    ** beg
12100 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53 70  inning of pTmpSp
12110 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20 61  ace as an area a
12120 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65 70  vailable to prep
12130 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c  end the.    ** l
12140 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  eft-child pointe
12150 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  r to the beginni
12160 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20  ng of a cell..  
12170 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74    */.    if( pBt
12180 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
12190 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74 2d       memset(pBt-
121a0 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 38  >pTmpSpace, 0, 8
121b0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 54  );.      pBt->pT
121c0 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20  mpSpace += 4;.  
121d0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
121e0 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70   Free the pBt->p
121f0 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  TmpSpace allocat
12200 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
12210 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65  id freeTempSpace
12220 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
12230 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70  .  if( pBt->pTmp
12240 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
12250 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20 34  ->pTmpSpace -= 4
12260 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
12270 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70 53  eFree(pBt->pTmpS
12280 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e  pace);.    pBt->
12290 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 20  pTmpSpace = 0;. 
122a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
122b0 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61  e an open databa
122c0 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74  se and invalidat
122d0 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
122e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
122f0 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70  eeClose(Btree *p
12300 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
12310 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
12320 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a  tCursor *pCur;..
12330 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63    /* Close all c
12340 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69  ursors opened vi
12350 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20  a this handle.  
12360 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
12370 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12380 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
12390 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
123a0 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20  nter(p);.  pCur 
123b0 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
123c0 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b    while( pCur ){
123d0 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70  .    BtCursor *p
123e0 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20  Tmp = pCur;.    
123f0 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  pCur = pCur->pNe
12400 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70  xt;.    if( pTmp
12410 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
12420 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
12430 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d  eCloseCursor(pTm
12440 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
12450 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79   /* Rollback any
12460 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
12470 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65  ion and free the
12480 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72   handle structur
12490 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  e..  ** The call
124a0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
124b0 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73  Rollback() drops
124c0 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73   any table-locks
124d0 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68   held by.  ** th
124e0 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a  is handle..  */.
124f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
12500 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45  llback(p, SQLITE
12510 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  _OK);.  sqlite3B
12520 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20  treeLeave(p);.. 
12530 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
12540 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74   still other out
12550 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
12560 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65  ces to the share
12570 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72  d-btree.  ** str
12580 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e  ucture, return n
12590 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65  ow. The remainde
125a0 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64  r of this proced
125b0 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a  ure cleans .  **
125c0 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62   up the shared-b
125d0 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tree..  */.  ass
125e0 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
125f0 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b  ck==0 && p->lock
12600 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ed==0 );.  if( !
12610 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72  p->sharable || r
12620 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
12630 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20  List(pBt) ){.   
12640 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e   /* The pBt is n
12650 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20  o longer on the 
12660 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f  sharing list, so
12670 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20   we can access. 
12680 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74     ** it without
12690 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20   having to hold 
126a0 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a  the mutex..    *
126b0 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f  *.    ** Clean o
126c0 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ut and delete th
126d0 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
126e0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
126f0 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72  sert( !pBt->pCur
12700 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  sor );.    sqlit
12710 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
12720 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
12730 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68  f( pBt->xFreeSch
12740 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68  ema && pBt->pSch
12750 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ema ){.      pBt
12760 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42  ->xFreeSchema(pB
12770 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
12780 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
12790 46 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63  Free(0, pBt->pSc
127a0 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54  hema);.    freeT
127b0 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
127c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
127d0 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  pBt);.  }..#ifnd
127e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
127f0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73  HARED_CACHE.  as
12800 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c  sert( p->wantToL
12810 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ock==0 );.  asse
12820 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30  rt( p->locked==0
12830 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   );.  if( p->pPr
12840 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70  ev ) p->pPrev->p
12850 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
12860 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
12870 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ) p->pNext->pPre
12880 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65  v = p->pPrev;.#e
12890 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ndif..  sqlite3_
128a0 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72  free(p);.  retur
128b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
128c0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
128d0 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75   limit on the nu
128e0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c  mber of pages al
128f0 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63  lowed in the cac
12900 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  he..**.** The ma
12910 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
12920 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73  cache pages is s
12930 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75  et to the absolu
12940 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d  te.** value of m
12950 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67  xPage.  If mxPag
12960 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
12970 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a  he pager will.**
12980 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72   operate asynchr
12990 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c  onously - it wil
129a0 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f  l not stop to do
129b0 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20   fsync()s.** to 
129c0 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77  insure data is w
129d0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69  ritten to the di
129e0 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72  sk surface befor
129f0 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  e.** continuing.
12a00 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73    Transactions s
12a10 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e  till work if syn
12a20 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
12a30 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
12a40 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63  base cannot be c
12a50 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73  orrupted if this
12a60 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73   program.** cras
12a70 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65  hes.  But if the
12a80 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
12a90 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65  m crashes or the
12aa0 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75  re is.** an abru
12ab0 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  pt power failure
12ac0 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75   when synchronou
12ad0 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61  s is off, the da
12ae0 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20  tabase.** could 
12af0 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  be left in an in
12b00 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75  consistent and u
12b10 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61  nrecoverable sta
12b20 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f  te..** Synchrono
12b30 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61  us is on by defa
12b40 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20  ult so database 
12b50 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f  corruption is no
12b60 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20  t.** normally a 
12b70 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  worry..*/.int sq
12b80 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
12b90 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  heSize(Btree *p,
12ba0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
12bb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
12bc0 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
12bd0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
12be0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
12bf0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
12c00 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12c10 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
12c20 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  achesize(pBt->pP
12c30 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
12c40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
12c50 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
12c60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
12c70 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
12c80 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43  P_SIZE>0./*.** C
12c90 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
12ca0 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  on the amount of
12cb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12cc0 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a  le that may be.*
12cd0 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e  * memory mapped.
12ce0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12cf0 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74  treeSetMmapLimit
12d00 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74  (Btree *p, sqlit
12d10 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29  e3_int64 szMmap)
12d20 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
12d30 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
12d40 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12d50 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
12d60 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
12d70 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
12d80 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
12d90 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
12da0 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70  ->pPager, szMmap
12db0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
12dc0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
12dd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12de0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12df0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
12e00 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  0 */../*.** Chan
12e10 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20  ge the way data 
12e20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  is synced to dis
12e30 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  k in order to in
12e40 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61  crease or decrea
12e50 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74  se.** how well t
12e60 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69  he database resi
12e70 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74  sts damage due t
12e80 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64  o OS crashes and
12e90 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
12ea0 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20  es.  Level 1 is 
12eb0 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e  the same as asyn
12ec0 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e  chronous (no syn
12ed0 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a  cs() occur and.*
12ee0 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67  * there is a hig
12ef0 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  h probability of
12f00 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20   damage)  Level 
12f10 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  2 is the default
12f20 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61  .  There.** is a
12f30 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f   very low but no
12f40 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
12f50 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c  ty of damage.  L
12f60 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74  evel 3 reduces t
12f70 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74  he.** probabilit
12f80 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e  y of damage to n
12f90 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74  ear zero but wit
12fa0 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72  h a write perfor
12fb0 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e  mance reduction.
12fc0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
12fd0 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
12fe0 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65  AGMAS.int sqlite
12ff0 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
13000 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  ags(.  Btree *p,
13010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13020 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65   The btree to se
13030 74 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76  t the safety lev
13040 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67  el on */.  unsig
13050 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20  ned pgFlags     
13060 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47    /* Various PAG
13070 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  ER_* flags */.){
13080 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
13090 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
130a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
130b0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
130c0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
130d0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
130e0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
130f0 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61  etFlags(pBt->pPa
13100 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20  ger, pgFlags);. 
13110 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
13120 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
13130 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
13140 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
13150 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
13160 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74  ven btree is set
13170 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c   to safety level
13180 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a   1.  In other.**
13190 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
131a0 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29  RUE if no sync()
131b0 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64   occurs on the d
131c0 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  isk files..*/.in
131d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  t sqlite3BtreeSy
131e0 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65  ncDisabled(Btree
131f0 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
13200 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
13210 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
13220 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
13230 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
13240 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69  tex) );  .  sqli
13250 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
13260 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20  ;.  assert( pBt 
13270 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
13280 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
13290 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d  PagerNosync(pBt-
132a0 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69  >pPager);.  sqli
132b0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
132c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
132d0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
132e0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73  he default pages
132f0 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75   size and the nu
13300 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
13310 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e   bytes per page.
13320 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70  .** Or, if the p
13330 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72  age size has alr
13340 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c  eady been fixed,
13350 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
13360 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68  EADONLY .** with
13370 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79  out changing any
13380 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  thing..**.** The
13390 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   page size must 
133a0 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
133b0 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
133c0 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70  65536.  If the p
133d0 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70  age.** size supp
133e0 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65  lied does not me
133f0 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  et this constrai
13400 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  nt then the page
13410 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   size is not.** 
13420 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50  changed..**.** P
13430 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f  age sizes are co
13440 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20  nstrained to be 
13450 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73  a power of two s
13460 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f  o that the regio
13470 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  n.** of the data
13480 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66  base file used f
13490 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69  or locking (begi
134a0 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47  nning at PENDING
134b0 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69  _BYTE,.** the fi
134c0 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
134d0 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20  e 1GB boundary, 
134e0 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64  0x40000000) need
134f0 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74  s to occur.** at
13500 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
13510 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  f a page..**.** 
13520 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65  If parameter nRe
13530 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68  serve is less th
13540 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
13550 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
13560 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65  rved.** bytes pe
13570 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75  r page is left u
13580 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
13590 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74  If the iFix!=0 t
135a0 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45  hen the BTS_PAGE
135b0 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20  SIZE_FIXED flag 
135c0 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74  is set so that t
135d0 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20  he page size.** 
135e0 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d  and autovacuum m
135f0 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65  ode can no longe
13600 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f  r be changed..*/
13610 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13620 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eSetPageSize(Btr
13630 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53  ee *p, int pageS
13640 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
13650 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20  e, int iFix){.  
13660 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13670 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
13680 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
13690 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
136a0 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65  >=-1 && nReserve
136b0 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74  <=255 );.  sqlit
136c0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
136d0 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
136e0 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53  lags & BTS_PAGES
136f0 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20  IZE_FIXED ){.   
13700 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
13710 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
13720 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
13730 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  Y;.  }.  if( nRe
13740 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e  serve<0 ){.    n
13750 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70  Reserve = pBt->p
13760 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
13770 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20  sableSize;.  }. 
13780 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
13790 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
137a0 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70  <=255 );.  if( p
137b0 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
137c0 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
137d0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26  _MAX_PAGE_SIZE &
137e0 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65  &.        ((page
137f0 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
13800 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
13810 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
13820 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  7)==0 );.    ass
13830 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65  ert( !pBt->pPage
13840 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73  1 && !pBt->pCurs
13850 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  or );.    pBt->p
13860 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70  ageSize = (u32)p
13870 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65  ageSize;.    fre
13880 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
13890 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
138a0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
138b0 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
138c0 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
138d0 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42   nReserve);.  pB
138e0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
138f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
13900 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (u16)nReserve;. 
13910 20 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d   if( iFix ) pBt-
13920 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
13930 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
13940 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
13950 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
13960 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
13970 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
13980 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65  tly defined page
13990 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
139a0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
139b0 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Size(Btree *p){.
139c0 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
139d0 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69  >pageSize;.}..#i
139e0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
139f0 5f 48 41 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64  _HAS_CODEC) || d
13a00 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
13a10 42 55 47 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BUG)./*.** This 
13a20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69  function is simi
13a30 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lar to sqlite3Bt
13a40 72 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c  reeGetReserve(),
13a50 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a   except that it.
13a60 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  ** may only be c
13a70 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67  alled if it is g
13a80 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
13a90 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  he b-tree mutex 
13aa0 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65  is already.** he
13ab0 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ld..**.** This i
13ac0 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20  s useful in one 
13ad0 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20  special case in 
13ae0 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63  the backup API c
13af0 6f 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a  ode where it is.
13b00 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68  ** known that th
13b10 65 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20  e shared b-tree 
13b20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62  mutex is held, b
13b30 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ut the mutex on 
13b40 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
13b50 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
13b60 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20  s *p is not. In 
13b70 74 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c  this case if sql
13b80 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29  ite3BtreeEnter()
13b90 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63  .** were to be c
13ba0 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20  alled, it might 
13bb0 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d  collide with som
13bc0 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f  e other operatio
13bd0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  n on the.** data
13be0 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
13bf0 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e   owns *p, causin
13c00 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61  g undefined beha
13c10 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  vior..*/.int sql
13c20 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
13c30 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65  rveNoMutex(Btree
13c40 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
13c50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13c60 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  ld(p->pBt->mutex
13c70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ) );.  return p-
13c80 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  >pBt->pageSize -
13c90 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53   p->pBt->usableS
13ca0 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ize;.}.#endif /*
13cb0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
13cc0 43 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 42 55  C || SQLITE_DEBU
13cd0 47 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  G */..#if !defin
13ce0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
13cf0 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
13d00 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13d10 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a  _OMIT_VACUUM)./*
13d20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
13d30 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
13d40 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
13d50 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  nd of every page
13d60 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74   that.** are int
13d70 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e  entually left un
13d80 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  used.  This is t
13d90 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70  he "reserved" sp
13da0 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73  ace that is.** s
13db0 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79  ometimes used by
13dc0 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a   extensions..*/.
13dd0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
13de0 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65  GetReserve(Btree
13df0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
13e00 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
13e10 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e  er(p);.  n = p->
13e20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
13e30 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
13e40 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ze;.  sqlite3Btr
13e50 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
13e60 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
13e70 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
13e80 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
13e90 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
13ea0 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
13eb0 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
13ec0 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
13ed0 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
13ee0 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
13ef0 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
13f00 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
13f10 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
13f20 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
13f30 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
13f40 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
13f50 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
13f60 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
13f70 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
13f80 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
13f90 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
13fa0 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
13fb0 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
13fc0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
13fd0 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
13fe0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42  ./*.** Set the B
13ff0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
14000 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67   flag if newFlag
14010 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20   is 0 or 1.  If 
14020 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a  newFlag is -1,.*
14030 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63  * then make no c
14040 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20  hanges.  Always 
14050 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  return the value
14060 20 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43 55   of the BTS_SECU
14070 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74  RE_DELETE.** set
14080 74 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 63  ting after the c
14090 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  hange..*/.int sq
140a0 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65  lite3BtreeSecure
140b0 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c  Delete(Btree *p,
140c0 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20   int newFlag){. 
140d0 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d   int b;.  if( p=
140e0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
140f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
14100 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77  er(p);.  if( new
14110 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70  Flag>=0 ){.    p
14120 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
14130 26 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44  &= ~BTS_SECURE_D
14140 45 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e  ELETE;.    if( n
14150 65 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d  ewFlag ) p->pBt-
14160 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
14170 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
14180 20 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70    } .  b = (p->p
14190 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
141a0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
141b0 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42  )!=0;.  sqlite3B
141c0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
141d0 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64  return b;.}.#end
141e0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
141f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
14200 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
14210 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14220 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a  T_VACUUM) */../*
14230 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27  .** Change the '
14240 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
14250 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74  perty of the dat
14260 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61  abase. If the 'a
14270 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61  utoVacuum'.** pa
14280 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
14290 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76  ero, then auto-v
142a0 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e  acuum mode is en
142b0 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20  abled. If zero, 
142c0 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  it.** is disable
142d0 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  d. The default v
142e0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74  alue for the aut
142f0 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74  o-vacuum propert
14300 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69  y is .** determi
14310 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ned by the SQLIT
14320 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
14330 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69  CUUM macro..*/.i
14340 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
14350 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
14360 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56  ee *p, int autoV
14370 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53  acuum){.#ifdef S
14380 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
14390 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53  ACUUM.  return S
143a0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
143b0 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64  #else.  BtShared
143c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
143d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
143e0 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20  E_OK;.  u8 av = 
143f0 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a  (u8)autoVacuum;.
14400 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
14410 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28  nter(p);.  if( (
14420 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
14430 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
14440 45 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31  ED)!=0 && (av ?1
14450 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61  :0)!=pBt->autoVa
14460 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
14470 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
14480 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
14490 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
144a0 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42   av ?1:0;.    pB
144b0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
144c0 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a  av==2 ?1:0;.  }.
144d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
144e0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
144f0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
14500 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
14510 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75  value of the 'au
14520 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
14530 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63  rty. If auto-vac
14540 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c  uum is .** enabl
14550 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  ed 1 is returned
14560 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
14570 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
14580 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
14590 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65  Btree *p){.#ifde
145a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
145b0 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
145c0 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  n BTREE_AUTOVACU
145d0 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20  UM_NONE;.#else. 
145e0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
145f0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
14600 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21  .  rc = (.    (!
14610 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  p->pBt->autoVacu
14620 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
14630 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28  CUUM_NONE:.    (
14640 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63  !p->pBt->incrVac
14650 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
14660 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20  ACUUM_FULL:.    
14670 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
14680 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c  _INCR.  );.  sql
14690 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
146a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
146b0 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
146c0 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
146d0 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
146e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
146f0 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
14700 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
14710 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
14720 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
14730 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
14740 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
14750 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
14760 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
14770 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
14780 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
14790 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
147a0 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
147b0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
147c0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
147d0 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
147e0 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
147f0 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
14800 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
14810 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
14820 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
14830 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
14840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14850 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
14860 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
14870 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
14880 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  ge1;     /* Page
14890 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
148a0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
148b0 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
148c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
148d0 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
148e0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  base */.  int nP
148f0 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f  ageFile = 0;   /
14900 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
14910 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
14920 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
14930 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20  nPageHeader;    
14940 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
14950 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
14960 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ase according to
14970 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72   hdr */..  asser
14980 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
14990 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
149a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
149b0 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b  Bt->pPage1==0 );
149c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
149d0 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
149e0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
149f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14a00 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
14a10 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
14a20 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
14a30 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
14a40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
14a50 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
14a60 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
14a70 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
14a80 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
14a90 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
14aa0 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
14ab0 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e   file. .  */.  n
14ac0 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64  Page = nPageHead
14ad0 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  er = get4byte(28
14ae0 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
14af0 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ata);.  sqlite3P
14b00 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
14b10 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
14b20 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50  eFile);.  if( nP
14b30 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  age==0 || memcmp
14b40 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (24+(u8*)pPage1-
14b50 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29  >aData, 92+(u8*)
14b60 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29  pPage1->aData,4)
14b70 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  !=0 ){.    nPage
14b80 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20   = nPageFile;.  
14b90 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20  }.  if( nPage>0 
14ba0 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53  ){.    u32 pageS
14bb0 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61  ize;.    u32 usa
14bc0 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
14bd0 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
14be0 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
14bf0 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
14c00 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
14c10 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64  age1, zMagicHead
14c20 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20  er, 16)!=0 ){.  
14c30 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
14c40 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
14c50 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
14c60 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66  _OMIT_WAL.    if
14c70 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b  ( page1[18]>1 ){
14c80 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
14c90 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
14ca0 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
14cb0 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31   if( page1[19]>1
14cc0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
14cd0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
14ce0 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
14cf0 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
14d00 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  2 ){.      pBt->
14d10 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
14d20 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d  READ_ONLY;.    }
14d30 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
14d40 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>2 ){.      go
14d50 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
14d60 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iled;.    }..   
14d70 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74 65   /* If the write
14d80 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20   version is set 
14d90 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61 62  to 2, this datab
14da0 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63  ase should be ac
14db0 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e  cessed.    ** in
14dc0 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68   WAL mode. If th
14dd0 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72  e log is not alr
14de0 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20  eady open, open 
14df0 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20  it now. Then .  
14e00 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
14e10 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e  TE_OK and return
14e20 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74   without populat
14e30 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50 61  ing BtShared.pPa
14e40 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ge1..    ** The 
14e50 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74  caller detects t
14e60 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  his and calls th
14e70 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
14e80 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a  n. This is.    *
14e90 2a 20 72 65 71 75 69 72 65 64 20 61 73 20 74 68  * required as th
14ea0 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67  e version of pag
14eb0 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  e 1 currently in
14ec0 20 74 68 65 20 70 61 67 65 31 20 62 75 66 66 65   the page1 buffe
14ed0 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  r.    ** may not
14ee0 20 62 65 20 74 68 65 20 6c 61 74 65 73 74 20 76   be the latest v
14ef0 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d  ersion - there m
14f00 61 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e  ay be a newer on
14f10 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20  e in the log.   
14f20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f   ** file..    */
14f30 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
14f40 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62  9]==2 && (pBt->b
14f50 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f  tsFlags & BTS_NO
14f60 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _WAL)==0 ){.    
14f70 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30    int isOpen = 0
14f80 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14f90 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c  ite3PagerOpenWal
14fa0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69  (pBt->pPager, &i
14fb0 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66  sOpen);.      if
14fc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14fd0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
14fe0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
14ff0 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  d;.      }else i
15000 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a  f( isOpen==0 ){.
15010 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
15020 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
15030 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15040 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
15050 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15060 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23  _NOTADB;.    }.#
15070 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68  endif..    /* Th
15080 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64  e maximum embedd
15090 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74  ed fraction must
150a0 20 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e   be exactly 25%.
150b0 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75    And the minimu
150c0 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65  m.    ** embedde
150d0 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
150e0 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74  be 12.5% for bot
150f0 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20  h leaf-data and 
15100 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20  non-leaf-data.. 
15110 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
15120 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
15130 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
15140 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
15150 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
15160 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
15170 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
15180 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
15190 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
151a0 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
151b0 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
151c0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
151d0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
151e0 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65    }.    pageSize
151f0 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38   = (page1[16]<<8
15200 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c  ) | (page1[17]<<
15210 31 36 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  16);.    if( ((p
15220 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
15230 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ize)!=0.     || 
15240 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
15250 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
15260 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c      || pageSize<
15270 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20  =256 .    ){.   
15280 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
15290 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
152a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
152b0 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
152c0 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
152d0 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
152e0 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
152f0 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d   (u32)pageSize!=
15300 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
15310 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
15320 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
15330 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
15340 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
15350 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
15360 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
15370 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
15380 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
15390 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
153a0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
153b0 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
153c0 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
153d0 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
153e0 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
153f0 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
15400 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
15410 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
15420 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
15430 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
15440 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
15450 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
15460 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
15470 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
15480 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
15490 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
154a0 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
154b0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
154c0 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
154d0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
154e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
154f0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
15500 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
15510 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
15520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15540 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
15550 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
15560 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
15570 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e    if( (pBt->db->
15580 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
15590 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20  ecoveryMode)==0 
155a0 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69  && nPage>nPageFi
155b0 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  le ){.      rc =
155c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
155d0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
155e0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
155f0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
15600 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30  ( usableSize<480
15610 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
15620 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
15630 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
15640 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
15650 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
15660 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
15670 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
15680 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
15690 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
156a0 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
156b0 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
156c0 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
156d0 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
156e0 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
156f0 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
15700 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
15710 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
15720 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
15730 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
15740 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
15750 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
15760 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
15770 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
15780 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
15790 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
157a0 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
157b0 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
157c0 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
157d0 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
157e0 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
157f0 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
15800 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
15810 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
15820 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
15830 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
15840 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
15850 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
15860 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
15870 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
15880 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
15890 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
158a0 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
158b0 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
158c0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
158d0 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61  -byte pointer, a
158e0 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
158f0 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
15900 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
15910 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
15920 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
15930 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
15940 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
15950 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
15960 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
15970 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
15980 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34  sableSize-12)*64
15990 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
159a0 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75  t->minLocal = (u
159b0 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
159c0 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
159d0 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61  - 23);.  pBt->ma
159e0 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42  xLeaf = (u16)(pB
159f0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
15a00 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  35);.  pBt->minL
15a10 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74  eaf = (u16)((pBt
15a20 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
15a30 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
15a40 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63   if( pBt->maxLoc
15a50 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42  al>127 ){.    pB
15a60 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
15a70 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73  ad = 127;.  }els
15a80 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31  e{.    pBt->max1
15a90 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75  bytePayload = (u
15aa0 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  8)pBt->maxLocal;
15ab0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
15ac0 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33  Bt->maxLeaf + 23
15ad0 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45   <= MX_CELL_SIZE
15ae0 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e  (pBt) );.  pBt->
15af0 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b  pPage1 = pPage1;
15b00 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
15b10 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
15b20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
15b30 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
15b40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
15b50 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
15b60 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
15b70 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
15b80 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
15b90 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
15ba0 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  of cursors open 
15bb0 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20  on pBt. This is 
15bc0 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73  for use.** in as
15bd0 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f  sert() expressio
15be0 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c  ns, so it is onl
15bf0 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44  y compiled if ND
15c00 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64  EBUG is not.** d
15c10 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  efined..**.** On
15c20 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
15c30 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20   are counted if 
15c40 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20  wrOnly is true. 
15c50 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a   If wrOnly is.**
15c60 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20   false then all 
15c70 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e  cursors are coun
15c80 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  ted..**.** For t
15c90 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
15ca0 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63  his routine, a c
15cb0 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72  ursor is any cur
15cc0 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  sor that.** is c
15cd0 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e  apable of readin
15ce0 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20  g or writing to 
15cf0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43  the database.  C
15d00 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68  ursors that.** h
15d10 61 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64  ave been tripped
15d20 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52   into the CURSOR
15d30 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65  _FAULT state are
15d40 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f   not counted..*/
15d50 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e  .static int coun
15d60 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74  tValidCursors(Bt
15d70 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74  Shared *pBt, int
15d80 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75   wrOnly){.  BtCu
15d90 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
15da0 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  t r = 0;.  for(p
15db0 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Cur=pBt->pCursor
15dc0 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75  ; pCur; pCur=pCu
15dd0 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
15de0 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c  f( (wrOnly==0 ||
15df0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
15e00 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   & BTCF_WriteFla
15e10 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70  g)!=0).     && p
15e20 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
15e30 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b  SOR_FAULT ) r++;
15e40 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72   .  }.  return r
15e50 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
15e60 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
15e70 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75  o outstanding cu
15e80 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65  rsors and we are
15e90 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64   not in the midd
15ea0 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73  le.** of a trans
15eb0 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65  action but there
15ec0 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20   is a read lock 
15ed0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  on the database,
15ee0 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
15ef0 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65  utine unrefs the
15f00 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
15f10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15f20 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74   which .** has t
15f30 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c  he effect of rel
15f40 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20  easing the read 
15f50 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
15f60 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
15f70 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
15f80 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
15f90 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
15fa0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
15fb0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
15fc0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
15fd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15fe0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
15ff0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
16000 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43  ert( countValidC
16010 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30  ursors(pBt,0)==0
16020 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   || pBt->inTrans
16030 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e  action>TRANS_NON
16040 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  E );.  if( pBt->
16050 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
16060 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74  RANS_NONE && pBt
16070 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20  ->pPage1!=0 ){. 
16080 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
16090 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
160a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
160b0 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
160c0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
160d0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
160e0 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20  pBt->pPager)==1 
160f0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  );.    pBt->pPag
16100 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65  e1 = 0;.    rele
16110 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
16120 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
16130 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61   pBt points to a
16140 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65  n empty file the
16150 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65  n convert that e
16160 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74  mpty file.** int
16170 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61  o a new empty da
16180 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61  tabase by initia
16190 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74  lizing the first
161a0 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
161b0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
161c0 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62  tic int newDatab
161d0 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ase(BtShared *pB
161e0 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
161f0 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  P1;.  unsigned c
16200 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74  har *data;.  int
16210 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
16220 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
16230 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
16240 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61  ;.  if( pBt->nPa
16250 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ge>0 ){.    retu
16260 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16270 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70  }.  pP1 = pBt->p
16280 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28  Page1;.  assert(
16290 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74   pP1!=0 );.  dat
162a0 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a  a = pP1->aData;.
162b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
162c0 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44  gerWrite(pP1->pD
162d0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
162e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
162f0 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61  memcpy(data, zMa
16300 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  gicHeader, sizeo
16310 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29  f(zMagicHeader))
16320 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
16330 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
16340 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31  ==16 );.  data[1
16350 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  6] = (u8)((pBt->
16360 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66  pageSize>>8)&0xf
16370 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d  f);.  data[17] =
16380 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65   (u8)((pBt->page
16390 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b  Size>>16)&0xff);
163a0 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
163b0 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
163c0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
163d0 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d  usableSize<=pBt-
163e0 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74  >pageSize && pBt
163f0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35  ->usableSize+255
16400 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  >=pBt->pageSize)
16410 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28  ;.  data[20] = (
16420 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  u8)(pBt->pageSiz
16430 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
16440 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d  ize);.  data[21]
16450 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32   = 64;.  data[22
16460 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32  ] = 32;.  data[2
16470 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65  3] = 32;.  memse
16480 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
16490 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
164a0 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
164b0 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
164c0 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
164d0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
164e0 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
164f0 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ED;.#ifndef SQLI
16500 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
16510 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  UM.  assert( pBt
16520 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20  ->autoVacuum==1 
16530 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  || pBt->autoVacu
16540 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  um==0 );.  asser
16550 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  t( pBt->incrVacu
16560 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e  um==1 || pBt->in
16570 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  crVacuum==0 );. 
16580 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
16590 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 4*4], pBt->
165a0 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70  autoVacuum);.  p
165b0 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
165c0 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e   + 7*4], pBt->in
165d0 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69  crVacuum);.#endi
165e0 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d  f.  pBt->nPage =
165f0 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d   1;.  data[31] =
16600 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
16610 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
16620 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
16630 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
16640 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
16650 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61  (creating a data
16660 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69  base.** consisti
16670 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70  ng of a single p
16680 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d  age and no schem
16690 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75  a objects). Retu
166a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
166b0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
166c0 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
166d0 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
166e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
166f0 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65  BtreeNewDb(Btree
16700 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
16710 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16720 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74  ter(p);.  p->pBt
16730 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72  ->nPage = 0;.  r
16740 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
16750 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74  p->pBt);.  sqlit
16760 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
16770 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16780 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
16790 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
167a0 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
167b0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
167c0 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
167d0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
167e0 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
167f0 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
16800 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
16810 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
16820 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
16830 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
16840 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
16850 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
16860 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
16870 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
16880 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
16890 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
168a0 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
168b0 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
168c0 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
168d0 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
168e0 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
168f0 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
16900 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
16910 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
16920 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
16930 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
16940 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
16950 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
16960 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
16970 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
16980 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
16990 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
169a0 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
169b0 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
169c0 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
169d0 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
169e0 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
169f0 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
16a00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
16a10 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
16a20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
16a30 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
16a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
16a50 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
16a60 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
16a70 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
16a80 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
16a90 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
16aa0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
16ab0 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
16ac0 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
16ad0 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
16ae0 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
16af0 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
16b00 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
16b10 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
16b20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
16b30 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
16b40 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
16b50 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
16b60 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
16b70 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
16b80 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
16b90 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
16ba0 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
16bb0 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
16bc0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
16bd0 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
16be0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
16bf0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
16c00 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
16c10 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
16c20 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
16c30 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
16c40 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
16c50 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
16c60 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
16c70 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
16c80 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
16c90 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
16ca0 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
16cb0 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
16cc0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
16cd0 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
16ce0 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
16cf0 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
16d00 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
16d10 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
16d20 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
16d30 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
16d40 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
16d50 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
16d60 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
16d70 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
16d80 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
16d90 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
16da0 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
16db0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
16dc0 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
16dd0 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
16de0 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
16df0 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
16e00 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
16e10 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
16e20 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
16e30 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
16e40 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c  t wrflag){.  sql
16e50 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
16e60 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
16e70 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
16e80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16e90 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
16ea0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
16eb0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
16ec0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
16ed0 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
16ee0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
16ef0 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
16f00 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
16f10 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
16f20 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
16f30 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
16f40 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
16f50 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
16f60 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
16f70 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
16f80 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
16f90 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
16fa0 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
16fb0 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
16fc0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
16fd0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
16fe0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
16ff0 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74   IfNotOmitAV(pBt
17000 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d  ->bDoTruncate)==
17010 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  0 );..  /* Write
17020 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
17030 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f  e not possible o
17040 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
17050 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20  tabase */.  if( 
17060 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
17070 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21   BTS_READ_ONLY)!
17080 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  =0 && wrflag ){.
17090 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
170a0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f  READONLY;.    go
170b0 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
170c0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
170d0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
170e0 43 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e  CACHE.  /* If an
170f0 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68  other database h
17100 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64  andle has alread
17110 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65  y opened a write
17120 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
17130 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65  ** on this share
17140 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
17150 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77  e and a second w
17160 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
17170 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74   is.  ** request
17180 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
17190 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20  E_LOCKED..  */. 
171a0 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20   if( (wrflag && 
171b0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
171c0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  on==TRANS_WRITE)
171d0 0a 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73  .   || (pBt->bts
171e0 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44  Flags & BTS_PEND
171f0 49 4e 47 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ING)!=0.  ){.   
17200 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70   pBlock = pBt->p
17210 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65  Writer->db;.  }e
17220 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31  lse if( wrflag>1
17230 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
17240 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70  pIter;.    for(p
17250 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
17260 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
17270 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
17280 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
17290 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20  tree!=p ){.     
172a0 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65     pBlock = pIte
172b0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  r->pBtree->db;. 
172c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
172d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
172e0 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
172f0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
17300 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
17310 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20  db, pBlock);.   
17320 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43   rc = SQLITE_LOC
17330 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
17340 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
17350 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  begun;.  }.#endi
17360 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64  f..  /* Any read
17370 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72  -only or read-wr
17380 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
17390 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c  implies a read-l
173a0 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67  ock on .  ** pag
173b0 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20  e 1. So if some 
173c0 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63  other shared-cac
173d0 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64  he client alread
173e0 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f  y has a write-lo
173f0 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65  ck .  ** on page
17400 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74   1, the transact
17410 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ion cannot be op
17420 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ened. */.  rc = 
17430 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
17440 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53  TableLock(p, MAS
17450 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c  TER_ROOT, READ_L
17460 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  OCK);.  if( SQLI
17470 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f  TE_OK!=rc ) goto
17480 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20   trans_begun;.. 
17490 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
174a0 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59  = ~BTS_INITIALLY
174b0 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42  _EMPTY;.  if( pB
174c0 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42  t->nPage==0 ) pB
174d0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
174e0 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
174f0 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f  TY;.  do {.    /
17500 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65  * Call lockBtree
17510 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20  () until either 
17520 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70  pBt->pPage1 is p
17530 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20  opulated or.    
17540 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72  ** lockBtree() r
17550 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67  eturns something
17560 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
17570 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65  TE_OK. lockBtree
17580 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65  ().    ** may re
17590 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62  turn SQLITE_OK b
175a0 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  ut leave pBt->pP
175b0 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66  age1 set to 0 if
175c0 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65   after.    ** re
175d0 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20  ading page 1 it 
175e0 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74  discovers that t
175f0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
17600 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
17610 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74    ** file is not
17620 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20   pBt->pageSize. 
17630 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63  In this case loc
17640 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70  kBtree() will up
17650 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d  date.    ** pBt-
17660 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65  >pageSize to the
17670 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
17680 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
17690 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
176a0 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
176b0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
176c0 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70  rc = lockBtree(p
176d0 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  Bt)) );..    if(
176e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
176f0 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
17700 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
17710 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
17720 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ONLY)!=0 ){.    
17730 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17740 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
17750 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
17760 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17770 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65  Begin(pBt->pPage
17780 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74  r,wrflag>1,sqlit
17790 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70  e3TempInMemory(p
177a0 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  ->db));.        
177b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
177c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
177d0 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
177e0 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
177f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17800 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
17810 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17820 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
17830 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  sed(pBt);.    }.
17840 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78    }while( (rc&0x
17850 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  FF)==SQLITE_BUSY
17860 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
17870 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
17880 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  NE &&.          
17890 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
178a0 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a  andler(pBt) );..
178b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
178c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
178d0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
178e0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
178f0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
17900 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
17910 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
17920 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70  ACHE.      if( p
17930 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
17940 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
17950 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20  >lock.pBtree==p 
17960 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  && p->lock.iTabl
17970 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  e==1 );.        
17980 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20  p->lock.eLock = 
17990 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  READ_LOCK;.     
179a0 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74     p->lock.pNext
179b0 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20   = pBt->pLock;. 
179c0 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63         pBt->pLoc
179d0 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20  k = &p->lock;.  
179e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
179f0 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e   }.    p->inTran
17a00 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e  s = (wrflag?TRAN
17a10 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45  S_WRITE:TRANS_RE
17a20 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  AD);.    if( p->
17a30 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54  inTrans>pBt->inT
17a40 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
17a50 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
17a60 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72  action = p->inTr
17a70 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ans;.    }.    i
17a80 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  f( wrflag ){.   
17a90 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
17aa0 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
17ab0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
17ac0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
17ad0 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  HE.      assert(
17ae0 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29   !pBt->pWriter )
17af0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72  ;.      pBt->pWr
17b00 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20  iter = p;.      
17b10 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
17b20 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b   ~BTS_EXCLUSIVE;
17b30 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61  .      if( wrfla
17b40 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  g>1 ) pBt->btsFl
17b50 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55  ags |= BTS_EXCLU
17b60 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  SIVE;.#endif..  
17b70 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62      /* If the db
17b80 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65  -size header fie
17b90 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20  ld is incorrect 
17ba0 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66  (as it may be if
17bb0 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a   an old.      **
17bc0 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e   client has been
17bd0 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
17be0 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64  abase file), upd
17bf0 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e  ate it now. Doin
17c00 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  g.      ** this 
17c10 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
17c20 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74  an later means t
17c30 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
17c40 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20   can safely .   
17c50 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68     ** re-read th
17c60 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
17c70 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61  from page 1 if a
17c80 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72   savepoint or tr
17c90 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20  ansaction.      
17ca0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75  ** rollback occu
17cb0 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72  rs within the tr
17cc0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
17cd0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
17ce0 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79  t->nPage!=get4by
17cf0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
17d00 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20  a[28]) ){.      
17d10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
17d20 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
17d30 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
17d40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17d50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17d60 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
17d70 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
17d80 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
17d90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
17da0 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f    }.  }...trans_
17db0 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d  begun:.  if( rc=
17dc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
17dd0 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54  flag ){.    /* T
17de0 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73  his call makes s
17df0 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
17e00 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  er has the corre
17e10 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  ct number of.   
17e20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69   ** open savepoi
17e30 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f  nts. If the seco
17e40 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
17e50 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61  greater than 0 a
17e60 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  nd.    ** the su
17e70 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  b-journal is not
17e80 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
17e90 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f  hen it will be o
17ea0 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20  pened here..    
17eb0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
17ec0 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
17ed0 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
17ee0 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  r, p->db->nSavep
17ef0 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  oint);.  }..  bt
17f00 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
17f10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17f20 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17f30 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
17f40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
17f50 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
17f60 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
17f70 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
17f80 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
17f90 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
17fa0 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
17fb0 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
17fc0 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
17fd0 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
17fe0 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
17ff0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
18000 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
18010 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
18020 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
18030 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
18040 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
18050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18070 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
18080 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
180b0 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
180c0 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
180d0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
180e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180f0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
18100 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
18110 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
18120 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69  ;.  u8 isInitOri
18130 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
18140 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  t;.  Pgno pgno =
18150 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20   pPage->pgno;.. 
18160 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18170 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
18180 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
18190 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e  ;.  rc = btreeIn
181a0 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
181b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
181c0 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  OK ){.    goto s
181d0 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
181e0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c  _out;.  }.  nCel
181f0 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
18200 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
18210 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
18220 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
18230 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
18240 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f  ..    ptrmapPutO
18250 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
18260 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  ell, &rc);..    
18270 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
18280 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
18290 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
182a0 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
182b0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
182c0 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
182d0 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
182e0 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
182f0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
18300 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
18310 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
18320 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
18330 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
18340 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72  set+8]);.    ptr
18350 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
18360 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
18370 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
18380 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f  .  }..set_child_
18390 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70  ptrmaps_out:.  p
183a0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
183b0 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74  sInitOrig;.  ret
183c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
183d0 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50   Somewhere on pP
183e0 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  age is a pointer
183f0 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
18400 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
18410 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20  nter so.** that 
18420 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f  it points to iTo
18430 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
18440 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
18450 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
18460 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65  to.** be modifie
18470 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a  d, as  follows:.
18480 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
18490 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
184a0 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
184b0 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
184c0 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
184d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184e0 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
184f0 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
18500 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
18510 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
18520 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
18530 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
18540 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
18550 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
18560 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
18570 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
18580 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
18590 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
185a0 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
185b0 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
185c0 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
185d0 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
185e0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
185f0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
18600 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
18610 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
18620 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
18630 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
18640 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
18650 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
18660 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
18670 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
18680 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
18690 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
186a0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
186b0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
186c0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
186d0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29  RMAP_OVERFLOW2 )
186e0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  {.    /* The poi
186f0 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74  nter is always t
18700 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
18710 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20   of the page in 
18720 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
18730 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
18740 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69  pPage->aData)!=i
18750 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  From ){.      re
18760 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
18770 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
18780 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
18790 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b  ge->aData, iTo);
187a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
187b0 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
187c0 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20  age->isInit;.   
187d0 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
187e0 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65  nCell;..    btre
187f0 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
18800 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
18810 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
18820 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
18830 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
18840 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
18850 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
18860 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
18870 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
18880 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
18890 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
188a0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
188b0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
188c0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
188d0 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
188e0 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 20 26  rflow.         &
188f0 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76  & pCell+info.iOv
18900 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d  erflow+3<=pPage-
18910 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61  >aData+pPage->ma
18920 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20 20  skPage.         
18930 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  && iFrom==get4by
18940 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
18950 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20  Overflow]).     
18960 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
18970 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  put4byte(&pCell[
18980 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c  info.iOverflow],
18990 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
189a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
189b0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
189c0 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
189d0 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
189e0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
189f0 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
18a00 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
18a10 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
18a20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18a30 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
18a40 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
18a50 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
18a60 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
18a70 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
18a80 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
18a90 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
18aa0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
18ab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
18ac0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
18ad0 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
18ae0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
18af0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
18b00 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
18b10 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
18b20 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
18b30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
18b40 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
18b50 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
18b60 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
18b70 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
18b80 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
18b90 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
18ba0 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
18bb0 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
18bc0 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   valid..**.** Th
18bd0 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  e isCommit flag 
18be0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
18bf0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
18c00 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
18c10 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
18c20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
18c30 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61  ()ed before data
18c40 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
18c50 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20  e->pgno .** can 
18c60 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54  be written to. T
18c70 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
18c80 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e  ready promised n
18c90 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ot to write to t
18ca0 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a  hat.** page..*/.
18cb0 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63  static int reloc
18cc0 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  atePage(.  BtSha
18cd0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
18ce0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a      /* Btree */.
18cf0 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61    MemPage *pDbPa
18d00 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  ge,        /* Op
18d10 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  en page to move 
18d20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
18d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18d40 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79   Pointer map 'ty
18d50 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  pe' entry for pD
18d60 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
18d70 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20  iPtrPage,       
18d80 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
18d90 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74  ap 'page-no' ent
18da0 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
18db0 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
18dc0 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
18dd0 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  The location to 
18de0 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20  move pDbPage to 
18df0 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
18e00 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
18e10 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70   isCommit flag p
18e20 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
18e30 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f  PagerMovepage */
18e40 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
18e50 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  PtrPage;   /* Th
18e60 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
18e70 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
18e80 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o pDbPage */.  P
18e90 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44  gno iDbPage = pD
18ea0 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50  bPage->pgno;.  P
18eb0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
18ec0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
18ed0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
18ee0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
18ef0 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70  VERFLOW2 || eTyp
18f00 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
18f10 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54  OW1 || .      eT
18f20 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
18f30 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
18f40 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
18f50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18f60 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
18f70 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
18f80 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42  ert( pDbPage->pB
18f90 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20  t==pBt );..  /* 
18fa0 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67  Move page iDbPag
18fb0 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65  e from its curre
18fc0 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
18fd0 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
18fe0 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
18ff0 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
19000 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
19010 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
19020 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
19030 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
19040 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
19050 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
19060 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
19070 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67  gerMovepage(pPag
19080 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62  er, pDbPage->pDb
19090 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
190a0 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66   isCommit);.  if
190b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
190c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
190d0 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d  ;.  }.  pDbPage-
190e0 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67  >pgno = iFreePag
190f0 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50  e;..  /* If pDbP
19100 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d  age was a btree-
19110 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61  page, then it ma
19120 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67  y have child pag
19130 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a  es and/or cells.
19140 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
19150 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
19160 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  s. The pointer m
19170 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
19180 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61  ll these.  ** pa
19190 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
191a0 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  hanged..  **.  *
191b0 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20  * If pDbPage is 
191c0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
191d0 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
191e0 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f   4 bytes may sto
191f0 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  re a.  ** pointe
19200 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e  r to a subsequen
19210 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
19220 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
19230 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  case, then.  ** 
19240 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
19250 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
19260 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73  ted for the subs
19270 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
19280 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
19290 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
192a0 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
192b0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
192c0 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68  {.    rc = setCh
192d0 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61  ildPtrmaps(pDbPa
192e0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
192f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19300 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19310 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
19320 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20    Pgno nextOvfl 
19330 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61  = get4byte(pDbPa
19340 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
19350 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20  if( nextOvfl!=0 
19360 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
19370 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c  ut(pBt, nextOvfl
19380 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
19390 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26  W2, iFreePage, &
193a0 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc);.      if( r
193b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
193c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
193d0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
193e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74  .  }..  /* Fix t
193f0 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e  he database poin
19400 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72  ter on page iPtr
19410 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65  Page that pointe
19420 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a  d at iDbPage so.
19430 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69    ** that it poi
19440 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65  nts at iFreePage
19450 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70  . Also fix the p
19460 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
19470 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61   for.  ** iPtrPa
19480 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
19490 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
194a0 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
194b0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
194c0 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
194d0 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
194e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
194f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
19500 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
19510 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19520 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
19530 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
19540 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19550 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
19560 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
19570 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
19580 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
19590 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
195a0 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
195b0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
195c0 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
195d0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
195e0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
195f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19600 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
19610 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  t, iFreePage, eT
19620 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26  ype, iPtrPage, &
19630 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rc);.    }.  }. 
19640 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19650 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
19660 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
19670 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  y incrVacuumStep
19680 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
19690 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
196a0 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20  age(BtShared *, 
196b0 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f  MemPage **, Pgno
196c0 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a   *, Pgno, u8);..
196d0 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  /*.** Perform a 
196e0 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61  single step of a
196f0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
19700 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73  cuum. If success
19710 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ful, return.** S
19720 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65  QLITE_OK. If the
19730 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f  re is no work to
19740 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f   do (and therefo
19750 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a  re no point in .
19760 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** calling this 
19770 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c  function again),
19780 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
19790 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65  ONE. Or, if an e
197a0 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
197b0 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68   return some oth
197c0 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  er error code..*
197d0 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66  *.** More specif
197e0 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e  ically, this fun
197f0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
19800 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68  o re-organize th
19810 65 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a  e database so .*
19820 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  * that the last 
19830 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65  page of the file
19840 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
19850 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69  e is no longer i
19860 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  n use..**.** Par
19870 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74  ameter nFin is t
19880 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
19890 65 73 20 74 68 61 74 20 74 68 69 73 20 64 61 74  es that this dat
198a0 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74  abase would cont
198b0 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73  ain.** were this
198c0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
198d0 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e   until it return
198e0 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a  s SQLITE_DONE..*
198f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d  *.** If the bCom
19900 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  mit parameter is
19910 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20   non-zero, this 
19920 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
19930 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61   that the .** ca
19940 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63  ller will keep c
19950 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75  alling incrVacuu
19960 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74  mStep() until it
19970 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
19980 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65  DONE .** or an e
19990 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73  rror. bCommit is
199a0 20 70 61 73 73 65 64 20 74 72 75 65 20 66 6f 72   passed true for
199b0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d   an auto-vacuum-
199c0 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70  on-commit .** op
199d0 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73  eration, or fals
199e0 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65  e for an increme
199f0 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a  ntal vacuum..*/.
19a00 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56  static int incrV
19a10 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72  acuumStep(BtShar
19a20 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46  ed *pBt, Pgno nF
19a30 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67  in, Pgno iLastPg
19a40 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
19a50 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74    Pgno nFreeList
19a60 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
19a70 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
19a80 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65  till on the free
19a90 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72  -list */.  int r
19aa0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
19ab0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
19ac0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
19ad0 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50    assert( iLastP
19ae0 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28  g>nFin );..  if(
19af0 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28   !PTRMAP_ISPAGE(
19b00 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26  pBt, iLastPg) &&
19b10 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e   iLastPg!=PENDIN
19b20 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
19b30 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65   ){.    u8 eType
19b40 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50  ;.    Pgno iPtrP
19b50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c  age;..    nFreeL
19b60 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
19b70 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
19b80 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28  ta[36]);.    if(
19b90 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b   nFreeList==0 ){
19ba0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
19bb0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
19bc0 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ..    rc = ptrma
19bd0 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50  pGet(pBt, iLastP
19be0 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  g, &eType, &iPtr
19bf0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
19c00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19c10 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
19c20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
19c30 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
19c40 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72  TPAGE ){.      r
19c50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
19c60 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
19c70 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  ..    if( eType=
19c80 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
19c90 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43   ){.      if( bC
19ca0 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
19cb0 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
19cc0 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
19cd0 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e  files free-list.
19ce0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
19cf0 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  uired.        **
19d00 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e   if bCommit is n
19d10 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74  on-zero. In that
19d20 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d   case, the free-
19d30 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  list will be.   
19d40 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65       ** truncate
19d50 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20  d to zero after 
19d60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
19d70 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65  turns, so it doe
19d80 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  sn't .        **
19d90 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74   matter if it st
19da0 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ill contains som
19db0 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65  e garbage entrie
19dc0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
19dd0 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
19de0 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  Pg;.        MemP
19df0 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
19e00 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
19e10 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
19e20 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
19e30 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42  eePg, iLastPg, B
19e40 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20  TALLOC_EXACT);. 
19e50 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
19e60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19e70 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
19e80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19e90 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
19ea0 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20  Pg==iLastPg );. 
19eb0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
19ec0 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
19ed0 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
19ee0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72  {.      Pgno iFr
19ef0 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  eePg;           
19f00 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72    /* Index of fr
19f10 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ee page to move 
19f20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20  pLastPg to */.  
19f30 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61      MemPage *pLa
19f40 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65  stPg;.      u8 e
19f50 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41  Mode = BTALLOC_A
19f60 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61  NY;   /* Mode pa
19f70 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f  rameter for allo
19f80 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20  cateBtreePage() 
19f90 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e  */.      Pgno iN
19fa0 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ear = 0;        
19fb0 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72     /* nearby par
19fc0 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63  ameter for alloc
19fd0 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a  ateBtreePage() *
19fe0 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  /..      rc = bt
19ff0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1a000 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50  iLastPg, &pLastP
1a010 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  g, 0);.      if(
1a020 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a030 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1a040 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
1a050 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69      /* If bCommi
1a060 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20  t is zero, this 
1a070 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c  loop runs exactl
1a080 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20  y once and page 
1a090 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a  pLastPg.      **
1a0a0 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68   is swapped with
1a0b0 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
1a0c0 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20  page pulled off 
1a0d0 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20  the free list.. 
1a0e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1a0f0 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
1a100 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69  nd, if bCommit i
1a110 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
1a120 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20  ero, then keep. 
1a130 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20       ** looping 
1a140 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67  until a free-pag
1a150 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e  e located within
1a160 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20   the first nFin 
1a170 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  pages.      ** o
1a180 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f  f the file is fo
1a190 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  und..      */.  
1a1a0 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d      if( bCommit=
1a1b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d  =0 ){.        eM
1a1c0 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45  ode = BTALLOC_LE
1a1d0 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72 20  ;.        iNear 
1a1e0 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a  = nFin;.      }.
1a1f0 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
1a200 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
1a210 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
1a220 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
1a230 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
1a240 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65  g, &iFreePg, iNe
1a250 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20  ar, eMode);.    
1a260 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a270 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1a280 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1a290 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20  LastPg);.       
1a2a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1a2b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a2c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
1a2d0 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ePg);.      }whi
1a2e0 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69  le( bCommit && i
1a2f0 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20  FreePg>nFin );. 
1a300 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
1a310 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a  eePg<iLastPg );.
1a320 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20        .      rc 
1a330 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
1a340 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79  Bt, pLastPg, eTy
1a350 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46  pe, iPtrPage, iF
1a360 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b  reePg, bCommit);
1a370 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1a380 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
1a390 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a3a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1a3b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1a3c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1a3d0 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
1a3e0 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  {.    do {.     
1a3f0 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20   iLastPg--;.    
1a400 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d  }while( iLastPg=
1a410 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1a420 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41  GE(pBt) || PTRMA
1a430 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
1a440 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42  astPg) );.    pB
1a450 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
1a460 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61   1;.    pBt->nPa
1a470 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20  ge = iLastPg;.  
1a480 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1a490 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1a4a0 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e  he database open
1a4b0 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20  ed by the first 
1a4c0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61  argument is an a
1a4d0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
1a4e0 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67  ase.** nOrig pag
1a4f0 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61  es in size conta
1a500 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65  ining nFree free
1a510 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74   pages. Return t
1a520 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20  he expected .** 
1a530 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1a540 62 61 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f  base in pages fo
1a550 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d  llowing an auto-
1a560 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e  vacuum operation
1a570 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
1a580 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53   finalDbSize(BtS
1a590 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
1a5a0 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72   nOrig, Pgno nFr
1a5b0 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72  ee){.  int nEntr
1a5c0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1a5d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1a5e0 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f   of entries on o
1a5f0 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a  ne ptrmap page *
1a600 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70  /.  Pgno nPtrmap
1a610 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a620 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a630 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f   PtrMap pages to
1a640 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50   be freed */.  P
1a650 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20  gno nFin;       
1a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a670 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
1a680 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42  /..  nEntry = pB
1a690 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b  t->usableSize/5;
1a6a0 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46  .  nPtrmap = (nF
1a6b0 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50  ree-nOrig+PTRMAP
1a6c0 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72  _PAGENO(pBt, nOr
1a6d0 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74  ig)+nEntry)/nEnt
1a6e0 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72  ry;.  nFin = nOr
1a6f0 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74  ig - nFree - nPt
1a700 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69  rmap;.  if( nOri
1a710 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  g>PENDING_BYTE_P
1a720 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e  AGE(pBt) && nFin
1a730 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  <PENDING_BYTE_PA
1a740 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
1a750 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69  Fin--;.  }.  whi
1a760 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
1a770 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20  E(pBt, nFin) || 
1a780 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin==PENDING_BY
1a790 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1a7a0 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a      nFin--;.  }.
1a7b0 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a  .  return nFin;.
1a7c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65  }../*.** A write
1a7d0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
1a7e0 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f  t be opened befo
1a7f0 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
1a800 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
1a810 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c  performs a singl
1a820 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74  e unit of work t
1a830 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d  owards an increm
1a840 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a  ental vacuum..**
1a850 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65  .** If the incre
1a860 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73  mental vacuum is
1a870 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20   finished after 
1a880 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  this function ha
1a890 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45  s run,.** SQLITE
1a8a0 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
1a8b0 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  d. If it is not 
1a8c0 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f  finished, but no
1a8d0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
1a8e0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1a8f0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1a900 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
1a910 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69  rror code. .*/.i
1a920 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
1a930 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20  ncrVacuum(Btree 
1a940 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
1a950 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1a960 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
1a970 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1a980 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1a990 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1a9a0 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70  TRANS_WRITE && p
1a9b0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1a9c0 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
1a9d0 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  !pBt->autoVacuum
1a9e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1a9f0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
1aa00 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  e{.    Pgno nOri
1aa10 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  g = btreePagecou
1aa20 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e  nt(pBt);.    Pgn
1aa30 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79  o nFree = get4by
1aa40 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1aa50 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
1aa60 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e   Pgno nFin = fin
1aa70 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f  alDbSize(pBt, nO
1aa80 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20  rig, nFree);..  
1aa90 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e    if( nOrig<nFin
1aaa0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1aab0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1aac0 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  PT;.    }else if
1aad0 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  ( nFree>0 ){.   
1aae0 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
1aaf0 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
1ab00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1ab10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ab20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65        invalidate
1ab30 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
1ab40 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72  (pBt);.        r
1ab50 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
1ab60 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f  ep(pBt, nFin, nO
1ab70 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  rig, 0);.      }
1ab80 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1ab90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1aba0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1abb0 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
1abc0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1abd0 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
1abe0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1abf0 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
1ac00 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  >nPage);.      }
1ac10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ac20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
1ac30 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  NE;.    }.  }.  
1ac40 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1ac50 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1ac60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1ac70 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1ac80 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69  ed prior to sqli
1ac90 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77  te3PagerCommit w
1aca0 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
1acb0 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65  n.** is committe
1acc0 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  d for an auto-va
1acd0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a  cuum database..*
1ace0 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
1acf0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  K is returned, t
1ad00 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20  hen *pnTrunc is 
1ad10 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
1ad20 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68  r of pages.** th
1ad30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1ad40 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
1ad50 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68  ted to during th
1ad60 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
1ad70 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64  . .** i.e. the d
1ad80 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
1ad90 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20   reorganized so 
1ada0 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69  that only the fi
1adb0 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20  rst *pnTrunc.** 
1adc0 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65  pages are in use
1add0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ade0 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
1adf0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1ae00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1ae10 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
1ae20 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
1ae30 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  ager;.  VVA_ONLY
1ae40 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c  ( int nRef = sql
1ae50 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
1ae60 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  t(pPager) );..  
1ae70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1ae80 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1ae90 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61  mutex) );.  inva
1aea0 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
1aeb0 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61  wCache(pBt);.  a
1aec0 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56  ssert(pBt->autoV
1aed0 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70  acuum);.  if( !p
1aee0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29  Bt->incrVacuum )
1aef0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b  {.    Pgno nFin;
1af00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1af10 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
1af20 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75  atabase after au
1af30 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20  tovacuuming */. 
1af40 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20     Pgno nFree;  
1af50 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1af60 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
1af70 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c  freelist initial
1af80 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  ly */.    Pgno i
1af90 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
1afa0 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f  The next page to
1afb0 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20   be freed */.   
1afc0 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
1afd0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1afe0 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65  size before free
1aff0 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69  ing */..    nOri
1b000 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  g = btreePagecou
1b010 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28  nt(pBt);.    if(
1b020 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1b030 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f  Bt, nOrig) || nO
1b040 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  rig==PENDING_BYT
1b050 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1b060 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f       /* It is no
1b070 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72  t possible to cr
1b080 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20  eate a database 
1b090 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69  for which the fi
1b0a0 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a  nal page.      *
1b0b0 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f  * is either a po
1b0c0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f  inter-map page o
1b0d0 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79  r the pending-by
1b0e0 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a  te page. If one.
1b0f0 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f        ** is enco
1b100 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e  untered, this in
1b110 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69  dicates corrupti
1b120 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1b130 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b140 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1b150 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20     }..    nFree 
1b160 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1b170 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1b180 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20  6]);.    nFin = 
1b190 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
1b1a0 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
1b1b0 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72      if( nFin>nOr
1b1c0 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ig ) return SQLI
1b1d0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1b1e0 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f  .    if( nFin<nO
1b1f0 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rig ){.      rc 
1b200 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
1b210 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
1b220 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65   }.    for(iFree
1b230 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46  =nOrig; iFree>nF
1b240 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  in && rc==SQLITE
1b250 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20  _OK; iFree--){. 
1b260 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
1b270 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
1b280 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20  in, iFree, 1);. 
1b290 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63     }.    if( (rc
1b2a0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c  ==SQLITE_DONE ||
1b2b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc==SQLITE_OK) 
1b2c0 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  && nFree>0 ){.  
1b2d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b2e0 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
1b2f0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1b300 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1b310 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1b320 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20  Data[32], 0);.  
1b330 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1b340 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1b350 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [36], 0);.      
1b360 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1b370 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1b380 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70  , nFin);.      p
1b390 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1b3a0 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = 1;.      pBt->
1b3b0 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20  nPage = nFin;.  
1b3c0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
1b3d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b3e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
1b3f0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
1b400 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
1b410 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69  sert( nRef>=sqli
1b420 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1b430 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
1b440 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
1b450 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  e /* ifndef SQLI
1b460 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1b470 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73  UM */.# define s
1b480 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78  etChildPtrmaps(x
1b490 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
1b4a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
1b4b0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
1b4c0 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61  first phase of a
1b4d0 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
1b4e0 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
1b4f0 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c  .** causes a rol
1b500 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f  lback journal to
1b510 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20   be created (if 
1b520 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
1b530 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e  ady exist).** an
1b540 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
1b550 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74   enough informat
1b560 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61  ion so that if a
1b570 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75   power loss occu
1b580 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  rs.** the databa
1b590 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  se can be restor
1b5a0 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
1b5b0 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79  al state by play
1b5c0 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20  ing back.** the 
1b5d0 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74  journal.  Then t
1b5e0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1b5f0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66  he journal are f
1b600 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a  lushed out to.**
1b610 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65   the disk.  Afte
1b620 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
1b630 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65   safely on oxide
1b640 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  , the changes to
1b650 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
1b660 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
1b670 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1b680 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ile and flushed 
1b690 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20  to oxide..** At 
1b6a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
1b6b0 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61  call, the rollba
1b6c0 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c  ck journal still
1b6d0 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a   exists on the.*
1b6e0 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72  * disk and we ar
1b6f0 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  e still holding 
1b700 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68  all locks, so th
1b710 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
1b720 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74  s not.** committ
1b730 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ed.  See sqlite3
1b740 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1b750 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65  Two() for the se
1b760 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
1b770 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
1b780 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
1b790 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
1b7a0 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
1b7b0 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
1b7c0 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
1b7d0 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
1b7e0 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
1b7f0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
1b800 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
1b810 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
1b820 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
1b830 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1b840 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
1b850 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
1b860 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
1b870 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
1b880 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
1b890 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
1b8a0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1b8b0 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
1b8c0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
1b8d0 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
1b8e0 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
1b8f0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1b900 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
1b910 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
1b920 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
1b930 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
1b940 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
1b950 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
1b960 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
1b970 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
1b980 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
1b990 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
1b9a0 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
1b9b0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1b9c0 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
1b9d0 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
1b9e0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
1b9f0 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
1ba00 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1ba10 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
1ba20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
1ba30 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
1ba40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
1ba50 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1ba60 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1ba70 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1ba80 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  p->pBt;.    sqli
1ba90 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1baa0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1bab0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1bac0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
1bad0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1bae0 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
1baf0 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  mCommit(pBt);.  
1bb00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1bb10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1bb20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1bb30 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
1bb40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1bb50 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1bb60 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1bb70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1bb80 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
1bb90 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
1bba0 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
1bbb0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
1bbc0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1bbd0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
1bbe0 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73  Bt->pPager, zMas
1bbf0 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ter, 0);.    sql
1bc00 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1bc10 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1bc20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1bc30 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1bc40 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42  lled from both B
1bc50 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
1bc60 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f  wo() and BtreeRo
1bc70 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74  llback().** at t
1bc80 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
1bc90 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
1bca0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
1bcb0 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
1bcc0 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  on(Btree *p){.  
1bcd0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1bce0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
1bcf0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
1bd00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1bd10 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
1bd20 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  p) );..#ifndef S
1bd30 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1bd40 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f  ACUUM.  pBt->bDo
1bd50 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65  Truncate = 0;.#e
1bd60 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e  ndif.  if( p->in
1bd70 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45  Trans>TRANS_NONE
1bd80 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61   && db->nVdbeRea
1bd90 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  d>1 ){.    /* If
1bda0 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72   there are other
1bdb0 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
1bdc0 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74  ts that belong t
1bdd0 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a  o this database.
1bde0 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64      ** handle, d
1bdf0 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65  owngrade to a re
1be00 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
1be10 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73  ion. The other s
1be20 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a  tatements.    **
1be30 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
1be40 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64  ading from the d
1be50 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20  atabase.  */.   
1be60 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
1be70 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1be80 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  ks(p);.    p->in
1be90 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45  Trans = TRANS_RE
1bea0 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AD;.  }else{.   
1beb0 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
1bec0 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f  e had any kind o
1bed0 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  f transaction op
1bee0 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68  en, decrement th
1bef0 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  e .    ** transa
1bf00 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74  ction count of t
1bf10 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e  he shared btree.
1bf20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
1bf30 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a  ion count .    *
1bf40 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74  * reaches 0, set
1bf50 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
1bf60 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e  e to TRANS_NONE.
1bf70 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65   The unlockBtree
1bf80 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a  IfUnused().    *
1bf90 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c  * call below wil
1bfa0 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  l unlock the pag
1bfb0 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  er.  */.    if( 
1bfc0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
1bfd0 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
1bfe0 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61  clearAllSharedCa
1bff0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
1c000 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  ;.      pBt->nTr
1c010 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
1c020 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e     if( 0==pBt->n
1c030 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
1c040 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72         pBt->inTr
1c050 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
1c060 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  S_NONE;.      }.
1c070 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
1c080 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  t the current tr
1c090 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20  ansaction state 
1c0a0 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e  to TRANS_NONE an
1c0b0 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20  d unlock the .  
1c0c0 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68    ** pager if th
1c0d0 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74  is call closed t
1c0e0 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20  he only read or 
1c0f0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1c100 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e  n.  */.    p->in
1c110 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
1c120 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74  NE;.    unlockBt
1c130 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1c140 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
1c150 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f  tegrity(p);.}../
1c160 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
1c170 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
1c180 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
1c190 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
1c1a0 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
1c1b0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
1c1c0 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63  e of a 2-phase c
1c1d0 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73  ommit.  The.** s
1c1e0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1c1f0 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74  tPhaseOne() rout
1c200 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
1c210 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f  st phase and sho
1c220 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65  uld.** be invoke
1c230 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
1c240 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
1c250 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72    The sqlite3Btr
1c260 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1c270 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69  ().** routine di
1c280 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f  d all the work o
1c290 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d  f writing inform
1c2a0 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73  ation out to dis
1c2b0 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74  k and flushing t
1c2c0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73  he.** contents s
1c2d0 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  o that they are 
1c2e0 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65  written onto the
1c2f0 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20   disk platter.  
1c300 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  All this.** rout
1c310 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73  ine has to do is
1c320 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63   delete or trunc
1c330 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20  ate or zero the 
1c340 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a  header in the.**
1c350 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1c360 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75  urnal (which cau
1c370 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  ses the transact
1c380 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61  ion to commit) a
1c390 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73  nd.** drop locks
1c3a0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
1c3b0 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
1c3c0 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70  curs while the p
1c3d0 61 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74  ager layer is at
1c3e0 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20  tempting to .** 
1c3f0 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64  finalize the und
1c400 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  erlying journal 
1c410 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74  file, this funct
1c420 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ion returns an e
1c430 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20  rror and.** the 
1c440 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c  upper layer will
1c450 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62   attempt a rollb
1c460 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ack. However, if
1c470 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1c480 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  ment.** is non-z
1c490 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d  ero then this b-
1c4a0 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tree transaction
1c4b0 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75   is part of a mu
1c4c0 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61  lti-file .** tra
1c4d0 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69  nsaction. In thi
1c4e0 73 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e  s case, the tran
1c4f0 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
1c500 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74  ady been committ
1c510 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74  ed .** (by delet
1c520 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ing a master jou
1c530 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
1c540 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69  he caller will i
1c550 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66  gnore this .** f
1c560 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
1c570 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69  code. So, even i
1c580 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1c590 73 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c  s in the pager l
1c5a0 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74  ayer,.** reset t
1c5b0 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74  he b-tree object
1c5c0 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  s internal state
1c5d0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
1c5e0 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74  t the write.** t
1c5f0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62  ransaction has b
1c600 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73  een closed. This
1c610 20 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20   is quite safe, 
1c620 61 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  as the pager wil
1c630 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69  l have.** transi
1c640 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72  tioned to the er
1c650 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ror state..**.**
1c660 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
1c670 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
1c680 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1c690 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
1c6a0 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
1c6b0 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
1c6c0 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
1c6d0 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
1c6e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1c6f0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74  ommitPhaseTwo(Bt
1c700 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65  ree *p, int bCle
1c710 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d  anup){..  if( p-
1c720 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1c730 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51  NONE ) return SQ
1c740 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
1c750 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1c760 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1c770 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
1c780 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20  he handle has a 
1c790 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1c7a0 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74  n open, commit t
1c7b0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73  he shared-btrees
1c7c0 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69   .  ** transacti
1c7d0 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73  on and set the s
1c7e0 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
1c7f0 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a  RANS_READ..  */.
1c800 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1c810 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1c820 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1c830 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1c840 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
1c850 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
1c860 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1c870 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65  RITE );.    asse
1c880 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  rt( pBt->nTransa
1c890 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72  ction>0 );.    r
1c8a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1c8b0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
1c8c0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
1c8d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c8e0 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d  OK && bCleanup==
1c8f0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1c900 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1c910 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1c920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
1c930 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1c940 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
1c950 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
1c960 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
1c970 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
1c980 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
1c990 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1c9a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1c9b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1c9c0 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
1c9d0 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
1c9e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1c9f0 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
1ca00 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1ca10 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1ca20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1ca30 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1ca40 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
1ca50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ca60 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1ca70 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1ca80 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20  aseTwo(p, 0);.  
1ca90 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
1caa0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1cab0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1cac0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
1cad0 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
1cae0 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
1caf0 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
1cb00 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
1cb10 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
1cb20 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
1cb30 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
1cb40 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ces..**.** Every
1cb50 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70   cursor is tripp
1cb60 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
1cb70 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e  rsors that belon
1cb80 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61  g.** to other da
1cb90 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1cba0 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
1cbb0 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  o be sharing.** 
1cbc0 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
1cbd0 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
1cbe0 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
1cbf0 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
1cc00 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a  lback occurs..**
1cc10 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69   All cursors usi
1cc20 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  ng the same cach
1cc30 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65  e must be trippe
1cc40 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20  d.** to prevent 
1cc50 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67  them from trying
1cc60 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65   to use the btre
1cc70 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72  e after.** the r
1cc80 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f  ollback.  The ro
1cc90 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
1cca0 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a  deleted tables.*
1ccb0 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20  * or moved root 
1ccc0 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20  pages, so it is 
1ccd0 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74  not sufficient t
1cce0 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74  o.** save the st
1ccf0 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ate of the curso
1cd00 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  r.  The cursor m
1cd10 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ust be.** invali
1cd20 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dated..*/.void s
1cd30 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
1cd40 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
1cd50 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
1cd60 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f  Code){.  BtCurso
1cd70 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72  r *p;.  if( pBtr
1cd80 65 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ee==0 ) return;.
1cd90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1cda0 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66  ter(pBtree);.  f
1cdb0 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
1cdc0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
1cdd0 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
1cde0 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt i;.    sqlite
1cdf0 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
1ce00 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74  r(p);.    p->eSt
1ce10 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55  ate = CURSOR_FAU
1ce20 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e  LT;.    p->skipN
1ce30 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20  ext = errCode;. 
1ce40 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
1ce50 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
1ce60 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1ce70 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  (p->apPage[i]);.
1ce80 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b        p->apPage[
1ce90 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
1cea0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
1ceb0 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d  Leave(pBtree);.}
1cec0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
1ced0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1cee0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41   in progress.  A
1cef0 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20  ll cursors will 
1cf00 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20  be.** invalided 
1cf10 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
1cf20 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  n.  Any attempt 
1cf30 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a  to use a cursor.
1cf40 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e  ** that was open
1cf50 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
1cf60 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74  g of this operat
1cf70 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a  ion will result.
1cf80 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  ** in an error..
1cf90 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
1cfa0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
1cfb0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
1cfc0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
1cfd0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
1cfe0 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
1cff0 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
1d000 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
1d010 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1d020 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72  treeRollback(Btr
1d030 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43  ee *p, int tripC
1d040 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ode){.  int rc;.
1d050 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1d060 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
1d070 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
1d080 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1d090 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70  r(p);.  if( trip
1d0a0 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
1d0b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70  ){.    rc = trip
1d0c0 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75  Code = saveAllCu
1d0d0 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
1d0e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1d0f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d100 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64   }.  if( tripCod
1d110 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1d120 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
1d130 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 29  ors(p, tripCode)
1d140 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74  ;.  }.  btreeInt
1d150 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66  egrity(p);..  if
1d160 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1d170 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
1d180 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61   int rc2;..    a
1d190 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49  ssert( TRANS_WRI
1d1a0 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73  TE==pBt->inTrans
1d1b0 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63  action );.    rc
1d1c0 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  2 = sqlite3Pager
1d1d0 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50  Rollback(pBt->pP
1d1e0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
1d1f0 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2!=SQLITE_OK ){
1d200 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
1d210 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
1d220 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
1d230 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74  have destroyed t
1d240 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  he pPage1->aData
1d250 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20   value.  So.    
1d260 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74  ** call btreeGet
1d270 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31  Page() on page 1
1d280 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20   again to make. 
1d290 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65     ** sure pPage
1d2a0 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20  1->aData is set 
1d2b0 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20  correctly. */.  
1d2c0 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61    if( btreeGetPa
1d2d0 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
1d2e0 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f  e1, 0)==SQLITE_O
1d2f0 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  K ){.      int n
1d300 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
1d310 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  28+(u8*)pPage1->
1d320 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65  aData);.      te
1d330 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30  stcase( nPage==0
1d340 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50   );.      if( nP
1d350 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  age==0 ) sqlite3
1d360 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1d370 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
1d380 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ge);.      testc
1d390 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ase( pBt->nPage!
1d3a0 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  =nPage );.      
1d3b0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61  pBt->nPage = nPa
1d3c0 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  ge;.      releas
1d3d0 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
1d3e0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1d3f0 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f   countValidCurso
1d400 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b  rs(pBt, 1)==0 );
1d410 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
1d420 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
1d430 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43  READ;.    btreeC
1d440 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
1d450 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
1d460 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
1d470 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
1d480 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1d490 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d4a0 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d  * Start a statem
1d4b0 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
1d4c0 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
1d4d0 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f  action can be ro
1d4e0 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64  lled.** back ind
1d4f0 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68  ependently of th
1d500 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
1d510 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61  on. You must sta
1d520 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
1d530 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72   .** before star
1d540 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
1d550 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
1d560 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
1d570 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
1d580 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e   .** if the main
1d590 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
1d5a0 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  mits or rolls ba
1d5b0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d  ck..**.** Statem
1d5c0 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
1d5d0 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f  ons are used aro
1d5e0 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53  und individual S
1d5f0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  QL statements.**
1d600 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69   that are contai
1d610 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47  ned within a BEG
1d620 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63  IN...COMMIT bloc
1d630 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61  k.  If a constra
1d640 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  int.** error occ
1d650 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  urs within the s
1d660 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66  tatement, the ef
1d670 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65  fect of that one
1d680 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61   statement.** ca
1d690 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
1d6a0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
1d6b0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
1d6c0 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
1d6d0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74  on..**.** A stat
1d6e0 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61  ement sub-transa
1d6f0 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
1d700 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79  nted as an anony
1d710 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20  mous savepoint. 
1d720 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73  The.** value pas
1d730 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
1d740 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  d parameter is t
1d750 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
1d760 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a  of savepoints,.*
1d770 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
1d780 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  new anonymous sa
1d790 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e  vepoint, open on
1d7a0 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65   the B-Tree. i.e
1d7b0 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  . if there.** ar
1d7c0 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65  e no active save
1d7d0 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74  points and no ot
1d7e0 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  her statement-tr
1d7f0 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c  ansactions open,
1d800 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69  .** iStatement i
1d810 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d  s 1. This anonym
1d820 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61  ous savepoint ca
1d830 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72  n be released or
1d840 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20   rolled back.** 
1d850 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
1d860 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
1d870 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ) function..*/.i
1d880 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1d890 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  eginStmt(Btree *
1d8a0 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e  p, int iStatemen
1d8b0 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
1d8c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1d8d0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
1d8e0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1d8f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
1d900 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1d910 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  E );.  assert( (
1d920 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1d930 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d  BTS_READ_ONLY)==
1d940 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1d950 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20  Statement>0 );. 
1d960 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
1d970 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  ent>p->db->nSave
1d980 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72  point );.  asser
1d990 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
1d9a0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
1d9b0 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68  TE );.  /* At th
1d9c0 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61  e pager level, a
1d9d0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
1d9e0 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65  action is a save
1d9f0 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20  point with.  ** 
1da00 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72  an index greater
1da10 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f   than all savepo
1da20 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70  ints created exp
1da30 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20  licitly using.  
1da40 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
1da50 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  s. It is illegal
1da60 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73   to open, releas
1da70 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  e or rollback an
1da80 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65  y.  ** such save
1da90 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65  points while the
1daa0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
1dab0 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
1dac0 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f   is active..  */
1dad0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1dae0 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
1daf0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
1db00 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71  Statement);.  sq
1db10 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1db20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1db30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
1db40 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
1db50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
1db60 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41  op, is always SA
1db70 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1db80 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54  .** or SAVEPOINT
1db90 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66  _RELEASE. This f
1dba0 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72  unction either r
1dbb0 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73  eleases or rolls
1dbc0 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76   back the.** sav
1dbd0 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65  epoint identifie
1dbe0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69  d by parameter i
1dbf0 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e  Savepoint, depen
1dc00 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75  ding on the valu
1dc10 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a  e .** of op..**.
1dc20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61  ** Normally, iSa
1dc30 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
1dc40 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
1dc50 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65   to zero. Howeve
1dc60 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53  r, if op is.** S
1dc70 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1dc80 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69  K, then iSavepoi
1dc90 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d  nt may also be -
1dca0 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  1. In this case 
1dcb0 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73  the .** contents
1dcc0 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
1dcd0 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72  ransaction are r
1dce0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73  olled back. This
1dcf0 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a   is different.**
1dd00 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74   from a normal t
1dd10 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
1dd20 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73  ack, as no locks
1dd30 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e   are released an
1dd40 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  d the.** transac
1dd50 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65  tion remains ope
1dd60 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
1dd70 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
1dd80 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70  Btree *p, int op
1dd90 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
1dda0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1ddb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
1ddc0 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
1ddd0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
1dde0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1ddf0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
1de00 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
1de10 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
1de20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
1de30 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73  LLBACK );.    as
1de40 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74  sert( iSavepoint
1de50 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69  >=0 || (iSavepoi
1de60 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41  nt==-1 && op==SA
1de70 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1de80 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
1de90 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1dea0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1deb0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42  agerSavepoint(pB
1dec0 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69  t->pPager, op, i
1ded0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
1dee0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1def0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
1df00 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28  Savepoint<0 && (
1df10 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1df20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
1df30 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  PTY)!=0 ){.     
1df40 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1df50 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1df60 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
1df70 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42  e(pBt);.      pB
1df80 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62  t->nPage = get4b
1df90 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50  yte(28 + pBt->pP
1dfa0 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20  age1->aData);.. 
1dfb0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
1dfc0 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72  base size was wr
1dfd0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f  itten into the o
1dfe0 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20  ffset 28 of the 
1dff0 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20  header.      ** 
1e000 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
1e010 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f  tion started, so
1e020 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
1e030 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65  e value at offse
1e040 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73  t.      ** 28 is
1e050 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20   nonzero. */.   
1e060 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1e070 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d  nPage>0 );.    }
1e080 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1e090 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
1e0a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e0b0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
1e0c0 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  w cursor for the
1e0d0 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f   BTree whose roo
1e0e0 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65  t is on the page
1e0f0 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61  .** iTable. If a
1e100 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
1e110 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
1e120 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
1e130 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  at.** the caller
1e140 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20   already has at 
1e150 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c  least a read-onl
1e160 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  y transaction op
1e170 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  en.** on the dat
1e180 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49  abase already. I
1e190 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72  f a write-cursor
1e1a0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
1e1b0 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hen.** the calle
1e1c0 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  r is assumed to 
1e1d0 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
1e1e0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
1e1f0 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  **.** If wrFlag=
1e200 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =0, then the cur
1e210 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  sor can only be 
1e220 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
1e230 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  ..** If wrFlag==
1e240 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  1, then the curs
1e250 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  or can be used f
1e260 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f  or reading or fo
1e270 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20  r.** writing if 
1e280 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73  other conditions
1e290 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65   for writing are
1e2a0 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73   also met.  Thes
1e2b0 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e  e.** are the con
1e2c0 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  ditions that mus
1e2d0 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65  t be met in orde
1e2e0 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  r for writing to
1e2f0 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a  .** be allowed:.
1e300 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75  **.** 1:  The cu
1e310 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62  rsor must have b
1e320 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20  een opened with 
1e330 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20  wrFlag==1.**.** 
1e340 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61  2:  Other databa
1e350 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
1e360 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61  hat share the sa
1e370 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a  me pager cache.*
1e380 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20  *     but which 
1e390 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52  are not in the R
1e3a0 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20  EAD_UNCOMMITTED 
1e3b0 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61  state may not ha
1e3c0 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72  ve.**     cursor
1e3d0 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c  s open with wrFl
1e3e0 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d  ag==0 on the sam
1e3f0 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77  e table.  Otherw
1e400 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63  ise.**     the c
1e410 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
1e420 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72  his write cursor
1e430 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c   would be visibl
1e440 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20  e to.**     the 
1e450 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20  read cursors in 
1e460 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61  the other databa
1e470 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
1e480 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74  *.** 3:  The dat
1e490 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72  abase must be wr
1e4a0 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72  itable (not on r
1e4b0 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a  ead-only media).
1e4c0 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20  **.** 4:  There 
1e4d0 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76  must be an activ
1e4e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1e4f0 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67  *.** No checking
1e500 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65   is done to make
1e510 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20   sure that page 
1e520 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73  iTable really is
1e530 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
1e540 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20  e of a b-tree.  
1e550 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
1e560 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  en the cursor ac
1e570 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e  quired.** will n
1e580 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
1e590 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61  y..**.** It is a
1e5a0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
1e5b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1e5c0 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65  orZero() has bee
1e5d0 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70  n called.** on p
1e5e0 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  Cur to initializ
1e5f0 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61  e the memory spa
1e600 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  ce prior to invo
1e610 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
1e620 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1e630 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
1e640 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
1e650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e660 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
1e670 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
1e680 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6a0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
1e6b0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
1e6c0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
1e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
1e6f0 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
1e700 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
1e710 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1e720 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
1e730 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
1e740 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
1e750 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
1e760 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
1e770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e780 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
1e790 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
1e7a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1e7b0 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
1e7c0 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
1e7d0 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  d b-tree handle 
1e7e0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
1e7f0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
1e800 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
1e810 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
1e820 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a  | wrFlag==1 );..
1e830 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1e840 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  ng assert statem
1e850 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74  ents verify that
1e860 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68   if this is a sh
1e870 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74  arable .  ** b-t
1e880 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ree database, th
1e890 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
1e8a0 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75  holding the requ
1e8b0 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73  ired table locks
1e8c0 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74  , .  ** and that
1e8d0 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
1e8e0 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65  tion has any ope
1e8f0 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f  n cursor that co
1e900 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20  nflicts with .  
1e910 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a  ** this lock.  *
1e920 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53  /.  assert( hasS
1e930 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1e940 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70  ock(p, iTable, p
1e950 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c  KeyInfo!=0, wrFl
1e960 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72  ag+1) );.  asser
1e970 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
1e980 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
1e990 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a  s(p, iTable) );.
1e9a0 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
1e9b0 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
1e9c0 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75   opened the requ
1e9d0 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  ired transaction
1e9e0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
1e9f0 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
1ea00 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  NONE );.  assert
1ea10 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70  ( wrFlag==0 || p
1ea20 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1ea30 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
1ea40 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  rt( pBt->pPage1 
1ea50 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  && pBt->pPage1->
1ea60 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20  aData );..  if( 
1ea70 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20  NEVER(wrFlag && 
1ea80 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1ea90 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21   BTS_READ_ONLY)!
1eaa0 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
1eab0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
1eac0 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 72 46  Y;.  }.  if( wrF
1ead0 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63  lag ){.    alloc
1eae0 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  ateTempSpace(pBt
1eaf0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
1eb00 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72  pTmpSpace==0 ) r
1eb10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1eb20 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54  EM;.  }.  if( iT
1eb30 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65  able==1 && btree
1eb40 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d  Pagecount(pBt)==
1eb50 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
1eb60 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20   wrFlag==0 );.  
1eb70 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20    iTable = 0;.  
1eb80 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
1eb90 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
1eba0 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
1ebb0 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
1ebc0 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
1ebd0 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69  variables and li
1ebe0 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  nk the cursor in
1ebf0 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20  to the BtShared 
1ec00 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72  list.  */.  pCur
1ec10 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
1ec20 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75  no)iTable;.  pCu
1ec30 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
1ec40 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
1ec50 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43  = pKeyInfo;.  pC
1ec60 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
1ec70 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42    pCur->pBt = pB
1ec80 74 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  t;.  assert( wrF
1ec90 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67  lag==0 || wrFlag
1eca0 3d 3d 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  ==BTCF_WriteFlag
1ecb0 20 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   );.  pCur->curF
1ecc0 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 3b 0a 20  lags = wrFlag;. 
1ecd0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
1ece0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  Bt->pCursor;.  i
1ecf0 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
1ed00 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78  {.    pCur->pNex
1ed10 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b  t->pPrev = pCur;
1ed20 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72  .  }.  pBt->pCur
1ed30 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
1ed40 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1ed50 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72  SOR_INVALID;.  r
1ed60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ed70 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
1ed80 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
1ed90 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
1eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1edc0 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
1edd0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edf0 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
1ee00 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
1ee10 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
1ee20 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
1ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee40 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
1ee50 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
1ee60 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
1ee70 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee90 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
1eea0 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a  o xCompare() */.
1eeb0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eee0 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f   Write new curso
1eef0 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
1ef00 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
1ef10 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1ef20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f   rc = btreeCurso
1ef30 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46  r(p, iTable, wrF
1ef40 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70  lag, pKeyInfo, p
1ef50 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  Cur);.  sqlite3B
1ef60 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1ef70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ef80 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
1ef90 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f  ize of a BtCurso
1efa0 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65  r object in byte
1efb0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  s..**.** This in
1efc0 74 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64  terfaces is need
1efd0 65 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73  ed so that users
1efe0 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20   of cursors can 
1eff0 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73  preallocate.** s
1f000 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67  ufficient storag
1f010 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73  e to hold a curs
1f020 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f  or.  The BtCurso
1f030 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71  r object is opaq
1f040 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73  ue.** to users s
1f050 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f  o they cannot do
1f060 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68   the sizeof() th
1f070 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20  emselves - they 
1f080 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69  must call.** thi
1f090 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e  s routine..*/.in
1f0a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
1f0b0 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a  rsorSize(void){.
1f0c0 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28    return ROUND8(
1f0d0 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29  sizeof(BtCursor)
1f0e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
1f0f0 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68  ialize memory th
1f100 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  at will be conve
1f110 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75  rted into a BtCu
1f120 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  rsor object..**.
1f130 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70  ** The simple ap
1f140 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c  proach here woul
1f150 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29  d be to memset()
1f160 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65   the entire obje
1f170 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20  ct.** to zero.  
1f180 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74  But it turns out
1f190 20 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65   that the apPage
1f1a0 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61  [] and aiIdx[] a
1f1b0 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  rrays.** do not 
1f1c0 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65  need to be zeroe
1f1d0 64 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c  d and they are l
1f1e0 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20  arge, so we can 
1f1f0 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66  save a lot.** of
1f200 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69   run-time by ski
1f210 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
1f220 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73  lization of thos
1f230 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76  e elements..*/.v
1f240 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
1f250 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72  CursorZero(BtCur
1f260 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65  sor *p){.  memse
1f270 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66  t(p, 0, offsetof
1f280 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65  (BtCursor, iPage
1f290 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ));.}../*.** Clo
1f2a0 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
1f2b0 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
1f2c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f2d0 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
1f2e0 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
1f2f0 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
1f300 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1f310 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
1f320 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1f330 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
1f340 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
1f350 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
1f360 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
1f370 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1f380 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  Cur->pBt;.    sq
1f390 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1f3a0 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c  pBtree);.    sql
1f3b0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
1f3c0 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20  rsor(pCur);.    
1f3d0 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20  if( pCur->pPrev 
1f3e0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ){.      pCur->p
1f3f0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43  Prev->pNext = pC
1f400 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ur->pNext;.    }
1f410 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d  else{.      pBt-
1f420 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d  >pCursor = pCur-
1f430 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
1f440 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78    if( pCur->pNex
1f450 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
1f460 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
1f470 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20  pCur->pPrev;.   
1f480 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
1f490 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
1f4a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
1f4b0 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
1f4c0 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Page[i]);.    }.
1f4d0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
1f4e0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
1f4f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1f500 70 42 74 72 65 65 2d 3e 64 62 2c 20 70 43 75 72  pBtree->db, pCur
1f510 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
1f520 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65    /* sqlite3_fre
1f530 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20  e(pCur); */.    
1f540 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1f550 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
1f560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f570 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
1f580 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
1f590 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  or* given in the
1f5a0 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20   argument has a 
1f5b0 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f  valid.** BtCurso
1f5c0 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  r.info structure
1f5d0 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  .  If it is not 
1f5e0 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63  already valid, c
1f5f0 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  all.** btreePars
1f600 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
1f610 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
1f620 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
1f630 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
1f640 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
1f650 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
1f660 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
1f670 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
1f680 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
1f690 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1f6a0 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36  )..**.** 2007-06
1f6b0 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73 20 61  -25:  There is a
1f6c0 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72   bug in some ver
1f6d0 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68  sions of MSVC th
1f6e0 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20  at cause the.** 
1f6f0 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73  compiler to cras
1f700 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e  h when getCellIn
1f710 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e  fo() is implemen
1f720 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a  ted as a macro..
1f730 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69 73 20  ** But there is 
1f740 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70  a measureable sp
1f750 65 65 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f  eed advantage to
1f760 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f   using the macro
1f770 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e   on gcc.** (when
1f780 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f   less compiler o
1f790 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b  ptimizations lik
1f7a0 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65  e -Os or -O0 are
1f7b0 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a   used and the.**
1f7c0 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74   compiler is not
1f7d0 20 64 6f 69 6e 67 20 61 67 67 72 65 73 73 69 76   doing aggressiv
1f7e0 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f  e inlining.)  So
1f7f0 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66   we use a real f
1f800 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d  unction.** for M
1f810 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20  SVC and a macro 
1f820 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65  for everything e
1f830 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34  lse.  Ticket #24
1f840 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  57..*/.#ifndef N
1f850 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
1f860 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  oid assertCellIn
1f870 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
1f880 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  r){.    CellInfo
1f890 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69   info;.    int i
1f8a0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
1f8b0 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ge;.    memset(&
1f8c0 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
1f8d0 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65  info));.    btre
1f8e0 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
1f8f0 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20  >apPage[iPage], 
1f900 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
1f910 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  e], &info);.    
1f920 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
1f930 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e  DB || memcmp(&in
1f940 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c  fo, &pCur->info,
1f950 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d   sizeof(info))==
1f960 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  0 );.  }.#else. 
1f970 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43   #define assertC
1f980 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69  ellInfo(x).#endi
1f990 66 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45  f.#ifdef _MSC_VE
1f9a0 52 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61  R.  /* Use a rea
1f9b0 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53  l function in MS
1f9c0 56 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  VC to work aroun
1f9d0 64 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63  d bugs in that c
1f9e0 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74  ompiler. */.  st
1f9f0 61 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c  atic void getCel
1fa00 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
1fa10 70 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70  pCur){.    if( p
1fa20 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
1fa30 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
1fa40 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
1fa50 61 67 65 3b 0a 20 20 20 20 20 20 62 74 72 65 65  age;.      btree
1fa60 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
1fa70 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43  apPage[iPage],pC
1fa80 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
1fa90 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20  ,&pCur->info);. 
1faa0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
1fab0 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
1fac0 64 4e 4b 65 79 3b 0a 20 20 20 20 7d 65 6c 73 65  dNKey;.    }else
1fad0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65  {.      assertCe
1fae0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1faf0 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a    }.  }.#else /*
1fb00 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52   if not _MSC_VER
1fb10 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d   */.  /* Use a m
1fb20 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65  acro in all othe
1fb30 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74  r compilers so t
1fb40 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
1fb50 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23   is inlined */.#
1fb60 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e  define getCellIn
1fb70 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20  fo(pCur)        
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1fbb0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
1fbc0 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20  .nSize==0 ){    
1fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1fc00 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
1fc10 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20   pCur->iPage;   
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc50 5c 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  \.    btreeParse
1fc60 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
1fc70 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61  e[iPage],pCur->a
1fc80 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75  iIdx[iPage],&pCu
1fc90 72 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20 20 20  r->info);       
1fca0 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72   \.    pCur->cur
1fcb0 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61  Flags |= BTCF_Va
1fcc0 6c 69 64 4e 4b 65 79 3b 20 20 20 20 20 20 20 20  lidNKey;        
1fcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcf0 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20    \.  }else{    
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 20                  
1fd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd40 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43     \.    assertC
1fd50 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20  ellInfo(pCur);  
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd90 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66      \.  }.#endif
1fda0 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a   /* _MSC_VER */.
1fdb0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
1fdc0 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75   /* The next rou
1fdd0 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77  tine used only w
1fde0 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
1fdf0 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a  tatements */./*.
1fe00 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1fe10 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75  f the given BtCu
1fe20 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
1fe30 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69  A valid cursor i
1fe40 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73  s one.** that is
1fe50 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1fe60 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20  ing to a row in 
1fe70 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61  a (non-empty) ta
1fe80 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ble..** This is 
1fe90 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72  a verification r
1fea0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
1feb0 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
1fec0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
1fed0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1fee0 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
1fef0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1ff00 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20  {.  return pCur 
1ff10 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
1ff20 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
1ff30 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55  .#endif /* NDEBU
1ff40 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  G */../*.** Set 
1ff50 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  *pSize to the si
1ff60 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
1ff70 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
1ff80 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
1ff90 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20  the key for the 
1ffa0 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20  current entry.  
1ffb0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
1ffc0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   not pointing.**
1ffd0 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
1ffe0 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  y, *pSize is set
1fff0 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   to 0. .**.** Fo
20000 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  r a table with t
20010 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73  he INTKEY flag s
20020 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  et, this routine
20030 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79   returns the key
20040 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20  .** itself, not 
20050 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
20060 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a  tes in the key..
20070 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
20080 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74   must position t
20090 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20  he cursor prior 
200a0 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
200b0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a   routine..** .**
200c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
200d0 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61  nnot fail.  It a
200e0 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
200f0 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e  LITE_OK.  .*/.in
20100 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
20110 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  ySize(BtCursor *
20120 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65  pCur, i64 *pSize
20130 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
20140 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
20150 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
20160 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
20170 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
20180 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
20190 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
201a0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
201b0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
201c0 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  ){.    *pSize = 
201d0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
201e0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
201f0 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  );.    *pSize = 
20200 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
20210 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
20220 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
20230 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
20240 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
20250 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74  tes of data in t
20260 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20  he entry the.** 
20270 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79  cursor currently
20280 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a   points to..**.*
20290 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
202a0 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  t guarantee that
202b0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
202c0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e  ointing to a non
202d0 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65  -NULL.** valid e
202e0 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20  ntry.  In other 
202f0 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69  words, the calli
20300 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73  ng procedure mus
20310 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74  t guarantee.** t
20320 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
20330 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65  as Cursor.eState
20340 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  ==CURSOR_VALID..
20350 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73  **.** Failure is
20360 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20   not possible.  
20370 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
20380 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c  ways returns SQL
20390 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69  ITE_OK..** It mi
203a0 67 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c  ght just as well
203b0 20 62 65 20 61 20 70 72 6f 63 65 64 75 72 65 20   be a procedure 
203c0 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29  (returning void)
203d0 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65   but we continue
203e0 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  .** to return an
203f0 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20   integer result 
20400 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69  code for histori
20410 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a  cal reasons..*/.
20420 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
20430 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f  DataSize(BtCurso
20440 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53  r *pCur, u32 *pS
20450 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ize){.  assert( 
20460 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
20470 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
20480 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
20490 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
204a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
204b0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
204c0 50 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65 61  Page]->intKeyLea
204d0 66 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43 65 6c  f==1 );.  getCel
204e0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a  lInfo(pCur);.  *
204f0 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
20500 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 72  fo.nPayload;.  r
20510 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20520 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
20530 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
20540 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
20550 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
20560 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a  ase (parameter.*
20570 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75  * ovfl), this fu
20580 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
20590 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
205a0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
205b0 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
205c0 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  list of overflow
205d0 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69   pages. If possi
205e0 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65  ble, it uses the
205f0 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
20600 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61  pointer-map data
20610 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64   instead of read
20620 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
20630 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20  of page ovfl to 
20640 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  do so. .**.** If
20650 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
20660 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
20670 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
20680 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a  d. Otherwise:.**
20690 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d  .** The page num
206a0 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
206b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
206c0 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
206d0 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
206e0 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49  to *pPgnoNext. I
206f0 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74  f page ovfl is t
20700 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
20710 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c  its linked .** l
20720 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
20730 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
20740 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
20750 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e   is not NULL, an
20760 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  d a reference to
20770 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
20780 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
20790 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d  g.** to page num
207a0 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62  ber pOvfl was ob
207b0 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70  tained, then *pp
207c0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70  Page is set to p
207d0 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  oint to that.** 
207e0 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73  reference. It is
207f0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
20800 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
20810 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  r to call releas
20820 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70  ePage().** on *p
20830 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68  pPage to free th
20840 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20  e reference. In 
20850 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
20860 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75   obtained (becau
20870 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  se.** the pointe
20880 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74  r-map was used t
20890 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c  o obtain the val
208a0 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78  ue for *pPgnoNex
208b0 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50  t), then.** *ppP
208c0 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  age is set to ze
208d0 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
208e0 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
208f0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
20900 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
20910 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
20920 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
20930 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
20940 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
20950 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
20960 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65  e number */.  Me
20970 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
20980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
20990 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
209a0 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  e (may be NULL) 
209b0 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
209c0 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
209d0 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
209e0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
209f0 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
20a00 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d   next = 0;.  Mem
20a10 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
20a20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20a30 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
20a40 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
20a50 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
20a60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67   );.  assert(pPg
20a70 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65  noNext);..#ifnde
20a80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
20a90 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
20aa0 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
20ab0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
20ac0 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
20ad0 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
20ae0 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
20af0 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
20b00 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
20b10 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
20b20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
20b30 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
20b40 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
20b50 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
20b60 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
20b70 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
20b80 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
20b90 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
20ba0 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
20bb0 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
20bc0 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
20bd0 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
20be0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
20bf0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
20c00 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
20c10 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
20c20 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
20c30 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
20c40 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
20c50 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
20c60 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
20c70 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
20c80 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
20c90 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f  ess<=btreePageco
20ca0 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
20cb0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
20cc0 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
20cd0 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
20ce0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20cf0 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d  TE_OK && eType==
20d00 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
20d10 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
20d20 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
20d30 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20   iGuess;.       
20d40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
20d50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
20d60 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
20d70 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c  ssert( next==0 |
20d80 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  | rc==SQLITE_DON
20d90 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  E );.  if( rc==S
20da0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20db0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
20dc0 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
20dd0 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29  age, (ppPage==0)
20de0 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
20df0 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20  DONLY : 0);.    
20e00 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
20e10 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d  TE_OK || pPage==
20e20 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
20e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20e40 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62      next = get4b
20e50 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
20e60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
20e70 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78  *pPgnoNext = nex
20e80 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20  t;.  if( ppPage 
20e90 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  ){.    *ppPage =
20ea0 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b   pPage;.  }else{
20eb0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
20ec0 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
20ed0 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
20ee0 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f  E_DONE ? SQLITE_
20ef0 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  OK : rc);.}../*.
20f00 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  ** Copy data fro
20f10 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20  m a buffer to a 
20f20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20  page, or from a 
20f30 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72  page to a buffer
20f40 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64  ..**.** pPayload
20f50 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
20f60 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20   data stored on 
20f70 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
20f80 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67  bPage..** If arg
20f90 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c  ument eOp is fal
20fa0 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62  se, then nByte b
20fb0 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65  ytes of data are
20fc0 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20   copied.** from 
20fd0 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20  pPayload to the 
20fe0 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61  buffer pointed a
20ff0 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f  t by pBuf. If eO
21000 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68  p is true,.** th
21010 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  en sqlite3PagerW
21020 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
21030 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20   on pDbPage and 
21040 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f  nByte bytes.** o
21050 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
21060 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  d from the buffe
21070 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f  r pBuf to pPaylo
21080 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ad..**.** SQLITE
21090 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
210a0 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65  on success, othe
210b0 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63  rwise an error c
210c0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
210d0 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a  nt copyPayload(.
210e0 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64    void *pPayload
210f0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
21100 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64  ointer to page d
21110 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
21120 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
21130 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
21140 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
21150 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
21160 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21170 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70   of bytes to cop
21180 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20  y */.  int eOp, 
21190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211a0 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72   /* 0 -> copy fr
211b0 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f  om page, 1 -> co
211c0 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20  py to page */.  
211d0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20  DbPage *pDbPage 
211e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
211f0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61  e containing pPa
21200 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  yload */.){.  if
21210 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  ( eOp ){.    /* 
21220 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62  Copy data from b
21230 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61  uffer to page (a
21240 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
21250 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20  ) */.    int rc 
21260 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
21270 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
21280 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21290 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
212a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
212b0 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
212c0 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b  d, pBuf, nByte);
212d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
212e0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
212f0 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28  page to buffer (
21300 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
21310 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) */.    memcpy(
21320 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20  pBuf, pPayload, 
21330 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65  nByte);.  }.  re
21340 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21350 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
21360 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
21370 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72  o read or overwr
21380 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f  ite payload info
21390 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74  rmation.** for t
213a0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
213b0 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  e pCur cursor is
213c0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68   pointing to. Th
213d0 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e  e eOp.** argumen
213e0 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  t is interpreted
213f0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
21400 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72  **   0: The oper
21410 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e  ation is a read.
21420 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
21430 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
21440 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74     1: The operat
21450 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20  ion is a write. 
21460 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
21470 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20  rflow cache..** 
21480 20 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74 69    2: The operati
21490 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44 6f  on is a read. Do
214a0 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74 68   not populate th
214b0 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
214c0 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ..**.** A total 
214d0 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61  of "amt" bytes a
214e0 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  re read or writt
214f0 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  en beginning at 
21500 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74  "offset"..** Dat
21510 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20  a is read to or 
21520 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
21530 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pBuf..**.** The 
21540 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65  content being re
21550 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69  ad or written mi
21560 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68  ght appear on th
21570 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f  e main page.** o
21580 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f  r be scattered o
21590 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f  ut on multiple o
215a0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a  verflow pages..*
215b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
215c0 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79  ent cursor entry
215d0 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
215e0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
215f0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20   and the.** eOp 
21600 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
21610 32 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  2, this function
21620 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70   may allocate sp
21630 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69  ace for and lazi
21640 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 73  ly .** populates
21650 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
21660 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72  ge-list cache ar
21670 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f  ray (BtCursor.aO
21680 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75  verflow). .** Su
21690 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75  bsequent calls u
216a0 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f  se this cache to
216b0 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
216c0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
216d0 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66  fset .** more ef
216e0 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ficient..**.** O
216f0 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
21700 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
21710 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
21720 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a  ed, it may be.**
21730 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20   invalidated if 
21740 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f  some other curso
21750 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  r writes to the 
21760 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69  same table, or i
21770 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  f.** the cursor 
21780 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69  is moved to a di
21790 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64  fferent row. Add
217a0 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75  itionally, in au
217b0 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64  to-vacuum.** mod
217c0 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
217d0 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61   events may inva
217e0 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c  lidate an overfl
217f0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
21800 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e  he..**.**   * An
21810 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
21820 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f  uum,.**   * A co
21830 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63  mmit in auto_vac
21840 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c  uum="full" mode,
21850 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67  .**   * Creating
21860 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65   a table (may re
21870 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
21880 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a  overflow page)..
21890 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63  */.static int ac
218a0 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42  cessPayload(.  B
218b0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
218c0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
218d0 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
218e0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
218f0 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20    u32 offset,   
21900 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
21910 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72  reading this far
21920 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f   into payload */
21930 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20  .  u32 amt,     
21940 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
21950 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
21960 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
21970 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69  ar *pBuf, /* Wri
21980 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74  te the bytes int
21990 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
219a0 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20   .  int eOp     
219b0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f           /* zero
219c0 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65   to read. non-ze
219d0 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a  ro to write. */.
219e0 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
219f0 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
21a00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21a10 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d  OK;.  int iIdx =
21a20 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
21a30 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
21a40 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21a50 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20  ; /* Btree page 
21a60 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  of current entry
21a70 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
21a80 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21aa0 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20    /* Btree this 
21ab0 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74  cursor belongs t
21ac0 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  o */.#ifdef SQLI
21ad0 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
21ae0 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e  OW_READ.  unsign
21af0 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  ed char * const 
21b00 70 42 75 66 53 74 61 72 74 20 3d 20 70 42 75 66  pBufStart = pBuf
21b10 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20 20  ;.  int bEnd;   
21b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21b40 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e 67   True if reading
21b50 20 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61 20   to end of data 
21b60 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
21b70 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
21b80 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
21b90 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
21ba0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
21bb0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
21bc0 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
21bd0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
21be0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
21bf0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
21c00 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c 7c  ssert( eOp!=2 ||
21c10 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20   offset==0 );   
21c20 20 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72 74   /* Always start
21c30 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20   from beginning 
21c40 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20  for eOp==2 */.. 
21c50 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
21c60 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
21c70 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
21c80 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20 53 51 4c  load;.#ifdef SQL
21c90 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
21ca0 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64 20  LOW_READ.  bEnd 
21cb0 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70 43  = offset+amt==pC
21cc0 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
21cd0 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  d;.#endif.  asse
21ce0 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  rt( offset+amt <
21cf0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  = pCur->info.nPa
21d00 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 69 66 28 20  yload );..  if( 
21d10 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
21d20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26  info.nLocal] > &
21d30 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
21d40 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b  ->usableSize] ){
21d50 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74  .    /* Trying t
21d60 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
21d70 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
21d80 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65  the data is an e
21d90 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75  rror */.    retu
21da0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
21db0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
21dc0 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20  * Check if data 
21dd0 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69  must be read/wri
21de0 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65  tten to/from the
21df0 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65   btree page itse
21e00 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  lf. */.  if( off
21e10 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set<pCur->info.n
21e20 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
21e30 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66   a = amt;.    if
21e40 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d  ( a+offset>pCur-
21e50 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
21e60 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e        a = pCur->
21e70 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66  info.nLocal - of
21e80 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fset;.    }.    
21e90 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
21ea0 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
21eb0 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f  t], pBuf, a, (eO
21ec0 70 20 26 20 30 78 30 31 29 2c 20 70 50 61 67 65  p & 0x01), pPage
21ed0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
21ee0 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
21ef0 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61  pBuf += a;.    a
21f00 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65  mt -= a;.  }else
21f10 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20  {.    offset -= 
21f20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
21f30 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  l;.  }..  if( rc
21f40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
21f50 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  mt>0 ){.    cons
21f60 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d  t u32 ovflSize =
21f70 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
21f80 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20   - 4;  /* Bytes 
21f90 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c  content per ovfl
21fa0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
21fb0 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20  o nextPage;..   
21fc0 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
21fd0 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70  byte(&aPayload[p
21fe0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
21ff0 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ]);..    /* If t
22000 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  he BtCursor.aOve
22010 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20  rflow[] has not 
22020 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
22030 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e  allocate it now.
22040 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20  .    ** Except, 
22050 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20  do not allocate 
22060 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20  aOverflow[] for 
22070 65 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20  eOp==2..    **. 
22080 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66     ** The aOverf
22090 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73  low[] array is s
220a0 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72  ized at one entr
220b0 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
220c0 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  low page.    ** 
220d0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
220e0 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20  chain. The page 
220f0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
22100 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
22110 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72  e is.    ** stor
22120 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b  ed in aOverflow[
22130 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65  0], etc. A value
22140 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
22150 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20  erflow[] array. 
22160 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74     ** means "not
22170 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65   yet known" (the
22180 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
22190 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
221a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 21   */.    if( eOp!
221b0 3d 32 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  =2 && (pCur->cur
221c0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
221d0 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20  idOvfl)==0 ){.  
221e0 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20      int nOvfl = 
221f0 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79  (pCur->info.nPay
22200 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e  load-pCur->info.
22210 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d  nLocal+ovflSize-
22220 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  1)/ovflSize;.   
22230 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75     if( nOvfl>pCu
22240 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b  r->nOvflAlloc ){
22250 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61  .        Pgno *a
22260 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c  New = (Pgno*)sql
22270 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 0a 20  ite3DbRealloc(. 
22280 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
22290 3e 70 42 74 72 65 65 2d 3e 64 62 2c 20 70 43 75  >pBtree->db, pCu
222a0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f  r->aOverflow, nO
222b0 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e  vfl*2*sizeof(Pgn
222c0 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  o).        );.  
222d0 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d        if( aNew==
222e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
222f0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
22300 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
22310 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
22320 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f  >nOvflAlloc = nO
22330 76 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20  vfl*2;.         
22340 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
22350 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20   = aNew;.       
22360 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
22370 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22380 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  OK ){.        me
22390 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72  mset(pCur->aOver
223a0 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73  flow, 0, nOvfl*s
223b0 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20  izeof(Pgno));.  
223c0 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
223d0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
223e0 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a  idOvfl;.      }.
223f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
22400 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
22410 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
22420 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
22430 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
22440 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
22450 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65  rst required ove
22460 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61  rflow page is va
22470 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a  lid, skip.    **
22480 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e   directly to it.
22490 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
224a0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
224b0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
224c0 29 21 3d 30 0a 20 20 20 20 20 26 26 20 70 43 75  )!=0.     && pCu
224d0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66  r->aOverflow[off
224e0 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20  set/ovflSize].  
224f0 20 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20    ){.      iIdx 
22500 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
22510 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
22520 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
22530 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
22540 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
22550 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
22560 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b     }..    for( ;
22570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22580 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50  & amt>0 && nextP
22590 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20  age; iIdx++){.. 
225a0 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
225b0 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
225c0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
225d0 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
225e0 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e       if( (pCur->
225f0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
22600 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b  ValidOvfl)!=0 ){
22610 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
22620 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
22630 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e  [iIdx] || pCur->
22640 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
22650 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  =nextPage);.    
22660 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
22670 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
22680 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Page;.      }.. 
22690 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
226a0 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
226b0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
226c0 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
226d0 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
226e0 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
226f0 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
22700 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
22710 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
22720 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
22730 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
22740 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
22750 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
22760 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
22770 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
22780 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
22790 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
227a0 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
227b0 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
227c0 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
227d0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
227e0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
227f0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 4f  Note that the aO
22800 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
22810 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
22820 64 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32  d because eOp!=2
22830 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65  .        ** here
22840 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68  .  If eOp==2, th
22850 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64  en offset==0 and
22860 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   this branch is 
22870 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20  never taken..   
22880 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
22890 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29  assert( eOp!=2 )
228a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
228b0 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73  ( pCur->curFlags
228c0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
228d0 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  l );.        if(
228e0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
228f0 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20  [iIdx+1] ){.    
22900 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
22910 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
22920 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20  [iIdx+1];.      
22930 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22940 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
22950 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78  lowPage(pBt, nex
22960 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50  tPage, 0, &nextP
22970 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
22980 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d          offset -
22990 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  = ovflSize;.    
229a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
229b0 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64   /* Need to read
229c0 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65   this page prope
229d0 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73  rly. It contains
229e0 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   some of the.   
229f0 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66       ** range of
22a00 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65   data that is be
22a10 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30  ing read (eOp==0
22a20 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f  ) or written (eO
22a30 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a  p!=0)..        *
22a40 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
22a50 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
22a60 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c  READ.        sql
22a70 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23  ite3_file *fd;.#
22a80 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e  endif.        in
22a90 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
22aa0 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
22ab0 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
22ac0 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
22ad0 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
22ae0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64  .        }..#ifd
22af0 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
22b00 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
22b10 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
22b20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
22b30 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20  re true:.       
22b40 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
22b50 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65   1) this is a re
22b60 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e  ad operation, an
22b70 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  d .        **   
22b80 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69  2) data is requi
22b90 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  red from the sta
22ba0 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66  rt of this overf
22bb0 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20  low page, and.  
22bc0 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68        **   3) th
22bd0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69  e database is fi
22be0 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20  le-backed, and. 
22bf0 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74         **   4) t
22c00 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20  here is no open 
22c10 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
22c20 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  n, and.        *
22c30 2a 20 20 20 35 29 20 74 68 65 20 64 61 74 61 62  *   5) the datab
22c40 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c  ase is not a WAL
22c50 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20   database,.     
22c60 20 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64     **   6) all d
22c70 61 74 61 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ata from the pag
22c80 65 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 2e  e is being read.
22c90 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 37 29  .        **   7)
22ca0 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65   at least 4 byte
22cb0 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
22cc0 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68  een read into th
22cd0 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
22ce0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
22cf0 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61      ** then data
22d00 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72   can be read dir
22d10 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64  ectly from the d
22d20 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74  atabase file int
22d30 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
22d40 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20   output buffer, 
22d50 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70 61  bypassing the pa
22d60 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74  ge-cache altoget
22d70 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64 73  her. This speeds
22d80 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c  .        ** up l
22d90 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63  oading large rec
22da0 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d  ords that span m
22db0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
22dc0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
22dd0 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 26         if( (eOp&
22de0 30 78 30 31 29 3d 3d 30 20 20 20 20 20 20 20 20  0x01)==0        
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22e10 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (1) */.        
22e20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20   && offset==0   
22e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e50 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f         /* (2) */
22e60 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 62 45  .         && (bE
22e70 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a  nd || a==ovflSiz
22e80 65 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e)              
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20  /* (6) */.      
22eb0 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61     && pBt->inTra
22ec0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
22ed0 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20  READ            
22ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29 20           /* (4) 
22ef0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  */.         && (
22f00 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
22f10 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65  rFile(pBt->pPage
22f20 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20  r))->pMethods   
22f30 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20    /* (3) */.    
22f40 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50 61       && pBt->pPa
22f50 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d  ge1->aData[19]==
22f60 30 78 30 31 20 20 20 20 20 20 20 20 20 20 20 20  0x01            
22f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 35             /* (5
22f80 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
22f90 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66   &pBuf[-4]>=pBuf
22fa0 53 74 61 72 74 20 20 20 20 20 20 20 20 20 20 20  Start           
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fc0 20 20 20 20 2f 2a 20 28 37 29 20 2a 2f 0a 20 20      /* (7) */.  
22fd0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
22fe0 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a     u8 aSave[4];.
22ff0 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 57            u8 *aW
23000 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d  rite = &pBuf[-4]
23010 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
23020 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66  rt( aWrite>=pBuf
23030 53 74 61 72 74 20 29 3b 20 20 20 20 20 20 20 20  Start );        
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23050 20 2f 2a 20 68 65 6e 63 65 20 28 37 29 20 2a 2f   /* hence (7) */
23060 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
23070 79 28 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c  y(aSave, aWrite,
23080 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   4);.          r
23090 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
230a0 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b  d(fd, aWrite, a+
230b0 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67  4, (i64)pBt->pag
230c0 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d  eSize*(nextPage-
230d0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  1));.          n
230e0 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
230f0 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20  te(aWrite);.    
23100 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72        memcpy(aWr
23110 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a  ite, aSave, 4);.
23120 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
23130 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a  ndif..        {.
23140 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65            DbPage
23150 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20   *pDbPage;.     
23160 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
23170 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42  3PagerAcquire(pB
23180 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50  t->pPager, nextP
23190 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a 20  age, &pDbPage,. 
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 65               ((e
231b0 4f 70 26 30 78 30 31 29 3d 3d 30 20 3f 20 50 41  Op&0x01)==0 ? PA
231c0 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
231d0 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20 20   : 0).          
231e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
231f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23200 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 50  {.            aP
23210 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33  ayload = sqlite3
23220 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
23230 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
23240 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
23250 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29  t4byte(aPayload)
23260 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
23270 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
23280 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b  aPayload[offset+
23290 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f  4], pBuf, a, (eO
232a0 70 26 30 78 30 31 29 2c 20 70 44 62 50 61 67 65  p&0x01), pDbPage
232b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
232c0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
232d0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
232e0 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20         offset = 
232f0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
23300 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23310 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20   amt -= a;.     
23320 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
23330 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
23340 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
23350 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
23360 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
23370 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
23380 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
23390 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
233a0 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20  part of the key 
233b0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
233c0 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
233d0 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
233e0 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
233f0 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42  nsferred into pB
23400 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
23410 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
23420 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
23430 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
23440 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43 75   ensure that pCu
23450 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
23460 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20   a valid row.** 
23470 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
23480 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
23490 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
234a0 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
234b0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
234c0 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
234d0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
234e0 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
234f0 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
23500 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
23510 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
23520 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
23530 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  y(BtCursor *pCur
23540 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
23550 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
23560 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  f){.  assert( cu
23570 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
23580 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
23590 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
235a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
235b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
235c0 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
235d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
235e0 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
235f0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
23600 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
23610 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23620 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
23630 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50    return accessP
23640 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
23650 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
23660 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20  ned char*)pBuf, 
23670 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  0);.}../*.** Rea
23680 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  d part of the da
23690 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
236a0 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
236b0 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
236c0 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
236d0 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
236e0 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
236f0 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
23700 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
23710 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
23720 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
23730 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
23740 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
23750 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
23760 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
23770 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
23780 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
23790 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
237a0 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
237b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
237c0 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  a(BtCursor *pCur
237d0 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
237e0 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
237f0 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  f){.  int rc;..#
23800 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23810 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66  IT_INCRBLOB.  if
23820 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d   ( pCur->eState=
23830 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
23840 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
23850 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a  LITE_ABORT;.  }.
23860 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
23870 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
23880 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
23890 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
238a0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
238b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
238c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
238d0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
238e0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
238f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
23900 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
23910 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
23920 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20  ->iPage] );.    
23930 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
23940 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
23950 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
23960 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
23970 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63  l );.    rc = ac
23980 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
23990 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
239a0 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
239b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
239c0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
239d0 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69  ter to payload i
239e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
239f0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
23a00 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73  he .** pCur curs
23a10 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
23a20 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20  o.  The pointer 
23a30 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  is to the beginn
23a40 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  ing of.** the ke
23a50 79 20 69 66 20 69 6e 64 65 78 20 62 74 72 65 65  y if index btree
23a60 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  s (pPage->intKey
23a70 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65 20  ==0) and is the 
23a80 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c  data for.** tabl
23a90 65 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d  e btrees (pPage-
23aa0 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65  >intKey==1). The
23ab0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
23ac0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a   of available.**
23ad0 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69   key/data is wri
23ae0 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  tten into *pAmt.
23af0 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
23b00 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a  hen the value.**
23b10 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e   returned will n
23b20 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f  ot be a valid po
23b30 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
23b40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
23b50 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
23b60 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
23b70 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
23b80 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
23b90 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
23ba0 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
23bb0 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
23bc0 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
23bd0 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
23be0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
23bf0 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
23c00 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
23c10 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
23c20 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
23c30 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
23c40 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
23c50 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
23c60 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
23c70 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
23c80 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
23c90 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mble.** the key/
23ca0 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
23cb0 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
23cc0 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
23cd0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
23ce0 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
23cf0 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
23d00 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
23d10 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
23d20 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
23d30 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
23d40 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
23d50 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
23d60 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
23d70 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
23d80 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69  static const voi
23d90 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d *fetchPayload(
23da0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
23db0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
23dc0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
23dd0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
23de0 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20   */.  u32 *pAmt 
23df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
23e00 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
23e10 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
23e20 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 61  s here */.){.  a
23e30 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26  ssert( pCur!=0 &
23e40 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  & pCur->iPage>=0
23e50 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
23e60 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a  [pCur->iPage]);.
23e70 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23e80 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
23e90 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
23ea0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
23eb0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
23ec0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
23ed0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
23ee0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
23ef0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
23f00 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
23f10 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
23f20 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
23f30 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  ]->nCell );.  as
23f40 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
23f50 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 2a 70  .nSize>0 );.  *p
23f60 41 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  Amt = pCur->info
23f70 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72  .nLocal;.  retur
23f80 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69  n (void*)pCur->i
23f90 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a  nfo.pPayload;.}.
23fa0 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
23fb0 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
23fc0 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20  r pCur is point 
23fd0 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a  to, return as.**
23fe0 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74   many bytes of t
23ff0 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61  he key or data a
24000 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
24010 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20  on the local.** 
24020 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72  b-tree page.  Wr
24030 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
24040 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
24050 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a  s into *pAmt..**
24060 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
24070 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65  returned is ephe
24080 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f  meral.  The key/
24090 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a  data may move.**
240a0 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64   or be destroyed
240b0 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c   on the next cal
240c0 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72  l to any Btree r
240d0 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75  outine,.** inclu
240e0 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20  ding calls from 
240f0 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67  other threads ag
24100 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63  ainst the same c
24110 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  ache..** Hence, 
24120 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42  a mutex on the B
24130 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62  tShared should b
24140 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20  e held prior to 
24150 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20  calling.** this 
24160 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
24170 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73  hese routines is
24180 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69   used to get qui
24190 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79  ck access to key
241a0 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20   and data.** in 
241b0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
241c0 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  where no overflo
241d0 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64  w pages are used
241e0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
241f0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79  *sqlite3BtreeKey
24200 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
24210 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29  pCur, u32 *pAmt)
24220 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68  {.  return fetch
24230 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
24240 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69  mt);.}.const voi
24250 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44  d *sqlite3BtreeD
24260 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f  ataFetch(BtCurso
24270 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41  r *pCur, u32 *pA
24280 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65  mt){.  return fe
24290 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
242a0 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pAmt);.}.../*.*
242b0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
242c0 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20  r down to a new 
242d0 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
242e0 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e   newPgno argumen
242f0 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65  t is the.** page
24300 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63   number of the c
24310 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76  hild page to mov
24320 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  e to..**.** This
24330 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
24340 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
24350 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61   if the page-hea
24360 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20  der flags field 
24370 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68  of.** the new ch
24380 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f  ild page does no
24390 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67  t match the flag
243a0 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70  s field of the p
243b0 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69  arent (i.e..** i
243c0 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65  f an intkey page
243d0 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74   appears to be t
243e0 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e  he parent of a n
243f0 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20  on-intkey page, 
24400 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61  or.** vice-versa
24410 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
24420 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
24430 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
24440 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74   newPgno){.  int
24450 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70   rc;.  int i = p
24460 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65  Cur->iPage;.  Me
24470 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b  mPage *pNewPage;
24480 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
24490 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20   = pCur->pBt;.. 
244a0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
244b0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
244c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
244d0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
244e0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
244f0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
24500 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
24510 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
24520 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
24530 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
24540 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f  Page>=(BTCURSOR_
24550 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a  MAX_DEPTH-1) ){.
24560 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24570 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
24580 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e    }.  rc = getAn
24590 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
245a0 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67  ewPgno, &pNewPag
245b0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
245c0 20 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67    (pCur->curFlag
245d0 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c  s & BTCF_WriteFl
245e0 61 67 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47  ag)==0 ? PAGER_G
245f0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
24600 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
24610 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e  urn rc;.  pCur->
24620 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e  apPage[i+1] = pN
24630 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e  ewPage;.  pCur->
24640 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a  aiIdx[i+1] = 0;.
24650 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b    pCur->iPage++;
24660 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ..  pCur->info.n
24670 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
24680 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
24690 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
246a0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
246b0 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e    if( pNewPage->
246c0 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50  nCell<1 || pNewP
246d0 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75  age->intKey!=pCu
246e0 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e  r->apPage[i]->in
246f0 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
24700 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
24710 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
24720 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24730 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 50  }..#if 0./*.** P
24740 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61  age pParent is a
24750 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d  n internal (non-
24760 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e  leaf) tree page.
24770 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   This function .
24780 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20  ** asserts that 
24790 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
247a0 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63  ld is the left-c
247b0 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78  hild if the iIdx
247c0 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70  'th.** cell in p
247d0 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c  age pParent. Or,
247e0 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61   if iIdx is equa
247f0 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  l to the total n
24800 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c  umber of.** cell
24810 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68  s in pParent, th
24820 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
24830 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67  Child is the rig
24840 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74  ht-child of.** t
24850 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
24860 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61  ic void assertPa
24870 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67  rentIndex(MemPag
24880 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20  e *pParent, int 
24890 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c  iIdx, Pgno iChil
248a0 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49  d){.  assert( iI
248b0 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx<=pParent->nCe
248c0 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78  ll );.  if( iIdx
248d0 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
248e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
248f0 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
24900 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
24910 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
24920 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c  =iChild );.  }el
24930 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
24940 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
24950 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29  l(pParent, iIdx)
24960 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
24970 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69  .}.#else.#  defi
24980 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  ne assertParentI
24990 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e  ndex(x,y,z) .#en
249a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
249b0 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
249c0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
249d0 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
249e0 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
249f0 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
24a00 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
24a10 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
24a20 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
24a30 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
24a40 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
24a50 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
24a60 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
24a70 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
24a80 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
24a90 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
24aa0 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
24ab0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76  .static void mov
24ac0 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73  eToParent(BtCurs
24ad0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
24ae0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
24af0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
24b00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
24b10 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
24b20 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
24b30 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
24b40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
24b50 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24b60 50 61 67 65 5d 20 29 3b 0a 0a 20 20 2f 2a 20 55  Page] );..  /* U
24b70 50 44 41 54 45 3a 20 49 74 20 69 73 20 61 63 74  PDATE: It is act
24b80 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 66  ually possible f
24b90 6f 72 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  or the condition
24ba0 20 74 65 73 74 65 64 20 62 79 20 74 68 65 20 61   tested by the a
24bb0 73 73 65 72 74 0a 20 20 2a 2a 20 62 65 6c 6f 77  ssert.  ** below
24bc0 20 74 6f 20 62 65 20 75 6e 74 72 75 65 20 69 66   to be untrue if
24bd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24be0 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20 54  le is corrupt. T
24bf0 68 69 73 20 63 61 6e 20 6f 63 63 75 72 20 69 66  his can occur if
24c00 0a 20 20 2a 2a 20 6f 6e 65 20 63 75 72 73 6f 72  .  ** one cursor
24c10 20 68 61 73 20 6d 6f 64 69 66 69 65 64 20 70 61   has modified pa
24c20 67 65 20 70 50 61 72 65 6e 74 20 77 68 69 6c 65  ge pParent while
24c30 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
24c40 69 74 20 69 73 20 68 65 6c 64 20 0a 20 20 2a 2a  it is held .  **
24c50 20 62 79 20 61 20 73 65 63 6f 6e 64 20 63 75 72   by a second cur
24c60 73 6f 72 2e 20 57 68 69 63 68 20 63 61 6e 20 6f  sor. Which can o
24c70 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 20  nly happen if a 
24c80 73 69 6e 67 6c 65 20 70 61 67 65 20 69 73 20 6c  single page is l
24c90 69 6e 6b 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20  inked.  ** into 
24ca0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d  more than one b-
24cb0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69  tree structure i
24cc0 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  n a corrupt data
24cd0 62 61 73 65 2e 20 20 2a 2f 0a 23 69 66 20 30 0a  base.  */.#if 0.
24ce0 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e    assertParentIn
24cf0 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61  dex(.    pCur->a
24d00 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
24d10 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
24d20 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
24d30 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
24d40 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24d50 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b  Page]->pgno.  );
24d60 0a 23 65 6e 64 69 66 0a 20 20 74 65 73 74 63 61  .#endif.  testca
24d70 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  se( pCur->aiIdx[
24d80 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e  pCur->iPage-1] >
24d90 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24da0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43  ur->iPage-1]->nC
24db0 65 6c 6c 20 29 3b 0a 0a 20 20 72 65 6c 65 61 73  ell );..  releas
24dc0 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
24dd0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
24de0 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d  ;.  pCur->iPage-
24df0 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  -;.  pCur->info.
24e00 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
24e10 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
24e20 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
24e30 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
24e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
24e50 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
24e60 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  nt to the root p
24e70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65  age of its b-tre
24e80 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  e structure..**.
24e90 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  ** If the table 
24ea0 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f  has a virtual ro
24eb0 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
24ec0 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
24ed0 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f  d to point.** to
24ee0 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
24ef0 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f  t page instead o
24f00 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  f the actual roo
24f10 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20  t page. A table 
24f20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c  has a.** virtual
24f30 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20   root page when 
24f40 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
24f50 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
24f60 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a   cells and a .**
24f70 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61   single child pa
24f80 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  ge. This can onl
24f90 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68  y happen with th
24fa0 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61  e table rooted a
24fb0 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20  t page 1..**.** 
24fc0 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74  If the b-tree st
24fd0 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79  ructure is empty
24fe0 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  , the cursor sta
24ff0 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a  te is set to .**
25000 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e   CURSOR_INVALID.
25010 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
25020 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f  cursor is set to
25030 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69   point to the fi
25040 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61  rst.** cell loca
25050 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  ted on the root 
25060 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  (or virtual root
25070 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63  ) page and the c
25080 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69  ursor state.** i
25090 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
250a0 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  VALID..**.** If 
250b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
250c0 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c  turns successful
250d0 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73  ly, it may be as
250e0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a  sumed that the.*
250f0 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  * page-header fl
25100 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ags indicate tha
25110 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20  t the [virtual] 
25120 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65  root-page is the
25130 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69   expected .** ki
25140 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  nd of b-tree pag
25150 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20  e (i.e. if when 
25160 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73  opening the curs
25170 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  or the caller di
25180 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79  d not.** specify
25190 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
251a0 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
251b0 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
251c0 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69  05 or 0x0D,.** i
251d0 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c  ndicating a tabl
251e0 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20  e b-tree, or if 
251f0 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73  the caller did s
25200 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
25210 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74   .** structure t
25220 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
25230 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20   set to 0x02 or 
25240 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67  0x0A, indicating
25250 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74   an index.** b-t
25260 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ree)..*/.static 
25270 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
25280 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
25290 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
252a0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
252b0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
252c0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
252d0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
252e0 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
252f0 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
25300 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
25310 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
25320 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
25330 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
25340 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
25350 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
25360 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
25370 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
25380 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
25390 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
253a0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
253b0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
253c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
253d0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51  ur->skipNext!=SQ
253e0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
253f0 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
25400 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ipNext;.    }.  
25410 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
25420 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
25430 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72  .  }..  if( pCur
25440 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ->iPage>=0 ){.  
25450 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69    while( pCur->i
25460 50 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61  Page ) releasePa
25470 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
25480 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b  pCur->iPage--]);
25490 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75  .  }else if( pCu
254a0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29  r->pgnoRoot==0 )
254b0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
254c0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
254d0 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LID;.    return 
254e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
254f0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74  se{.    rc = get
25500 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75 72  AndInitPage(pCur
25510 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70  ->pBtree->pBt, p
25520 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
25530 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c  pCur->apPage[0],
25540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25550 20 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67    (pCur->curFlag
25560 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c  s & BTCF_WriteFl
25570 61 67 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47  ag)==0 ? PAGER_G
25580 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
25590 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
255a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
255b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
255c0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
255d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
255e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
255f0 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  >iPage = 0;.  }.
25600 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
25610 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73  apPage[0];.  ass
25620 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  ert( pRoot->pgno
25630 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
25640 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75   );..  /* If pCu
25650 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e  r->pKeyInfo is n
25660 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
25670 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70  e caller that op
25680 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72  ened this cursor
25690 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74  .  ** expected t
256a0 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20  o open it on an 
256b0 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74  index b-tree. Ot
256c0 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79  herwise, if pKey
256d0 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c  Info is.  ** NUL
256e0 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78  L, the caller ex
256f0 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d  pects a table b-
25700 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73  tree. If this is
25710 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20   not the case,. 
25720 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51   ** return an SQ
25730 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
25740 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  or. .  **.  ** E
25750 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20  arlier versions 
25760 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65  of SQLite assume
25770 64 20 74 68 61 74 20 74 68 69 73 20 74 65 73 74  d that this test
25780 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a   could not fail.
25790 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74    ** if the root
257a0 20 70 61 67 65 20 77 61 73 20 61 6c 72 65 61 64   page was alread
257b0 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68  y loaded when th
257c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  is function was 
257d0 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a  called (i.e..  *
257e0 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65  * if pCur->iPage
257f0 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20 69  >=0). But this i
25800 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20  s not so if the 
25810 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72  database is corr
25820 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73  upted .  ** in s
25830 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20 70  uch a way that p
25840 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e  age pRoot is lin
25850 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e  ked into a secon
25860 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a  d b-tree table .
25870 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65    ** (or the fre
25880 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73  elist).  */.  as
25890 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74  sert( pRoot->int
258a0 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d  Key==1 || pRoot-
258b0 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  >intKey==0 );.  
258c0 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  if( pRoot->isIni
258d0 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70  t==0 || (pCur->p
258e0 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f  KeyInfo==0)!=pRo
258f0 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ot->intKey ){.  
25900 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25910 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
25920 7d 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  }..  pCur->aiIdx
25930 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  [0] = 0;.  pCur-
25940 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
25950 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
25960 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61  s &= ~(BTCF_AtLa
25970 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  st|BTCF_ValidNKe
25980 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
25990 29 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d  );..  if( pRoot-
259a0 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
259b0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
259c0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d  URSOR_VALID;.  }
259d0 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d  else if( !pRoot-
259e0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
259f0 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69  o subpage;.    i
25a00 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d  f( pRoot->pgno!=
25a10 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
25a20 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
25a30 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
25a40 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
25a50 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
25a60 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
25a70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
25a80 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
25a90 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
25aa0 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
25ab0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
25ac0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
25ad0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d  SOR_INVALID;.  }
25ae0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25af0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
25b00 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
25b10 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
25b20 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
25b30 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
25b40 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
25b50 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
25b60 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
25b70 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
25b80 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
25b90 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
25ba0 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
25bb0 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
25bc0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
25bd0 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
25be0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
25bf0 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
25c00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25c10 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
25c20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
25c30 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
25c40 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
25c50 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
25c60 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
25c70 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
25c80 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
25c90 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25ca0 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
25cb0 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
25cc0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
25cd0 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
25ce0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
25cf0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
25d00 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
25d10 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
25d20 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63  iPage]));.    rc
25d30 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
25d40 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
25d50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25d60 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
25d70 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
25d80 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
25d90 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
25da0 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
25db0 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
25dc0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
25dd0 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
25de0 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
25df0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
25e00 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
25e10 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
25e20 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
25e30 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
25e40 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
25e50 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
25e60 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
25e70 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
25e80 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
25e90 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
25ea0 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
25eb0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
25ec0 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
25ed0 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
25ee0 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
25ef0 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
25f00 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
25f10 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
25f20 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
25f30 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
25f40 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
25f50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
25f60 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
25f70 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
25f80 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
25f90 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
25fa0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
25fb0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
25fc0 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d  while( !(pPage =
25fd0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25fe0 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
25ff0 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
26000 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
26010 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
26020 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
26030 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
26040 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67  r->iPage] = pPag
26050 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63  e->nCell;.    rc
26060 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
26070 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  Cur, pgno);.    
26080 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
26090 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  rc;.  }.  pCur->
260a0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
260b0 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
260c0 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l-1;.  assert( p
260d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
260e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
260f0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
26100 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  & BTCF_ValidNKey
26110 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
26120 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
26130 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
26140 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  r to the first e
26150 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
26160 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
26170 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
26180 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
26190 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
261a0 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
261b0 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
261c0 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
261d0 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
261e0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
261f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  t sqlite3BtreeFi
26200 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  rst(BtCursor *pC
26210 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
26220 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
26230 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
26240 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
26250 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
26260 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
26270 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
26280 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d  tex) );.  rc = m
26290 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
262a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
262b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
262c0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
262d0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
262e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
262f0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
26300 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
26310 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
26320 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
26330 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d  *pRes = 1;.    }
26340 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
26350 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
26360 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
26370 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  Cell>0 );.      
26380 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
26390 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
263a0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
263b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
263c0 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
263d0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
263e0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
263f0 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
26400 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
26410 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
26420 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
26430 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
26440 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
26450 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
26460 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
26470 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
26480 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
26490 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f  treeLast(BtCurso
264a0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
264b0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
264c0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
264d0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
264e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
264f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
26500 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
26510 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
26520 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
26530 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73  r already points
26540 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
26550 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ry, this is a no
26560 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55  -op. */.  if( CU
26570 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
26580 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75  ->eState && (pCu
26590 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
265a0 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b  CF_AtLast)!=0 ){
265b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
265c0 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73  EBUG.    /* This
265d0 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f   block serves to
265e0 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
265f0 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79  he cursor really
26600 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20   does point .   
26610 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20   ** to the last 
26620 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74  entry in the b-t
26630 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ree. */.    int 
26640 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ii;.    for(ii=0
26650 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65  ; ii<pCur->iPage
26660 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
26670 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
26680 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70  dx[ii]==pCur->ap
26690 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20  Page[ii]->nCell 
266a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
266b0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
266c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70  [pCur->iPage]==p
266d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
266e0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d  ->iPage]->nCell-
266f0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
26700 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
26710 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66  ur->iPage]->leaf
26720 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72   );.#endif.    r
26730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26740 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
26750 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
26760 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26770 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55  OK ){.    if( CU
26780 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
26790 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
267a0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
267b0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
267c0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
267d0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
267e0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
267f0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
26800 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
26810 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
26820 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
26830 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
26840 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
26850 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
26860 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
26870 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26880 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
26890 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c  lags |= BTCF_AtL
268a0 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ast;.      }else
268b0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
268c0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
268d0 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
268e0 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a  }.   .    }.  }.
268f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26900 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
26910 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
26920 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
26930 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
26940 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
26950 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
26960 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
26970 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
26980 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
26990 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
269a0 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
269b0 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
269c0 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
269d0 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
269e0 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
269f0 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
26a00 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
26a10 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
26a20 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
26a30 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
26a40 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
26a50 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
26a60 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
26a70 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
26a80 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
26a90 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
26aa0 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
26ab0 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
26ac0 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
26ad0 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
26ae0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
26af0 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
26b00 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
26b10 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
26b20 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
26b30 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
26b40 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
26b50 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
26b60 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
26b70 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
26b80 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
26b90 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
26ba0 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
26bb0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
26bc0 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
26bd0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
26be0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
26bf0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
26c00 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
26c10 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
26c20 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
26c30 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
26c40 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
26c50 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
26c60 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
26c70 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
26c80 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
26c90 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
26ca0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
26cb0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
26cc0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
26cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
26ce0 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
26cf0 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
26d00 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
26d10 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
26d20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
26d30 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
26d40 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
26d50 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
26d60 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
26d70 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73  Key..**.*/.int s
26d80 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
26d90 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43  oUnpacked(.  BtC
26da0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
26db0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
26dc0 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20  sor to be moved 
26dd0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
26de0 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a  ord *pIdxKey, /*
26df0 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
26e00 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74  key */.  i64 int
26e10 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
26e20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b    /* The table k
26e30 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  ey */.  int bias
26e40 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
26e50 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61   /* If true, bia
26e60 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  s the search to 
26e70 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
26e80 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
26e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
26ea0 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
26eb0 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
26ec0 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64  int rc;.  Record
26ed0 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43  Compare xRecordC
26ee0 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72  ompare;..  asser
26ef0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
26f00 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
26f10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
26f20 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
26f30 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
26f40 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
26f50 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74  pRes );.  assert
26f60 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  ( (pIdxKey==0)==
26f70 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
26f80 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
26f90 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
26fa0 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64  ready positioned
26fb0 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65   at the point we
26fc0 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a   are trying.  **
26fd0 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65   to move to, the
26fe0 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69  n just return wi
26ff0 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20  thout doing any 
27000 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43  work */.  if( pC
27010 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
27020 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75  OR_VALID && (pCu
27030 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
27040 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30  CF_ValidNKey)!=0
27050 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50  .   && pCur->apP
27060 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a  age[0]->intKey .
27070 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75    ){.    if( pCu
27080 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
27090 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
270a0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
270b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
270c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
270d0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
270e0 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30   BTCF_AtLast)!=0
270f0 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   && pCur->info.n
27100 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
27110 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
27120 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27130 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
27140 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79  }..  if( pIdxKey
27150 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43   ){.    xRecordC
27160 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33  ompare = sqlite3
27170 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28  VdbeFindCompare(
27180 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49  pIdxKey);.    pI
27190 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d  dxKey->errCode =
271a0 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
271b0 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
271c0 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20  _rc==1 .        
271d0 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66   || pIdxKey->def
271e0 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20  ault_rc==0 .    
271f0 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d       || pIdxKey-
27200 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a  >default_rc==-1.
27210 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
27220 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61      xRecordCompa
27230 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b  re = 0; /* All k
27240 65 79 73 20 61 72 65 20 69 6e 74 65 67 65 72 73  eys are integers
27250 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   */.  }..  rc = 
27260 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
27270 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
27280 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
27290 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
272a0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
272b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
272c0 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
272d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
272e0 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
272f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27300 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b  Page]->isInit );
27310 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
27320 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
27330 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
27340 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27350 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
27360 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
27370 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
27380 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  LID ){.    *pRes
27390 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
273a0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
273b0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
273c0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
273d0 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
273e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
273f0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
27400 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
27410 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49  0]->intKey || pI
27420 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b  dxKey );.  for(;
27430 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c  ;){.    int lwr,
27440 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20   upr, idx, c;.  
27450 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20    Pgno chldPg;. 
27460 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
27470 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
27480 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
27490 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20     u8 *pCell;   
274a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274b0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
274c0 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c  r to current cel
274d0 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20  l in pPage */.. 
274e0 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65     /* pPage->nCe
274f0 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61 74  ll must be great
27500 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66  er than zero. If
27510 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f   this is the roo
27520 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68  t-page.    ** th
27530 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68  e cursor would h
27540 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44  ave been INVALID
27550 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20   above and this 
27560 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20  for(;;) loop.   
27570 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20   ** not run. If 
27580 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
27590 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20  root-page, then 
275a0 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  the moveToChild(
275b0 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  ) routine.    **
275c0 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65   would have alre
275d0 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62 20  ady detected db 
275e0 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69  corruption. Simi
275f0 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73  larly, pPage mus
27600 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
27610 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65  right kind (inde
27620 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62  x or table) of b
27630 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65  -tree page. Othe
27640 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d  rwise.    ** a m
27650 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20  oveToChild() or 
27660 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c  moveToRoot() cal
27670 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74  l would have det
27680 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e  ected corruption
27690 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
276a0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
276b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
276c0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28  pPage->intKey==(
276d0 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20  pIdxKey==0) );. 
276e0 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20     lwr = 0;.    
276f0 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  upr = pPage->nCe
27700 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  ll-1;.    assert
27710 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c  ( biasRight==0 |
27720 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29  | biasRight==1 )
27730 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e  ;.    idx = upr>
27740 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20  >(1-biasRight); 
27750 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69 67  /* idx = biasRig
27760 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b  ht ? upr : (lwr+
27770 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70  upr)/2; */.    p
27780 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27790 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
277a0 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63  dx;.    if( xRec
277b0 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b  ordCompare==0 ){
277c0 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  .      for(;;){.
277d0 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c          i64 nCel
277e0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43  lKey;.        pC
277f0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
27800 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61  Page, idx) + pPa
27810 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
27820 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
27830 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
27840 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ){.          whi
27850 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43  le( 0x80 <= *(pC
27860 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20  ell++) ){.      
27870 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e        if( pCell>
27880 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
27890 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
278a0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
278b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
278c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
278d0 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
278e0 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
278f0 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
27900 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey<intKey ){. 
27910 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
27920 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx+1;.          
27930 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
27940 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = -1; break; }.
27950 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
27960 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
27970 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  y ){.          u
27980 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
27990 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
279a0 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65  r ){ c = +1; bre
279b0 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
279c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
279d0 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d  ssert( nCellKey=
279e0 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  =intKey );.     
279f0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
27a00 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
27a10 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  dNKey;.         
27a20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
27a30 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20   = nCellKey;.   
27a40 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
27a50 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
27a60 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
27a70 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
27a80 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
27a90 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b        lwr = idx;
27aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
27ab0 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61  o moveto_next_la
27ac0 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  yer;.          }
27ad0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
27ae0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
27af0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
27b00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
27b10 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
27b20 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
27b30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
27b40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
27b50 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20  wr+upr>=0 );.   
27b60 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b       idx = (lwr+
27b70 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78  upr)>>1;  /* idx
27b80 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20   = (lwr+upr)/2; 
27b90 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
27ba0 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28  else{.      for(
27bb0 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ;;){.        int
27bc0 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20   nCell;.        
27bd0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
27be0 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70  (pPage, idx) + p
27bf0 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
27c00 7a 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ze;..        /* 
27c10 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
27c20 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
27c30 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20  is 65536 bytes. 
27c40 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
27c50 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
27c60 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
27c70 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
27c80 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
27c90 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
27ca0 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20  ** page is less 
27cb0 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73  than 16384 bytes
27cc0 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72   and may be stor
27cd0 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
27ce0 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
27cf0 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
27d00 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
27d10 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
27d20 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
27d30 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
27d40 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
27d50 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
27d60 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
27d70 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
27d80 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
27d90 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
27da0 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
27db0 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
27dc0 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
27dd0 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
27de0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
27df0 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d  nCell = pCell[0]
27e00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
27e10 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31  ell<=pPage->max1
27e20 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20  bytePayload ){. 
27e30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
27e40 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
27e50 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
27e60 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
27e70 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
27e80 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
27e90 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
27ea0 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
27eb0 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
27ec0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
27ed0 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
27ee0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
27ef0 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d  ( pCell+nCell+1=
27f00 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
27f10 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
27f20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
27f30 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
27f40 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65  pCell[1], pIdxKe
27f50 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
27f60 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d  e if( !(pCell[1]
27f70 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20   & 0x80) .      
27f80 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20      && (nCell = 
27f90 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37  ((nCell&0x7f)<<7
27fa0 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70  ) + pCell[1])<=p
27fb0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20  Page->maxLocal. 
27fc0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
27fd0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
27fe0 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20  d-size field is 
27ff0 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20  a 2 byte varint 
28000 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a  and the record .
28010 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74            ** fit
28020 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
28030 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61  e main b-tree pa
28040 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
28050 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
28060 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65  l+nCell+2==pPage
28070 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
28080 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
28090 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
280a0 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
280b0 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  2], pIdxKey);.  
280c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
280d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
280e0 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20  cord flows over 
280f0 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  onto one or more
28100 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
28110 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   In.          **
28120 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77   this case the w
28130 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20  hole cell needs 
28140 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20  to be parsed, a 
28150 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
28160 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
28170 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  d accessPayload(
28180 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65  ) used to retrie
28190 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  ve the record in
281a0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  to the.         
281b0 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72   ** buffer befor
281c0 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
281d0 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c  are() can be cal
281e0 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  led. */.        
281f0 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79    void *pCellKey
28200 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  ;.          u8 *
28210 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79   const pCellBody
28220 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65   = pCell - pPage
28230 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
28240 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 50            btreeP
28250 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
28260 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70  e, pCellBody, &p
28270 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
28280 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69        nCell = (i
28290 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
282a0 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  ey;.          pC
282b0 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ellKey = sqlite3
282c0 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29 3b  Malloc( nCell );
282d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
282e0 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  CellKey==0 ){.  
282f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
28300 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
28310 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
28320 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
28330 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28340 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
28350 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
28360 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
28370 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
28380 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43  load(pCur, 0, nC
28390 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ell, (unsigned c
283a0 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 32  har*)pCellKey, 2
283b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
283c0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
283d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
283e0 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
283f0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
28400 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
28410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28420 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
28430 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c  are(nCell, pCell
28440 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
28450 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
28460 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
28470 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28480 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20     assert( .    
28490 20 20 20 20 20 20 20 20 28 70 49 64 78 4b 65 79          (pIdxKey
284a0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
284b0 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d  E_CORRUPT || c==
284c0 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0).         && (
284d0 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
284e0 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  !=SQLITE_NOMEM |
284f0 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  | pCur->pBtree->
28500 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
28510 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
28520 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a       if( c<0 ){.
28530 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
28540 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d  idx+1;.        }
28550 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a  else if( c>0 ){.
28560 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
28570 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  idx-1;.        }
28580 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
28590 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a  assert( c==0 );.
285a0 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
285b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
285c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
285d0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
285e0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
285f0 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
28600 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
28610 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  Key->errCode ) r
28620 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
28630 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
28640 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
28650 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28660 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
28670 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
28680 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
28690 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
286a0 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
286b0 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
286c0 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20  r+upr)/2 */.    
286d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
286e0 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31  sert( lwr==upr+1
286f0 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b   || (pPage->intK
28700 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
28710 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  af) );.    asser
28720 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
28730 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
28740 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
28750 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
28760 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
28770 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
28780 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
28790 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  ll );.      pCur
287a0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
287b0 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
287c0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63  .      *pRes = c
287d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
287e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f  ITE_OK;.      go
287f0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
28800 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e  ;.    }.moveto_n
28810 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69  ext_layer:.    i
28820 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
28830 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
28840 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
28850 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
28860 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
28870 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
28880 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
28890 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
288a0 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
288b0 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69    }.    pCur->ai
288c0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
288d0 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20   = (u16)lwr;.   
288e0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
288f0 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b  d(pCur, chldPg);
28900 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72  .    if( rc ) br
28910 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f  eak;.  }.moveto_
28920 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e  finish:.  pCur->
28930 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
28940 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
28950 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
28960 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
28970 76 66 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  vfl);.  return r
28980 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
28990 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
289a0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
289b0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
289c0 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
289d0 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
289e0 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
289f0 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
28a00 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
28a10 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
28a20 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
28a30 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
28a40 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
28a50 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
28a60 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
28a70 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
28a80 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
28a90 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
28aa0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
28ab0 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
28ac0 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
28ad0 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
28ae0 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
28af0 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
28b00 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
28b10 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
28b20 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
28b30 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
28b40 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
28b50 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
28b60 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
28b70 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
28b80 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
28b90 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
28ba0 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
28bb0 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  te);.}../*.** Ad
28bc0 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
28bd0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
28be0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
28bf0 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
28c00 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
28c10 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
28c20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
28c30 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
28c40 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
28c50 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
28c60 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
28c70 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
28c80 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
28c90 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es=1..**.** The 
28ca0 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74  main entry point
28cb0 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65   is sqlite3Btree
28cc0 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f  Next().  That ro
28cd0 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a  utine is optimiz
28ce0 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ed.** for the co
28cf0 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72  mmon case of mer
28d00 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67  ely incrementing
28d10 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65   the cell counte
28d20 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  r BtCursor.aiIdx
28d30 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20  .** to the next 
28d40 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72  cell on the curr
28d50 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28  ent page.  The (
28d60 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78  slower) btreeNex
28d70 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f  t() helper.** ro
28d80 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
28d90 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73  when it is neces
28da0 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20  sary to move to 
28db0 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  a different page
28dc0 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72   or.** to restor
28dd0 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  e the cursor..**
28de0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
28df0 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65  function will se
28e00 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20  t *pRes to 0 or 
28e10 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20  1.  The initial 
28e20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77  *pRes value.** w
28e30 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20  ill be 1 if the 
28e40 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65  cursor being ste
28e50 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73  pped corresponds
28e60 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
28e70 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20   and.** if this 
28e80 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
28e90 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20  ve been skipped 
28ea0 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65  if that SQL inde
28eb0 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20  x had been.** a 
28ec0 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f  unique index.  O
28ed0 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c  therwise the cal
28ee0 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65  ler will have se
28ef0 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e  t *pRes to zero.
28f00 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20  .** Zero is the 
28f10 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65  common case. The
28f20 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
28f30 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f  ation is free to
28f40 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74   use the.** init
28f50 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20  ial *pRes value 
28f60 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70  as a hint to imp
28f70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rove performance
28f80 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e  , but the curren
28f90 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65  t.** SQLite btre
28fa0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
28fb0 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65   does not. (Note
28fc0 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32   that the comdb2
28fd0 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d   btree.** implem
28fe0 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73  entation does us
28ff0 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77  e this hint, how
29000 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ever.).*/.static
29010 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
29020 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42   int btreeNext(B
29030 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
29040 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
29050 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a   rc;.  int idx;.
29060 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
29070 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
29080 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
29090 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
290a0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
290b0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
290c0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
290d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
290e0 52 65 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Res==0 );.  if( 
290f0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
29100 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
29110 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
29120 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
29130 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
29140 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f  ;.    rc = resto
29150 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
29160 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
29170 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29180 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
29190 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
291a0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
291b0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
291c0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
291d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
291e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
291f0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
29200 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61  pNext ){.      a
29210 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
29220 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
29230 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
29240 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
29250 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  XT );.      pCur
29260 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
29270 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69  R_VALID;.      i
29280 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
29290 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  t>0 ){.        p
292a0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
292b0 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
292c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
292d0 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
292e0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
292f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
29300 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
29310 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
29320 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61   idx = ++pCur->a
29330 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
29340 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
29350 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20  ge->isInit );.. 
29360 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
29370 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72  ase file is corr
29380 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69  upt, it is possi
29390 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ble for the valu
293a0 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74  e of idx .  ** t
293b0 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72  o be invalid her
293c0 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
293d0 20 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f   occur if a seco
293e0 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69  nd cursor modifi
293f0 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  es.  ** the page
29400 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43   while cursor pC
29410 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  ur is holding a 
29420 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e  reference to it.
29430 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20   Which can.  ** 
29440 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74  only happen if t
29450 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
29460 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61  orrupt in such a
29470 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20   way as to link 
29480 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  the.  ** page in
29490 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  to more than one
294a0 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
294b0 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  e. */.  testcase
294c0 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65  ( idx>pPage->nCe
294d0 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78  ll );..  if( idx
294e0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
294f0 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
29500 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
29510 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
29520 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
29530 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
29540 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
29550 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ]));.      if( r
29560 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
29570 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65       return move
29580 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
29590 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
295a0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
295b0 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
295c0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
295d0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
295e0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
295f0 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
29600 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
29620 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
29630 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
29640 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29650 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d  r->iPage];.    }
29660 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
29670 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e  dx[pCur->iPage]>
29680 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
29690 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
296a0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
296b0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74  return sqlite3Bt
296c0 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
296d0 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
296e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
296f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
29700 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  }.  if( pPage->l
29710 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
29720 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
29730 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
29740 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
29750 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74  pCur);.  }.}.int
29760 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
29770 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
29780 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
29790 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
297a0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
297b0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
297c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
297d0 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  es!=0 );.  asser
297e0 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a  t( *pRes==0 || *
297f0 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73  pRes==1 );.  ass
29800 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
29810 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
29820 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
29830 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e  ALID );.  pCur->
29840 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
29850 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
29860 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
29870 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
29880 76 66 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20  vfl);.  *pRes = 
29890 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  0;.  if( pCur->e
298a0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
298b0 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72  LID ) return btr
298c0 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
298d0 73 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43  s);.  pPage = pC
298e0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
298f0 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 28  >iPage];.  if( (
29900 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ++pCur->aiIdx[pC
29910 75 72 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61  ur->iPage])>=pPa
29920 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
29930 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
29940 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20  r->iPage]--;.   
29950 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78   return btreeNex
29960 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
29970 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
29980 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
29990 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
299a0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
299b0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
299c0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pCur);.  }.}../
299d0 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75  *.** Step the cu
299e0 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b  rsor to the back
299f0 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
29a00 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
29a10 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
29a20 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
29a30 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
29a40 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
29a50 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
29a60 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
29a70 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
29a80 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
29a90 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
29aa0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
29ab0 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a  t *pRes=1..**.**
29ac0 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20   The main entry 
29ad0 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33  point is sqlite3
29ae0 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e  BtreePrevious().
29af0 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69    That routine i
29b00 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66  s optimized.** f
29b10 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
29b20 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63  se of merely dec
29b30 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65  rementing the ce
29b40 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72  ll counter BtCur
29b50 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20  sor.aiIdx.** to 
29b60 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c  the previous cel
29b70 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  l on the current
29b80 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f   page.  The (slo
29b90 77 65 72 29 20 62 74 72 65 65 50 72 65 76 69 6f  wer) btreePrevio
29ba0 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72  us().** helper r
29bb0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
29bc0 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65   when it is nece
29bd0 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f  ssary to move to
29be0 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67   a different pag
29bf0 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f  e.** or to resto
29c00 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  re the cursor..*
29c10 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  *.** The calling
29c20 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
29c30 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72  et *pRes to 0 or
29c40 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c   1.  The initial
29c50 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20   *pRes value.** 
29c60 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65  will be 1 if the
29c70 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74   cursor being st
29c80 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64  epped correspond
29c90 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
29ca0 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73  x and.** if this
29cb0 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
29cc0 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
29cd0 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64   if that SQL ind
29ce0 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61  ex had been.** a
29cf0 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20   unique index.  
29d00 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61  Otherwise the ca
29d10 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73  ller will have s
29d20 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f  et *pRes to zero
29d30 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65  ..** Zero is the
29d40 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68   common case. Th
29d50 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
29d60 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74  tation is free t
29d70 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69  o use the.** ini
29d80 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
29d90 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d   as a hint to im
29da0 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  prove performanc
29db0 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65  e, but the curre
29dc0 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72  nt.** SQLite btr
29dd0 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
29de0 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74  n does not. (Not
29df0 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62  e that the comdb
29e00 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65  2 btree.** imple
29e10 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75  mentation does u
29e20 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f  se this hint, ho
29e30 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69  wever.).*/.stati
29e40 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
29e50 45 20 69 6e 74 20 62 74 72 65 65 50 72 65 76 69  E int btreePrevi
29e60 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
29e70 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
29e80 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
29e90 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
29ea0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
29eb0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
29ec0 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
29ed0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
29ee0 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73  *pRes==0 );.  as
29ef0 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
29f00 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
29f10 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
29f20 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
29f30 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
29f40 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73  gs & (BTCF_AtLas
29f50 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  t|BTCF_ValidOvfl
29f60 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29  |BTCF_ValidNKey)
29f70 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
29f80 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
29f90 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ze==0 );.  if( p
29fa0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
29fb0 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
29fc0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
29fd0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
29fe0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
29ff0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a000 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2a010 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
2a020 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
2a030 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
2a040 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2a050 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a060 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2a070 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2a080 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2a090 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2a0a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2a0b0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2a0c0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
2a0d0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
2a0e0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2a0f0 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
2a100 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29  ur->skipNext<0 )
2a110 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2a120 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2a130 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2a140 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2a150 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2a160 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Next = 0;.    }.
2a170 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2a180 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2a190 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
2a1a0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2a1b0 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  t );.  if( !pPag
2a1c0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69  e->leaf ){.    i
2a1d0 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61  nt idx = pCur->a
2a1e0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2a1f0 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  ];.    rc = move
2a200 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
2a210 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
2a220 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20  pPage, idx)));. 
2a230 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2a240 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
2a250 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
2a260 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
2a270 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
2a280 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2a290 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ge]==0 ){.      
2a2a0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
2a2b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
2a2c0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2a2d0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2a2e0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
2a2f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2a300 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2a310 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
2a320 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
2a330 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
2a340 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
2a350 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2a360 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2a370 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b   & (BTCF_ValidNK
2a380 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2a390 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70  l))==0 );..    p
2a3a0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2a3b0 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70  >iPage]--;.    p
2a3c0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2a3d0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2a3e0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2a3f0 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
2a400 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2a410 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2a420 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
2a430 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
2a440 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
2a450 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2a460 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2a470 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
2a480 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
2a490 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2a4a0 70 52 65 73 29 7b 0a 20 20 61 73 73 65 72 74 28  pRes){.  assert(
2a4b0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2a4c0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2a4d0 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
2a4e0 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
2a4f0 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29  =0 || *pRes==1 )
2a500 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2a510 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2a520 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2a530 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2a540 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 70 43   *pRes = 0;.  pC
2a550 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2a560 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54  ~(BTCF_AtLast|BT
2a570 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
2a580 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20  F_ValidNKey);.  
2a590 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2a5a0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72   = 0;.  if( pCur
2a5b0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2a5c0 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75  _VALID.   || pCu
2a5d0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2a5e0 50 61 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70  Page]==0.   || p
2a5f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2a600 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d  ->iPage]->leaf==
2a610 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  0.  ){.    retur
2a620 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  n btreePrevious(
2a630 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d  pCur, pRes);.  }
2a640 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  .  pCur->aiIdx[p
2a650 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20  Cur->iPage]--;. 
2a660 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a670 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  K;.}../*.** Allo
2a680 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
2a690 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2a6a0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
2a6b0 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61  e new page is ma
2a6c0 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20  rked as dirty.  
2a6d0 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
2a6e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2a6f0 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65  te().** has alre
2a700 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2a710 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  on the new page.
2a720 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  )  The new page 
2a730 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e  has also.** been
2a740 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20   referenced and 
2a750 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
2a760 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ine is responsib
2a770 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a  le for calling.*
2a780 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  * sqlite3PagerUn
2a790 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77  ref() on the new
2a7a0 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73   page when it is
2a7b0 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   done..**.** SQL
2a7c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2a7d0 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
2a7e0 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e  Any other return
2a7f0 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
2a800 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a  .** an error.  *
2a810 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e  ppPage and *pPgn
2a820 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20  o are undefined 
2a830 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
2a840 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20  an error..** Do 
2a850 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  not invoke sqlit
2a860 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
2a870 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20  n *ppPage if an 
2a880 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
2a890 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
2a8a0 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74  "nearby" paramet
2a8b0 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65  er is not 0, the
2a8c0 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d  n an effort is m
2a8d0 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74  ade to .** locat
2a8e0 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74  e a page close t
2a8f0 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  o the page numbe
2a900 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69  r "nearby".  Thi
2a910 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e  s can be used in
2a920 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74   an.** attempt t
2a930 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70  o keep related p
2a940 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61  ages close to ea
2a950 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20  ch other in the 
2a960 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a  database file,.*
2a970 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20  * which in turn 
2a980 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73  can make databas
2a990 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e  e access faster.
2a9a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d  .**.** If the eM
2a9b0 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  ode parameter is
2a9c0 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61   BTALLOC_EXACT a
2a9d0 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20 70 61  nd the nearby pa
2a9e0 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79  ge exists.** any
2a9f0 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
2aa00 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20  e-list, then it 
2aa10 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
2aa20 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49   be returned.  I
2aa30 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54  f.** eMode is BT
2aa40 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68  ALLOC_LT then th
2aa50 65 20 70 61 67 65 20 72 65 74 75 72 6e 65 64 20  e page returned 
2aa60 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61  will be less tha
2aa70 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f  n or equal.** to
2aa80 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20 73   nearby if any s
2aa90 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 2e  uch page exists.
2aaa0 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54    If eMode is BT
2aab0 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74  ALLOC_ANY then t
2aac0 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72  here.** are no r
2aad0 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77  estrictions on w
2aae0 68 69 63 68 20 70 61 67 65 20 69 73 20 72 65 74  hich page is ret
2aaf0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
2ab00 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
2ab10 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  eePage(.  BtShar
2ab20 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
2ab30 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
2ab40 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
2ab50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f  age,      /* Sto
2ab60 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  re pointer to th
2ab70 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
2ab80 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
2ab90 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  *pPgno,         
2aba0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70    /* Store the p
2abb0 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20  age number here 
2abc0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  */.  Pgno nearby
2abd0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
2abe0 65 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65  earch for a page
2abf0 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a   near this one *
2ac00 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20  /.  u8 eMode    
2ac10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54             /* BT
2ac20 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41  ALLOC_EXACT, BTA
2ac30 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c  LLOC_LT, or BTAL
2ac40 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20  LOC_ANY */.){.  
2ac50 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
2ac60 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
2ac70 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   n;     /* Numbe
2ac80 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
2ac90 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
2aca0 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 k;     /* Nu
2acb0 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f  mber of leaves o
2acc0 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74  n the trunk of t
2acd0 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
2ace0 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
2acf0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
2ad00 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b  *pPrevTrunk = 0;
2ad10 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20  .  Pgno mxPage; 
2ad20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
2ad30 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2ad40 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  e file */..  ass
2ad50 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2ad60 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
2ad70 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2ad80 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2ad90 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30  ANY || (nearby>0
2ada0 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28   && IfNotOmitAV(
2adb0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
2adc0 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20  ) );.  pPage1 = 
2add0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d  pBt->pPage1;.  m
2ade0 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  xPage = btreePag
2adf0 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e  ecount(pBt);.  n
2ae00 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2ae10 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
2ae20 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d  .  testcase( n==
2ae30 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66  mxPage-1 );.  if
2ae40 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20  ( n>=mxPage ){. 
2ae50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ae60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2ae70 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a   }.  if( n>0 ){.
2ae80 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
2ae90 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
2aea0 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f  eelist.  Reuse o
2aeb0 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
2aec0 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  s. */.    Pgno i
2aed0 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65  Trunk;.    u8 se
2aee0 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a  archList = 0; /*
2aef0 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
2af00 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68  t must be search
2af10 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20  ed for 'nearby' 
2af20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49  */.    .    /* I
2af30 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  f eMode==BTALLOC
2af40 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65  _EXACT and a que
2af50 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
2af60 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
2af70 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
2af80 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
2af90 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
2afa0 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
2afb0 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
2afc0 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
2afd0 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
2afe0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  age..    */.#ifn
2aff0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b000 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
2b010 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
2b020 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20  C_EXACT ){.     
2b030 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50   if( nearby<=mxP
2b040 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  age ){.        u
2b050 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20  8 eType;.       
2b060 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e   assert( nearby>
2b070 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
2b080 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
2b090 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  cuum );.        
2b0a0 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
2b0b0 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79  Bt, nearby, &eTy
2b0c0 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pe, 0);.        
2b0d0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2b0e0 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rc;.        if( 
2b0f0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
2b100 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
2b110 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
2b120 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2b130 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
2b140 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
2b150 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73  OC_LE ){.      s
2b160 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
2b170 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
2b180 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
2b190 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
2b1a0 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
2b1b0 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
2b1c0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
2b1d0 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
2b1e0 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
2b1f0 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
2b200 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
2b210 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2b220 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
2b230 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2b240 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2b250 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
2b260 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
2b270 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  , n-1);..    /* 
2b280 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20  The code within 
2b290 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e  this loop is run
2b2a0 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68   only once if th
2b2b0 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76  e 'searchList' v
2b2c0 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  ariable.    ** i
2b2d0 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65  s not true. Othe
2b2e0 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f  rwise, it runs o
2b2f0 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75  nce for each tru
2b300 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20  nk-page on the. 
2b310 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20     ** free-list 
2b320 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27  until the page '
2b330 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
2b340 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  ed (eMode==BTALL
2b350 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a  OC_EXACT).    **
2b360 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65   or until a page
2b370 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72   less than 'near
2b380 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28  by' is located (
2b390 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2b3a0 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  T).    */.    do
2b3b0 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
2b3c0 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
2b3d0 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
2b3e0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54  nk ){.        iT
2b3f0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2b400 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
2b410 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ta[0]);.      }e
2b420 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72  lse{.        iTr
2b430 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2b440 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2b450 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
2b460 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75    testcase( iTru
2b470 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
2b480 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d      if( iTrunk>m
2b490 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
2b4a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2b4b0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2b4c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b4d0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2b4e0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
2b4f0 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
2b500 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2b510 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
2b520 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
2b530 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2b540 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
2b550 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2b560 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20  runk!=0 );.     
2b570 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d   assert( pTrunk-
2b580 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 0a 20 20  >aData!=0 );..  
2b590 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65      k = get4byte
2b5a0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
2b5b0 34 5d 29 3b 20 2f 2a 20 23 20 6f 66 20 6c 65 61  4]); /* # of lea
2b5c0 76 65 73 20 6f 6e 20 74 68 69 73 20 74 72 75 6e  ves on this trun
2b5d0 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  k page */.      
2b5e0 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61  if( k==0 && !sea
2b5f0 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  rchList ){.     
2b600 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
2b610 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e  has no leaves an
2b620 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f  d the list is no
2b630 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  t being searched
2b640 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  . .        ** So
2b650 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75   extract the tru
2b660 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61  nk page itself a
2b670 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65  nd use it as the
2b680 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20   newly .        
2b690 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ** allocated pag
2b6a0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
2b6b0 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d  ert( pPrevTrunk=
2b6c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
2b6d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2b6e0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
2b6f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
2b700 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2b710 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2b720 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2b730 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50     }.        *pP
2b740 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
2b750 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
2b760 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
2b770 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2b780 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
2b790 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
2b7a0 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  ;.        pTrunk
2b7b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
2b7c0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
2b7d0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
2b7e0 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
2b7f0 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
2b800 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2b810 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73   k>(u32)(pBt->us
2b820 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20  ableSize/4 - 2) 
2b830 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ){.        /* Va
2b840 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20  lue of k is out 
2b850 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62  of range.  Datab
2b860 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  ase corruption *
2b870 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
2b880 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2b890 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  PT;.        goto
2b8a0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2b8b0 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ge;.#ifndef SQLI
2b8c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2b8d0 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  UM.      }else i
2b8e0 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20  f( searchList . 
2b8f0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e             && (n
2b900 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c  earby==iTrunk ||
2b910 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20   (iTrunk<nearby 
2b920 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
2b930 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b  C_LE)) .      ){
2b940 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2b950 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65  list is being se
2b960 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20  arched and this 
2b970 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68  trunk page is th
2b980 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
2b990 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72  * to allocate, r
2b9a0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
2b9b0 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76  ther it has leav
2b9c0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
2b9d0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
2b9e0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
2b9f0 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
2ba00 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  ;.        search
2ba10 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
2ba20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2ba30 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
2ba40 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2ba50 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2ba60 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2ba70 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2ba80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ba90 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20   if( k==0 ){.   
2baa0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
2bab0 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
2bac0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
2bad0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
2bae0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2baf0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
2bb00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2bb10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2bb20 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
2bb30 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
2bb40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2bb50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2bb60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2bb70 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2bb80 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2bb90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2bba0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76     memcpy(&pPrev
2bbb0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2bbc0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2bbd0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
2bbe0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
2bbf0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2bc00 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  The trunk page i
2bc10 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
2bc20 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20  e caller but it 
2bc30 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20  contains .      
2bc40 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20      ** pointers 
2bc50 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  to free-list lea
2bc60 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c  ves. The first l
2bc70 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72  eaf becomes a tr
2bc80 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unk.          **
2bc90 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
2bca0 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  se..          */
2bcb0 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61  .          MemPa
2bcc0 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20  ge *pNewTrunk;. 
2bcd0 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e           Pgno iN
2bce0 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79  ewTrunk = get4by
2bcf0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
2bd00 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  a[8]);.         
2bd10 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d   if( iNewTrunk>m
2bd20 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20  xPage ){ .      
2bd30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2bd40 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2bd50 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2bd60 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2bd70 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
2bd80 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2bd90 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d  se( iNewTrunk==m
2bda0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
2bdb0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
2bdc0 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72  Page(pBt, iNewTr
2bdd0 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c  unk, &pNewTrunk,
2bde0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
2bdf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2be00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2be10 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2be20 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2be30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
2be40 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2be50 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e  rite(pNewTrunk->
2be60 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2be70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2be80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2be90 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2bea0 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
2beb0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2bec0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2bed0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2bee0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
2bef0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
2bf00 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
2bf10 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
2bf20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2bf30 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
2bf40 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
2bf50 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
2bf60 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
2bf70 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2bf80 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
2bf90 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
2bfa0 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
2bfb0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2bfc0 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
2bfd0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2bfe0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2bff0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31  writeable(pPage1
2c000 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2c010 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
2c020 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2c030 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
2c040 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2c050 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2c060 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2c070 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
2c080 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2c090 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
2c0a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2c0b0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2c0c0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2c0d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c0e0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72     put4byte(&pPr
2c0f0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
2c100 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
2c110 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c120 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
2c130 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
2c140 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
2c150 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
2c160 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
2c170 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
2c180 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
2c190 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29   }else if( k>0 )
2c1a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  {.        /* Ext
2c1b0 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d  ract a leaf from
2c1c0 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20   the trunk */.  
2c1d0 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73        u32 closes
2c1e0 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  t;.        Pgno 
2c1f0 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75  iPage;.        u
2c200 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
2c210 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44  ata = pTrunk->aD
2c220 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ata;.        if(
2c230 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20   nearby>0 ){.   
2c240 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20         u32 i;.  
2c250 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
2c260 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
2c270 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
2c280 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20  C_LE ){.        
2c290 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b      for(i=0; i<k
2c2a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2c2b0 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
2c2c0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
2c2d0 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  i*4]);.         
2c2e0 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 3d       if( iPage<=
2c2f0 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20  nearby ){.      
2c300 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
2c310 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
2c320 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2c330 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2c340 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c350 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c360 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73           int dis
2c370 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  t;.            d
2c380 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73  ist = sqlite3Abs
2c390 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26  Int32(get4byte(&
2c3a0 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72  aData[8]) - near
2c3b0 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  by);.           
2c3c0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69   for(i=1; i<k; i
2c3d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2c3e0 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
2c3f0 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
2c400 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
2c410 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20  4]) - nearby);. 
2c420 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2c430 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20   d2<dist ){.    
2c440 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
2c450 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
2c460 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
2c470 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
2c480 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2c490 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2c4a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c4b0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
2c4c0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
2c4d0 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
2c4e0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
2c4f0 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20  +closest*4]);.  
2c500 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c510 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
2c520 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61  .        if( iPa
2c530 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  ge>mxPage ){.   
2c540 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2c550 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2c560 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2c570 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2c580 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2c590 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2c5a0 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  Page==mxPage );.
2c5b0 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
2c5c0 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20  rchList .       
2c5d0 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61    || (iPage==nea
2c5e0 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65  rby || (iPage<ne
2c5f0 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
2c600 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
2c610 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2c620 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b    int noContent;
2c630 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e  .          *pPgn
2c640 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20  o = iPage;.     
2c650 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
2c660 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65  OCATE: %d was le
2c670 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74  af %d of %d on t
2c680 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20  runk %d".       
2c690 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20            ": %d 
2c6a0 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c  more free pages\
2c6b0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2c6c0 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f       *pPgno, clo
2c6d0 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e  sest+1, k, pTrun
2c6e0 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a  k->pgno, n-1));.
2c6f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2c700 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2c710 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
2c720 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2c730 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61   rc ) goto end_a
2c740 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2c750 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
2c760 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
2c770 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
2c780 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
2c790 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
2c7a0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
2c7b0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
2c7c0 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
2c7d0 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
2c7e0 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72  noContent = !btr
2c7f0 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeGetHasContent(
2c800 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41  pBt, *pPgno)? PA
2c810 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
2c820 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20  T : 0;.         
2c830 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
2c840 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
2c850 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  ppPage, noConten
2c860 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
2c870 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c880 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2c890 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2c8a0 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
2c8b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2c8c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2c8d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c8e0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
2c8f0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
2c900 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2c910 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c920 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
2c930 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
2c940 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
2c950 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
2c960 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  nk);.      pPrev
2c970 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  Trunk = 0;.    }
2c980 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73  while( searchLis
2c990 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
2c9a0 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
2c9b0 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  o pages on the f
2c9c0 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65  reelist, so appe
2c9d0 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  nd a new page to
2c9e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2c9f0 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20  base image..    
2ca00 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c  **.    ** Normal
2ca10 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c  ly, new pages al
2ca20 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
2ca30 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71  block can be req
2ca40 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a  uested from the.
2ca50 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79      ** pager lay
2ca60 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d  er with the 'no-
2ca70 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65  content' flag se
2ca80 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73  t. This prevents
2ca90 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
2caa0 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  * from trying to
2cab0 20 72 65 61 64 20 74 68 65 20 70 61 67 65 73 20   read the pages 
2cac0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
2cad0 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  k. However, if t
2cae0 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
2caf0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  t transaction ha
2cb00 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e  s already run on
2cb10 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d  e or more increm
2cb20 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20  ental-vacuum.   
2cb30 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20   ** steps, then 
2cb40 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
2cb50 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74  about to allocat
2cb60 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f  e may contain co
2cb70 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  ntent.    ** tha
2cb80 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  t is required in
2cb90 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
2cba0 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69  rollback. In thi
2cbb0 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a  s case, do.    *
2cbc0 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f  * not set the no
2cbd0 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54  -content flag. T
2cbe0 68 69 73 20 63 61 75 73 65 73 20 74 68 65 20 70  his causes the p
2cbf0 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64  ager to load and
2cc00 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
2cc10 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2cc20 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20   content before 
2cc30 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a  overwriting it..
2cc40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
2cc50 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
2cc60 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61  r will not actua
2cc70 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  lly attempt to l
2cc80 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a  oad or journal .
2cc90 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66      ** content f
2cca0 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  or any page that
2ccb0 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65   really does lie
2ccc0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
2ccd0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
2cce0 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73    ** file on dis
2ccf0 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63 74  k. So the effect
2cd00 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74  s of disabling t
2cd10 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70  he no-content op
2cd20 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a  timization.    *
2cd30 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69  * here are confi
2cd40 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67  ned to those pag
2cd50 65 73 20 74 68 61 74 20 6c 69 65 20 62 65 74 77  es that lie betw
2cd60 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74  een the end of t
2cd70 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2cd80 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65  se image and the
2cd90 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
2cda0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
2cdb0 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e  /.    int bNoCon
2cdc0 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74  tent = (0==IfNot
2cdd0 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54  OmitAV(pBt->bDoT
2cde0 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52  runcate))? PAGER
2cdf0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30  _GET_NOCONTENT:0
2ce00 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
2ce10 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
2ce20 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
2ce30 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
2ce40 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2ce50 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
2ce60 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
2ce70 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
2ce80 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d  PAGE(pBt) ) pBt-
2ce90 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64  >nPage++;..#ifnd
2cea0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2ceb0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2cec0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2ced0 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41  m && PTRMAP_ISPA
2cee0 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  GE(pBt, pBt->nPa
2cef0 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ge) ){.      /* 
2cf00 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73  If *pPgno refers
2cf10 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   to a pointer-ma
2cf20 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65  p page, allocate
2cf30 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20   two new pages. 
2cf40 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65       ** at the e
2cf50 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
2cf60 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54  nstead of one. T
2cf70 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74  he first allocat
2cf80 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ed page.      **
2cf90 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70   becomes a new p
2cfa0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
2cfb0 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75   the second is u
2cfc0 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
2cfd0 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
2cfe0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d    MemPage *pPg =
2cff0 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28   0;.      TRACE(
2d000 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
2d010 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
2d020 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
2d030 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67  e)\n", pBt->nPag
2d040 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e));.      asser
2d050 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50  t( pBt->nPage!=P
2d060 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2d070 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
2d080 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2d090 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
2d0a0 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65  , &pPg, bNoConte
2d0b0 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nt);.      if( r
2d0c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d0d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2d0e0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2d0f0 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
2d100 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2d110 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  e(pPg);.      }.
2d120 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2d130 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2d140 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
2d150 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
2d160 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
2d170 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42  _PAGE(pBt) ){ pB
2d180 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20  t->nPage++; }.  
2d190 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
2d1a0 75 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38  ut4byte(28 + (u8
2d1b0 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  *)pBt->pPage1->a
2d1c0 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65  Data, pBt->nPage
2d1d0 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  );.    *pPgno = 
2d1e0 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20  pBt->nPage;..   
2d1f0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
2d200 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2d210 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72  GE(pBt) );.    r
2d220 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2d230 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
2d240 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74  Page, bNoContent
2d250 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2d260 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
2d270 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2d280 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
2d290 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2d2a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d2b0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
2d2c0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
2d2d0 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
2d2e0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
2d2f0 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c  rom end of file\
2d300 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
2d310 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50  }..  assert( *pP
2d320 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
2d330 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
2d340 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2d350 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  e:.  releasePage
2d360 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65  (pTrunk);.  rele
2d370 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
2d380 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  nk);.  if( rc==S
2d390 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d3a0 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
2d3b0 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70  PageRefcount((*p
2d3c0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
2d3d0 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  >1 ){.      rele
2d3e0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
2d3f0 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20  ;.      *ppPage 
2d400 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
2d410 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2d420 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2d430 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
2d440 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  it = 0;.  }else{
2d450 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30  .    *ppPage = 0
2d460 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2d470 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
2d480 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2d490 72 69 74 65 61 62 6c 65 28 28 2a 70 70 50 61 67  riteable((*ppPag
2d4a0 65 29 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  e)->pDbPage) );.
2d4b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2d4c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2d4d0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
2d4e0 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f  dd page iPage to
2d4f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d500 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a  le free-list. .*
2d510 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
2d520 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
2d530 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70   not already a p
2d540 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d  art of the free-
2d550 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
2d560 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
2d570 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2d580 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
2d590 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c  tion is optional
2d5a0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c  ..** If the call
2d5b0 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61  er happens to ha
2d5c0 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ve a pointer to 
2d5d0 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
2d5e0 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ct .** correspon
2d5f0 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61  ding to page iPa
2d600 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79  ge handy, it may
2d610 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20   pass it as the 
2d620 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a  second value. .*
2d630 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  * Otherwise, it 
2d640 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a  may pass NULL..*
2d650 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65  *.** If a pointe
2d660 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f  r to a MemPage o
2d670 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20  bject is passed 
2d680 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
2d690 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72  gument,.** its r
2d6a0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
2d6b0 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79  s not altered by
2d6c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
2d6d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
2d6e0 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64  eePage2(BtShared
2d6f0 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a   *pBt, MemPage *
2d700 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69  pMemPage, Pgno i
2d710 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
2d720 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20   *pTrunk = 0;   
2d730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d740 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  Free-list trunk 
2d750 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  page */.  Pgno i
2d760 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
2d770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d780 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
2d790 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
2d7a0 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61  page */ .  MemPa
2d7b0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
2d7c0 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f  ->pPage1;      /
2d7d0 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63  * Local referenc
2d7e0 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20  e to page 1 */. 
2d7f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2d800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d810 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69       /* Page bei
2d820 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65  ng freed. May be
2d830 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20   NULL. */.  int 
2d840 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2d850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d860 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
2d870 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
2d880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d890 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
2d8a0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
2d8b0 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20  es on free-list 
2d8c0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
2d8d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2d8e0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2d8f0 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e    assert( iPage>
2d900 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
2d910 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d  pMemPage || pMem
2d920 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67  Page->pgno==iPag
2d930 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d  e );..  if( pMem
2d940 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
2d950 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20  e = pMemPage;.  
2d960 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
2d970 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
2d980 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2d990 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
2d9a0 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61  eLookup(pBt, iPa
2d9b0 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ge);.  }..  /* I
2d9c0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
2d9d0 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
2d9e0 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
2d9f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2da00 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
2da10 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
2da20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2da30 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74  t;.  nFree = get
2da40 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2da50 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
2da60 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2da70 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b  Data[36], nFree+
2da80 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e  1);..  if( pBt->
2da90 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
2daa0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
2dab0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
2dac0 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69  cure_delete opti
2dad0 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  on is enabled, t
2dae0 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  hen.    ** alway
2daf0 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74  s fully overwrit
2db00 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
2db10 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
2db20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2db30 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63   (!pPage && ((rc
2db40 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2db50 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
2db60 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20  ge, 0))!=0) ).  
2db70 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20     ||           
2db80 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50   ((rc = sqlite3P
2db90 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2dba0 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20  >pDbPage))!=0). 
2dbb0 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
2dbc0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2dbd0 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
2dbe0 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
2dbf0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
2dc00 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
2dc10 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2dc20 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
2dc30 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e  vacuum, write an
2dc40 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
2dc50 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74  inter-map.  ** t
2dc60 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
2dc70 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65  the page is free
2dc80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  ..  */.  if( ISA
2dc90 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2dca0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2dcb0 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  iPage, PTRMAP_FR
2dcc0 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b  EEPAGE, 0, &rc);
2dcd0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2dce0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
2dcf0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d  .  }..  /* Now m
2dd00 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63  anipulate the ac
2dd10 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72  tual database fr
2dd20 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72  ee-list structur
2dd30 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  e. There are two
2dd40 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74  .  ** possibilit
2dd50 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65  ies. If the free
2dd60 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74  -list is current
2dd70 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20  ly empty, or if 
2dd80 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
2dd90 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
2dda0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
2ddb0 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ll, then this pa
2ddc0 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  ge will become a
2ddd0 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c  .  ** new free-l
2dde0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
2ddf0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69  Otherwise, it wi
2de00 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66  ll become a leaf
2de10 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72   of the.  ** fir
2de20 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
2de30 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65   the current fre
2de40 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f  e-list. This blo
2de50 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20  ck tests if it. 
2de60 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
2de70 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20  to add the page 
2de80 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69  as a new free-li
2de90 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20  st leaf..  */.  
2dea0 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a  if( nFree!=0 ){.
2deb0 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20      u32 nLeaf;  
2dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ded0 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
2dee0 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e  of leaf cells on
2def0 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a   trunk page */..
2df00 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
2df10 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2df20 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72  Data[32]);.    r
2df30 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2df40 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
2df50 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69  Trunk, 0);.    i
2df60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2df70 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
2df80 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
2df90 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20   }..    nLeaf = 
2dfa0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
2dfb0 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
2dfc0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
2dfd0 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20  ableSize>32 );. 
2dfe0 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28     if( nLeaf > (
2dff0 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
2e000 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20  ize/4 - 2 ){.   
2e010 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2e020 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2e030 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2e040 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
2e050 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32  if( nLeaf < (u32
2e060 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
2e070 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
2e080 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
2e090 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e  there is room on
2e0a0 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
2e0b0 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61  to insert the pa
2e0c0 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  ge.      ** bein
2e0d0 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77  g freed as a new
2e0e0 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a   leaf..      **.
2e0f0 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
2e100 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  at the trunk pag
2e110 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
2e120 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f  full until it co
2e130 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
2e140 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
2e150 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73   entries, not us
2e160 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
2e170 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76  ntries as we hav
2e180 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64  e.      ** coded
2e190 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20  .  But due to a 
2e1a0 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20  coding error in 
2e1b0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
2e1c0 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  te prior to.    
2e1d0 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61    ** 3.6.0, data
2e1e0 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c  bases with freel
2e1f0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20  ist trunk pages 
2e200 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61  holding more tha
2e210 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  n.      ** usabl
2e220 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
2e230 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ies will be repo
2e240 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e  rted as corrupt.
2e250 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20    In order.     
2e260 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20   ** to maintain 
2e270 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
2e280 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
2e290 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
2e2a0 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20  QLite,.      ** 
2e2b0 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
2e2c0 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65   to restrict the
2e2d0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
2e2e0 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65  es to usableSize
2e2f0 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20  /4 - 8.      ** 
2e300 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d  for now.  At som
2e310 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
2e320 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72  uture (once ever
2e330 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65  yone has upgrade
2e340 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e  d.      ** to 3.
2e350 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65  6.0 or later) we
2e360 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72   should consider
2e370 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64   fixing the cond
2e380 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20  itional above.  
2e390 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22      ** to read "
2e3a0 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20  usableSize/4-2" 
2e3b0 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62  instead of "usab
2e3c0 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20  leSize/4-8"..   
2e3d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2e3e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2e3f0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
2e400 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2e410 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e420 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
2e430 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
2e440 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20  4], nLeaf+1);.  
2e450 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2e460 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b  pTrunk->aData[8+
2e470 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29  nLeaf*4], iPage)
2e480 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
2e490 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73  age && (pBt->bts
2e4a0 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
2e4b0 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b  RE_DELETE)==0 ){
2e4c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2e4d0 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
2e4e0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2e4f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e500 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65      rc = btreeSe
2e510 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
2e520 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d   iPage);.      }
2e530 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46  .      TRACE(("F
2e540 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61  REE-PAGE: %d lea
2e550 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  f on trunk page 
2e560 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e  %d\n",pPage->pgn
2e570 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29  o,pTrunk->pgno))
2e580 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
2e590 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
2e5a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f  .  }..  /* If co
2e5b0 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74  ntrol flows to t
2e5c0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
2e5d0 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69  it was not possi
2e5e0 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20  ble to add the. 
2e5f0 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69   ** the page bei
2e600 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65  ng freed as a le
2e610 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  af page of the f
2e620 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
2e630 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
2e640 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75  * Possibly becau
2e650 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  se the free-list
2e660 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f   is empty, or po
2e670 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
2e680 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  he .  ** first t
2e690 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
2e6a0 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45  -list is full. E
2e6b0 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70  ither way, the p
2e6c0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a  age being freed.
2e6d0 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65    ** will become
2e6e0 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74   the new first t
2e6f0 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
2e700 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f   free-list..  */
2e710 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20  .  if( pPage==0 
2e720 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
2e730 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2e740 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
2e750 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  age, 0)) ){.    
2e760 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2e770 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  t;.  }.  rc = sq
2e780 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2e790 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2e7a0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2e7b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
2e7c0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2e7d0 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50   }.  put4byte(pP
2e7e0 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75  age->aData, iTru
2e7f0 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  nk);.  put4byte(
2e800 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d  &pPage->aData[4]
2e810 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65  , 0);.  put4byte
2e820 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2e830 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54  32], iPage);.  T
2e840 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
2e850 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70  : %d new trunk p
2e860 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64  age replacing %d
2e870 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
2e880 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65  , iTrunk));..fre
2e890 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  epage_out:.  if(
2e8a0 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50   pPage ){.    pP
2e8b0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
2e8c0 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
2e8d0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c  ge(pPage);.  rel
2e8e0 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
2e8f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2e900 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
2e910 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
2e920 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b  Page, int *pRC){
2e930 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53  .  if( (*pRC)==S
2e940 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e950 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32  *pRC = freePage2
2e960 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61  (pPage->pBt, pPa
2e970 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  ge, pPage->pgno)
2e980 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
2e990 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ree any overflow
2e9a0 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65   pages associate
2e9b0 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
2e9c0 20 43 65 6c 6c 2e 20 20 57 72 69 74 65 20 74 68   Cell.  Write th
2e9d0 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20  e.** local Cell 
2e9e0 73 69 7a 65 20 28 74 68 65 20 6e 75 6d 62 65 72  size (the number
2e9f0 20 6f 66 20 62 79 74 65 73 20 6f 6e 20 74 68 65   of bytes on the
2ea00 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2c 20   original page, 
2ea10 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72  omitting.** over
2ea20 66 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69  flow) into *pnSi
2ea30 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
2ea40 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d  t clearCell(.  M
2ea50 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
2ea60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
2ea70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
2ea80 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20  s the Cell */.  
2ea90 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2eaa0 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73  Cell,    /* Firs
2eab0 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65  t byte of the Ce
2eac0 6c 6c 20 2a 2f 0a 20 20 75 31 36 20 2a 70 6e 53  ll */.  u16 *pnS
2ead0 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
2eae0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 69   /* Write the si
2eaf0 7a 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 68  ze of the Cell h
2eb00 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  ere */.){.  BtSh
2eb10 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
2eb20 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e  e->pBt;.  CellIn
2eb30 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20  fo info;.  Pgno 
2eb40 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  ovflPgno;.  int 
2eb50 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b  rc;.  int nOvfl;
2eb60 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53  .  u32 ovflPageS
2eb70 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ize;..  assert( 
2eb80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2eb90 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
2eba0 75 74 65 78 29 20 29 3b 0a 20 20 62 74 72 65 65  utex) );.  btree
2ebb0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
2ebc0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
2ebd0 29 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69  );.  *pnSize = i
2ebe0 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 69 66 28  nfo.nSize;.  if(
2ebf0 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d   info.iOverflow=
2ec00 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2ec10 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
2ec20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
2ec30 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
2ec40 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
2ec50 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   */.  }.  if( pC
2ec60 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell+info.iOverfl
2ec70 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61 44  ow+3 > pPage->aD
2ec80 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ata+pPage->maskP
2ec90 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
2eca0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2ecb0 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20  _BKPT;  /* Cell 
2ecc0 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64  extends past end
2ecd0 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a   of page */.  }.
2ece0 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
2ecf0 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
2ed00 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
2ed10 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
2ed20 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a  ableSize > 4 );.
2ed30 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d    ovflPageSize =
2ed40 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2ed50 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20   - 4;.  nOvfl = 
2ed60 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d  (info.nPayload -
2ed70 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f   info.nLocal + o
2ed80 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29  vflPageSize - 1)
2ed90 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20  /ovflPageSize;. 
2eda0 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e   assert( ovflPgn
2edb0 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20  o==0 || nOvfl>0 
2edc0 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
2edd0 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
2ede0 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
2edf0 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
2ee00 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
2ee10 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
2ee20 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
2ee30 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
2ee40 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
2ee50 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
2ee60 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
2ee70 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
2ee80 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
2ee90 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
2eea0 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
2eeb0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
2eec0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
2eed0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
2eee0 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
2eef0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2ef00 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2ef10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
2ef20 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
2ef30 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
2ef40 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
2ef50 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
2ef60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2ef70 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2ef80 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f   }..    if( ( pO
2ef90 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d  vfl || ((pOvfl =
2efa0 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
2efb0 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29  (pBt, ovflPgno))
2efc0 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73  !=0) ).     && s
2efd0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
2efe0 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70  efcount(pOvfl->p
2eff0 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29  DbPage)!=1.    )
2f000 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
2f010 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e   is no reason an
2f020 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20  y cursor should 
2f030 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64  have an outstand
2f040 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20  ing reference . 
2f050 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76       ** to an ov
2f060 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f  erflow page belo
2f070 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20  nging to a cell 
2f080 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
2f090 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20  leted/updated.. 
2f0a0 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68       ** So if th
2f0b0 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20  ere exists more 
2f0c0 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
2f0d0 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c  ce to this page,
2f0e0 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20   then it .      
2f0f0 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c  ** must not real
2f100 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ly be an overflo
2f110 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64  w page and the d
2f120 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
2f130 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20  corrupt. .      
2f140 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c  ** It is helpful
2f150 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   to detect this 
2f160 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66  before calling f
2f170 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a  reePage2(), as .
2f180 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67        ** freePag
2f190 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68  e2() may zero th
2f1a0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
2f1b0 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  if secure-delete
2f1c0 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a   mode is.      *
2f1d0 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68  * enabled. If th
2f1e0 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61  is 'overflow' pa
2f1f0 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
2f200 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65   a page that the
2f210 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
2f220 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68   is iterating th
2f230 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69  rough or using i
2f240 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79  n some other way
2f250 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  , this.      ** 
2f260 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74  can be problemat
2f270 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
2f280 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2f290 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2f2a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2f2b0 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
2f2c0 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
2f2d0 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  o);.    }..    i
2f2e0 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( pOvfl ){.    
2f2f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2f300 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
2f310 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
2f320 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2f330 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
2f340 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  = iNext;.  }.  r
2f350 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
2f370 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
2f380 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
2f390 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
2f3a0 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
2f3b0 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
2f3c0 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
2f3d0 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
2f3e0 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
2f3f0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
2f400 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
2f410 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
2f420 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
2f430 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
2f440 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
2f450 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
2f460 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
2f470 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
2f480 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
2f490 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
2f4a0 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
2f4b0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
2f4c0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
2f4d0 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
2f4e0 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
2f4f0 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
2f500 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
2f510 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
2f520 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
2f530 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
2f540 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
2f550 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
2f560 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2f570 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
2f580 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f5a0 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
2f5b0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
2f5c0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
2f5d0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
2f5e0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
2f5f0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
2f600 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
2f610 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
2f620 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
2f630 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
2f640 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
2f650 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
2f660 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  a */.  int nZero
2f670 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f680 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a        /* Extra z
2f690 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70  ero bytes to app
2f6a0 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a  end to pData */.
2f6b0 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
2f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6d0 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
2f6e0 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
2f6f0 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
2f700 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
2f710 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
2f720 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
2f730 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
2f740 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
2f750 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
2f760 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
2f770 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
2f780 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2f790 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
2f7a0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
2f7b0 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
2f7c0 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
2f7d0 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61  nt nHeader;..  a
2f7e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2f7f0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2f800 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2f810 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e  .  /* pPage is n
2f820 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
2f830 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70  riteable since p
2f840 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75  Cell might be au
2f850 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66  xiliary.  ** buf
2f860 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69  fer space that i
2f870 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20  s separate from 
2f880 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72  the pPage buffer
2f890 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72   area */.  asser
2f8a0 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e  t( pCell<pPage->
2f8b0 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d  aData || pCell>=
2f8c0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
2f8d0 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
2f8e0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
2f8f0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2f900 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2f910 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
2f920 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
2f930 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
2f940 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
2f950 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20  ize;.  nPayload 
2f960 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b  = nData + nZero;
2f970 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
2f980 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20  tKeyLeaf ){.    
2f990 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
2f9a0 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48  rint32(&pCell[nH
2f9b0 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64  eader], nPayload
2f9c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2f9d0 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 30  assert( nData==0
2f9e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2f9f0 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nZero==0 );.  }.
2fa00 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
2fa10 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
2fa20 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
2fa30 6e 4b 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  nKey);.  .  /* F
2fa40 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
2fa50 61 64 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28  ad size */.  if(
2fa60 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
2fa70 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
2fa80 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
2fa90 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
2faa0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  = 0;.  }else{ . 
2fab0 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65     if( NEVER(nKe
2fac0 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20  y>0x7fffffff || 
2fad0 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20  pKey==0) ){.    
2fae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2faf0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2fb00 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
2fb10 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20   = (int)nKey;.  
2fb20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
2fb30 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e     nSrc = (int)n
2fb40 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  Key;.  }.  if( n
2fb50 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
2fb60 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
2fb70 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50  n = nHeader + nP
2fb80 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74  ayload;.    test
2fb90 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20  case( n==3 );.  
2fba0 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34    testcase( n==4
2fbb0 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20   );.    if( n<4 
2fbc0 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e  ) n = 4;.    *pn
2fbd0 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70  Size = n;.    sp
2fbe0 61 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f  aceLeft = nPaylo
2fbf0 61 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d  ad;.    pPrior =
2fc00 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b   pCell;.  }else{
2fc10 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50  .    int mn = pP
2fc20 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
2fc30 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61     n = mn + (nPa
2fc40 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70  yload - mn) % (p
2fc50 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2fc60 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
2fc70 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61  testcase( n==pPa
2fc80 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
2fc90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
2fca0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
2fcb0 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 20  +1 );.    if( n 
2fcc0 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  > pPage->maxLoca
2fcd0 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20  l ) n = mn;.    
2fce0 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20  spaceLeft = n;. 
2fcf0 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b     *pnSize = n +
2fd00 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20   nHeader + 4;.  
2fd10 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c    pPrior = &pCel
2fd20 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20  l[nHeader+n];.  
2fd30 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26  }.  pPayload = &
2fd40 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a  pCell[nHeader];.
2fd50 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
2fd60 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73 68  int variables sh
2fd70 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20 66  ould be set as f
2fd80 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
2fd90 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20  *   nPayload    
2fda0 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79         Total pay
2fdb0 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74  load size in byt
2fdc0 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f  es.  **   pPaylo
2fdd0 61 64 20 20 20 20 20 20 20 20 20 20 20 42 65 67  ad           Beg
2fde0 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f  in writing paylo
2fdf0 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73  ad here.  **   s
2fe00 70 61 63 65 4c 65 66 74 20 20 20 20 20 20 20 20  paceLeft        
2fe10 20 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c    Space availabl
2fe20 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20  e at pPayload.  
2fe30 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63  If nPayload>spac
2fe40 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20  eLeft,.  **     
2fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe60 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74   that means cont
2fe70 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69  ent must spill i
2fe80 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
2fe90 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69  es..  **   *pnSi
2fea0 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 53 69  ze            Si
2feb0 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20  ze of the local 
2fec0 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69  cell (not counti
2fed0 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ng overflow page
2fee0 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72  s).  **   pPrior
2fef0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65               Whe
2ff00 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  re to write the 
2ff10 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73  pgno of the firs
2ff20 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  t overflow page.
2ff30 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20    **.  ** Use a 
2ff40 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72  call to btreePar
2ff50 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76  seCellPtr() to v
2ff60 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 76  erify that the v
2ff70 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a  alues above.  **
2ff80 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63   were computed c
2ff90 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23  orrectly..  */.#
2ffa0 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
2ffb0 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f    {.    CellInfo
2ffc0 20 69 6e 66 6f 3b 0a 20 20 20 20 62 74 72 65 65   info;.    btree
2ffd0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
2ffe0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
2fff0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
30000 48 65 61 64 65 72 3d 28 69 6e 74 29 28 69 6e 66  Header=(int)(inf
30010 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65  o.pPayload - pCe
30020 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ll) );.    asser
30030 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b  t( info.nKey==nK
30040 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ey );.    assert
30050 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66  ( *pnSize == inf
30060 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  o.nSize );.    a
30070 73 73 65 72 74 28 20 73 70 61 63 65 4c 65 66 74  ssert( spaceLeft
30080 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20   == info.nLocal 
30090 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
300a0 50 72 69 6f 72 20 3d 3d 20 26 70 43 65 6c 6c 5b  Prior == &pCell[
300b0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 20  info.iOverflow] 
300c0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
300d0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
300e0 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c  yload into the l
300f0 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e  ocal Cell and an
30100 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65  y extra into ove
30110 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20  rflow pages */. 
30120 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
30130 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
30140 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69  aceLeft==0 ){.#i
30150 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30160 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
30170 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d     Pgno pgnoPtrm
30180 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f  ap = pgnoOvfl; /
30190 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
301a0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
301b0 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  y page */.      
301c0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
301d0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64  uum ){.        d
301e0 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e  o{.          pgn
301f0 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  oOvfl++;.       
30200 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20   } while( .     
30210 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41       PTRMAP_ISPA
30220 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  GE(pBt, pgnoOvfl
30230 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50  ) || pgnoOvfl==P
30240 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
30250 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29  (pBt) .        )
30260 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
30270 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
30280 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
30290 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f  t, &pOvfl, &pgno
302a0 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  Ovfl, pgnoOvfl, 
302b0 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
302c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
302d0 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
302e0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
302f0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
30300 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
30310 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
30320 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
30330 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
30340 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
30350 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
30360 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
30370 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
30380 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
30390 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
303a0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
303b0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
303c0 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
303d0 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
303e0 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
303f0 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
30400 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
30410 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
30420 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
30430 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
30440 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
30450 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
30460 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
30470 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
30480 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
30490 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lized values and
304a0 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
304b0 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
304c0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
304d0 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
304e0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
304f0 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
30500 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30510 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
30520 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
30530 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
30540 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
30550 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
30560 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
30570 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
30580 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
30590 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
305a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
305b0 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
305c0 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
305d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
305e0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
305f0 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
30600 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
30610 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
30620 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
30630 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
30640 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
30650 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
30660 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
30670 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
30680 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
30690 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
306a0 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
306b0 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
306c0 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
306d0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
306e0 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
306f0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
30700 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
30710 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
30720 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
30730 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
30740 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
30750 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
30760 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
30770 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
30780 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
30790 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
307a0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
307b0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
307c0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
307d0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
307e0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
307f0 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
30800 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
30810 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
30820 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
30830 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
30840 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
30850 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
30860 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
30870 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
30880 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
30890 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
308a0 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
308b0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
308c0 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
308d0 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
308e0 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
308f0 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
30900 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eft;..    /* If 
30910 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
30920 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79  t zero than pPay
30930 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f  load points into
30940 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
30950 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
30960 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
30970 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
30980 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
30990 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  /.    assert( pT
309a0 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
309b0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
309c0 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
309d0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
309e0 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f      /* If pPaylo
309f0 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ad is part of th
30a00 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
30a10 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
30a20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a  sure pPage.    *
30a30 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
30a40 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  able */.    asse
30a50 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61  rt( pPayload<pPa
30a60 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61  ge->aData || pPa
30a70 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61  yload>=&pPage->a
30a80 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
30a90 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
30aa0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
30ab0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
30ac0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
30ad0 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
30ae0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
30af0 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
30b00 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
30b10 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
30b20 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
30b30 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
30b40 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
30b50 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
30b60 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
30b70 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
30b80 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
30b90 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
30ba0 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
30bb0 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
30bc0 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
30bd0 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
30be0 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
30bf0 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
30c00 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
30c10 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
30c20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
30c30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
30c40 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
30c50 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
30c60 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
30c70 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
30c80 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
30c90 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
30ca0 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
30cb0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
30cc0 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
30cd0 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
30ce0 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
30cf0 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
30d00 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
30d10 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
30d20 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
30d30 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
30d40 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
30d50 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
30d60 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
30d70 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70  static void drop
30d80 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
30d90 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
30da0 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b  t sz, int *pRC){
30db0 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20  .  u32 pc;      
30dc0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
30dd0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
30de0 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
30df0 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
30e00 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
30e10 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
30e20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
30e30 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
30e40 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
30e50 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
30e60 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
30e70 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
30e80 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
30e90 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
30ea0 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e  g of the header.
30eb0 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20    0 most pages. 
30ec0 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a   100 page 1 */..
30ed0 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
30ee0 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
30ef0 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
30f00 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
30f10 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
30f20 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29  Size(pPage, idx)
30f30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
30f40 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
30f50 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
30f60 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
30f70 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
30f80 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
30f90 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61  ->mutex) );.  da
30fa0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
30fb0 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67  a;.  ptr = &pPag
30fc0 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64  e->aCellIdx[2*id
30fd0 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62  x];.  pc = get2b
30fe0 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20  yte(ptr);.  hdr 
30ff0 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
31000 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  et;.  testcase( 
31010 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  pc==get2byte(&da
31020 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20  ta[hdr+5]) );.  
31030 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d  testcase( pc+sz=
31040 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
31050 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28  bleSize );.  if(
31060 20 70 63 20 3c 20 28 75 33 32 29 67 65 74 32 62   pc < (u32)get2b
31070 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
31080 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61  ) || pc+sz > pPa
31090 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
310a0 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ize ){.    *pRC 
310b0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
310c0 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
310d0 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72  n;.  }.  rc = fr
310e0 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70  eeSpace(pPage, p
310f0 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63  c, sz);.  if( rc
31100 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
31110 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
31120 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c   }.  pPage->nCel
31130 6c 2d 2d 3b 0a 20 20 6d 65 6d 6d 6f 76 65 28 70  l--;.  memmove(p
31140 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50  tr, ptr+2, 2*(pP
31150 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78  age->nCell - idx
31160 29 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  ));.  put2byte(&
31170 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
31180 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50  ge->nCell);.  pP
31190 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b  age->nFree += 2;
311a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
311b0 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
311c0 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
311d0 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
311e0 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
311f0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
31200 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
31210 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
31220 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
31230 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
31240 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
31250 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
31260 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
31270 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
31280 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
31290 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
312a0 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
312b0 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
312c0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
312d0 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
312e0 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  >apOvfl[] and ma
312f0 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
31300 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
31310 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
31320 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
31330 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
31340 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
31350 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
31360 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
31370 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
31380 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
31390 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
313a0 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
313b0 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
313c0 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  oid insertCell(.
313d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
313e0 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
313f0 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
31400 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
31410 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
31420 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
31430 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
31440 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
31450 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
31460 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
31470 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
31480 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
31490 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
314a0 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
314b0 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
314c0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
314d0 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
314e0 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
314f0 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  ed */.  Pgno iCh
31500 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20  ild,      /* If 
31510 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63  non-zero, replac
31520 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
31530 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20  with this value 
31540 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20  */.  int *pRC   
31550 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61         /* Read a
31560 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e 20  nd write return 
31570 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a  code from here *
31580 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d  /.){.  int idx =
31590 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72   0;      /* Wher
315a0 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63  e to write new c
315b0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64  ell content in d
315c0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a  ata[] */.  int j
315d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
315e0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
315f0 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20    int end;      
31600 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
31610 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  e past the last 
31620 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
31630 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
31640 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ins;          /*
31650 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d   Index in data[]
31660 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20   where new cell 
31670 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72  pointer is inser
31680 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ted */.  int cel
31690 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64  lOffset;   /* Ad
316a0 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63  dress of first c
316b0 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
316c0 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64  ata[] */.  u8 *d
316d0 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
316e0 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
316f0 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
31700 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
31710 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
31720 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61  ( i>=0 && i<=pPa
31730 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d  ge->nCell+pPage-
31740 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20  >nOverflow );.  
31750 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28  assert( MX_CELL(
31760 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39  pPage->pBt)<=109
31770 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  21 );.  assert( 
31780 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58  pPage->nCell<=MX
31790 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
317a0 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  ) || CORRUPT_DB 
317b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
317c0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41  ge->nOverflow<=A
317d0 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
317e0 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  apOvfl) );.  ass
317f0 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70  ert( ArraySize(p
31800 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41  Page->apOvfl)==A
31810 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
31820 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  aiOvfl) );.  ass
31830 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
31840 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
31850 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
31860 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75  /* The cell shou
31870 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73  ld normally be s
31880 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20  ized correctly. 
31890 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d   However, when m
318a0 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c  oving a.  ** mal
318b0 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d  formed cell from
318c0 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20   a leaf page to 
318d0 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65  an interior page
318e0 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69  , if the cell si
318f0 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74  ze.  ** wanted t
31900 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34  o be less than 4
31910 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64   but got rounded
31920 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20   up to 4 on the 
31930 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a  leaf, then size.
31940 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65    ** might be le
31950 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d  ss than 8 (leaf-
31960 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20  size + pointer) 
31970 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20  on the interior 
31980 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a  node.  Hence.  *
31990 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72  * the term after
319a0 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66   the || in the f
319b0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
319c0 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ). */.  assert( 
319d0 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  sz==cellSizePtr(
319e0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c  pPage, pCell) ||
319f0 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c   (sz==8 && iChil
31a00 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  d>0) );.  if( pP
31a10 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c  age->nOverflow |
31a20 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46  | sz+2>pPage->nF
31a30 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ree ){.    if( p
31a40 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  Temp ){.      me
31a50 6d 63 70 79 28 70 54 65 6d 70 2c 20 70 43 65 6c  mcpy(pTemp, pCel
31a60 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 70 43  l, sz);.      pC
31a70 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
31a80 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c   }.    if( iChil
31a90 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
31aa0 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c  yte(pCell, iChil
31ab0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20  d);.    }.    j 
31ac0 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
31ad0 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ow++;.    assert
31ae0 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66  ( j<(int)(sizeof
31af0 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f  (pPage->apOvfl)/
31b00 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70  sizeof(pPage->ap
31b10 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20  Ovfl[0])) );.   
31b20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a   pPage->apOvfl[j
31b30 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70  ] = pCell;.    p
31b40 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20  Page->aiOvfl[j] 
31b50 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73  = (u16)i;.  }els
31b60 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
31b70 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
31b80 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
31b90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
31ba0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31bb0 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
31bc0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
31bd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
31be0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
31bf0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
31c00 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61  age) );.    data
31c10 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
31c20 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  .    cellOffset 
31c30 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
31c40 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63  set;.    end = c
31c50 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
31c60 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
31c70 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  ins = cellOffset
31c80 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d   + 2*i;.    rc =
31c90 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
31ca0 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b  Page, sz, &idx);
31cb0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a  .    if( rc ){ *
31cc0 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e  pRC = rc; return
31cd0 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61  ; }.    /* The a
31ce0 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72  llocateSpace() r
31cf0 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65  outine guarantee
31d00 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
31d10 74 77 6f 20 70 72 6f 70 65 72 74 69 65 73 0a 20  two properties. 
31d20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75     ** if it retu
31d30 72 6e 73 20 73 75 63 63 65 73 73 20 2a 2f 0a 20  rns success */. 
31d40 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e     assert( idx >
31d50 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61  = end+2 );.    a
31d60 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d  ssert( idx+sz <=
31d70 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74   (int)pPage->pBt
31d80 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
31d90 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
31da0 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  ++;.    pPage->n
31db0 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20  Free -= (u16)(2 
31dc0 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70  + sz);.    memcp
31dd0 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 70 43  y(&data[idx], pC
31de0 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 69 66  ell, sz);.    if
31df0 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
31e00 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
31e10 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a  [idx], iChild);.
31e20 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 6d 6f 76      }.    memmov
31e30 65 28 26 64 61 74 61 5b 69 6e 73 2b 32 5d 2c 20  e(&data[ins+2], 
31e40 26 64 61 74 61 5b 69 6e 73 5d 2c 20 65 6e 64 2d  &data[ins], end-
31e50 69 6e 73 29 3b 0a 20 20 20 20 70 75 74 32 62 79  ins);.    put2by
31e60 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69  te(&data[ins], i
31e70 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  dx);.    put2byt
31e80 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68  e(&data[pPage->h
31e90 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61  drOffset+3], pPa
31ea0 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e  ge->nCell);.#ifn
31eb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31ec0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
31ed0 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61  f( pPage->pBt->a
31ee0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
31ef0 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d     /* The cell m
31f00 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69  ay contain a poi
31f10 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
31f20 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c  low page. If so,
31f30 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
31f40 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
31f50 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
31f60 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
31f70 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   map..      */. 
31f80 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
31f90 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
31fa0 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a  ll, pRC);.    }.
31fb0 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
31fc0 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c  .** Array apCell
31fd0 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e  [] contains poin
31fe0 74 65 72 73 20 74 6f 20 6e 43 65 6c 6c 20 62 2d  ters to nCell b-
31ff0 74 72 65 65 20 70 61 67 65 20 63 65 6c 6c 73 2e  tree page cells.
32000 20 54 68 65 20 0a 2a 2a 20 73 7a 43 65 6c 6c 5b   The .** szCell[
32010 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
32020 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74   the size in byt
32030 65 73 20 6f 66 20 65 61 63 68 20 63 65 6c 6c 2e  es of each cell.
32040 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
32050 2a 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 63  * replaces the c
32060 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
32070 6f 66 20 70 61 67 65 20 70 50 67 20 77 69 74 68  of page pPg with
32080 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
32090 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 61 72 72   the cell.** arr
320a0 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f  ay..**.** Some o
320b0 66 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 61  f the cells in a
320c0 70 43 65 6c 6c 5b 5d 20 6d 61 79 20 63 75 72 72  pCell[] may curr
320d0 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ently be stored 
320e0 69 6e 20 70 50 67 2e 20 54 68 69 73 0a 2a 2a 20  in pPg. This.** 
320f0 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 61  function works a
32100 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63  round problems c
32110 61 75 73 65 64 20 62 79 20 74 68 69 73 20 62 79  aused by this by
32120 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 20 6f   making a copy o
32130 66 20 61 6e 79 20 0a 2a 2a 20 73 75 63 68 20 63  f any .** such c
32140 65 6c 6c 73 20 62 65 66 6f 72 65 20 6f 76 65 72  ells before over
32150 77 72 69 74 69 6e 67 20 74 68 65 20 70 61 67 65  writing the page
32160 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   data..**.** The
32170 20 4d 65 6d 50 61 67 65 2e 6e 46 72 65 65 20 66   MemPage.nFree f
32180 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 61  ield is invalida
32190 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
321a0 74 69 6f 6e 2e 20 49 74 20 69 73 20 74 68 65 20  tion. It is the 
321b0 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  .** responsibili
321c0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
321d0 20 74 6f 20 73 65 74 20 69 74 20 63 6f 72 72 65   to set it corre
321e0 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ctly..*/.static 
321f0 76 6f 69 64 20 72 65 62 75 69 6c 64 50 61 67 65  void rebuildPage
32200 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67  (.  MemPage *pPg
32210 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32220 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68 69 73      /* Edit this
32230 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   page */.  int n
32240 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
32250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
32260 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  nal number of ce
32270 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20  lls on page */. 
32280 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
32290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
322a0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
322b0 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43  ls */.  u16 *szC
322c0 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  ell             
322d0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
322e0 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a   of cell sizes *
322f0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  /.){.  const int
32300 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f   hdr = pPg->hdrO
32310 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
32320 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
32330 64 65 72 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20  der on pPg */.  
32340 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61  u8 * const aData
32350 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 20 20   = pPg->aData;  
32360 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
32370 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20  ter to data for 
32380 70 50 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  pPg */.  const i
32390 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  nt usableSize = 
323a0 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  pPg->pBt->usable
323b0 53 69 7a 65 3b 0a 20 20 75 38 20 2a 20 63 6f 6e  Size;.  u8 * con
323c0 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74 61  st pEnd = &aData
323d0 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  [usableSize];.  
323e0 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70 43 65  int i;.  u8 *pCe
323f0 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61 43 65  llptr = pPg->aCe
32400 6c 6c 49 64 78 3b 0a 20 20 75 38 20 2a 70 54 6d  llIdx;.  u8 *pTm
32410 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
32420 54 65 6d 70 53 70 61 63 65 28 70 50 67 2d 3e 70  TempSpace(pPg->p
32430 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 75  Bt->pPager);.  u
32440 38 20 2a 70 44 61 74 61 3b 0a 0a 20 20 69 20 3d  8 *pData;..  i =
32450 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
32460 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
32470 70 79 28 26 70 54 6d 70 5b 69 5d 2c 20 26 61 44  py(&pTmp[i], &aD
32480 61 74 61 5b 69 5d 2c 20 75 73 61 62 6c 65 53 69  ata[i], usableSi
32490 7a 65 20 2d 20 69 29 3b 0a 0a 20 20 70 44 61 74  ze - i);..  pDat
324a0 61 20 3d 20 70 45 6e 64 3b 0a 20 20 66 6f 72 28  a = pEnd;.  for(
324b0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
324c0 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
324d0 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20  l = apCell[i];. 
324e0 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 61 44 61     if( pCell>aDa
324f0 74 61 20 26 26 20 70 43 65 6c 6c 3c 70 45 6e 64  ta && pCell<pEnd
32500 20 29 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20   ){.      pCell 
32510 3d 20 26 70 54 6d 70 5b 70 43 65 6c 6c 20 2d 20  = &pTmp[pCell - 
32520 61 44 61 74 61 5d 3b 0a 20 20 20 20 7d 0a 20 20  aData];.    }.  
32530 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 43 65 6c    pData -= szCel
32540 6c 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  l[i];.    memcpy
32550 28 70 44 61 74 61 2c 20 70 43 65 6c 6c 2c 20 73  (pData, pCell, s
32560 7a 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 70  zCell[i]);.    p
32570 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72  ut2byte(pCellptr
32580 2c 20 28 70 44 61 74 61 20 2d 20 61 44 61 74 61  , (pData - aData
32590 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72  ));.    pCellptr
325a0 20 2b 3d 20 32 3b 0a 20 20 20 20 61 73 73 65 72   += 2;.    asser
325b0 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d 63 65  t( szCell[i]==ce
325c0 6c 6c 53 69 7a 65 50 74 72 28 70 50 67 2c 20 70  llSizePtr(pPg, p
325d0 43 65 6c 6c 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  Cell) );.  }..  
325e0 2f 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65  /* The pPg->nFre
325f0 65 20 66 69 65 6c 64 20 69 73 20 6e 6f 77 20 73  e field is now s
32600 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20  et incorrectly. 
32610 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
32620 66 69 78 20 69 74 2e 20 2a 2f 0a 20 20 70 50 67  fix it. */.  pPg
32630 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b  ->nCell = nCell;
32640 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f  .  pPg->nOverflo
32650 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62 79  w = 0;..  put2by
32660 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 31 5d  te(&aData[hdr+1]
32670 2c 20 30 29 3b 0a 20 20 70 75 74 32 62 79 74 65  , 0);.  put2byte
32680 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20  (&aData[hdr+3], 
32690 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  pPg->nCell);.  p
326a0 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  ut2byte(&aData[h
326b0 64 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20 61  dr+5], pData - a
326c0 44 61 74 61 29 3b 0a 20 20 61 44 61 74 61 5b 68  Data);.  aData[h
326d0 64 72 2b 37 5d 20 3d 20 30 78 30 30 3b 0a 7d 0a  dr+7] = 0x00;.}.
326e0 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43  ./*.** Array apC
326f0 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e  ell[] contains n
32700 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f  Cell pointers to
32710 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41   b-tree cells. A
32720 72 72 61 79 20 73 7a 43 65 6c 6c 0a 2a 2a 20 63  rray szCell.** c
32730 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65  ontains the size
32740 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63   in bytes of eac
32750 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68 69  h such cell. Thi
32760 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
32770 70 74 73 20 74 6f 20 0a 2a 2a 20 61 64 64 20 74  pts to .** add t
32780 68 65 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20  he cells stored 
32790 69 6e 20 74 68 65 20 61 72 72 61 79 20 74 6f 20  in the array to 
327a0 70 61 67 65 20 70 50 67 2e 20 49 66 20 69 74 20  page pPg. If it 
327b0 63 61 6e 6e 6f 74 20 28 62 65 63 61 75 73 65 20  cannot (because 
327c0 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 65 65  .** the page nee
327d0 64 73 20 74 6f 20 62 65 20 64 65 66 72 61 67 6d  ds to be defragm
327e0 65 6e 74 65 64 20 62 65 66 6f 72 65 20 74 68 65  ented before the
327f0 20 63 65 6c 6c 73 20 77 69 6c 6c 20 66 69 74 29   cells will fit)
32800 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73  , non-zero.** is
32810 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
32820 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 65 6c  wise, if the cel
32830 6c 73 20 61 72 65 20 61 64 64 65 64 20 73 75 63  ls are added suc
32840 63 65 73 73 66 75 6c 6c 79 2c 20 7a 65 72 6f 20  cessfully, zero 
32850 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  is.** returned..
32860 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  **.** Argument p
32870 43 65 6c 6c 70 74 72 20 70 6f 69 6e 74 73 20 74  Cellptr points t
32880 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
32890 79 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f  y in the cell-po
328a0 69 6e 74 65 72 20 61 72 72 61 79 0a 2a 2a 20 28  inter array.** (
328b0 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 67  part of page pPg
328c0 29 20 74 6f 20 70 6f 70 75 6c 61 74 65 2e 20 41  ) to populate. A
328d0 66 74 65 72 20 63 65 6c 6c 20 61 70 43 65 6c 6c  fter cell apCell
328e0 5b 30 5d 20 69 73 20 77 72 69 74 74 65 6e 20 74  [0] is written t
328f0 6f 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 62 6f  o the.** page bo
32900 64 79 2c 20 61 20 31 36 2d 62 69 74 20 6f 66 66  dy, a 16-bit off
32910 73 65 74 20 69 73 20 77 72 69 74 74 65 6e 20 74  set is written t
32920 6f 20 70 43 65 6c 6c 70 74 72 2e 20 41 6e 64 20  o pCellptr. And 
32930 73 6f 20 6f 6e 2c 20 66 6f 72 20 65 61 63 68 0a  so on, for each.
32940 2a 2a 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61  ** cell in the a
32950 72 72 61 79 2e 20 49 74 20 69 73 20 74 68 65 20  rray. It is the 
32960 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
32970 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
32980 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61 74 20 69  ensure.** that i
32990 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65  t is safe to ove
329a0 72 77 72 69 74 65 20 74 68 69 73 20 70 61 72 74  rwrite this part
329b0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69   of the cell-poi
329c0 6e 74 65 72 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  nter array..**.*
329d0 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
329e0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
329f0 2a 70 70 44 61 74 61 20 70 6f 69 6e 74 73 20 74  *ppData points t
32a00 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
32a10 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61  he .** content a
32a20 72 65 61 20 6f 6e 20 70 61 67 65 20 70 50 67 2e  rea on page pPg.
32a30 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
32a40 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  the content area
32a50 20 69 73 20 65 78 74 65 6e 64 65 64 2c 0a 2a 2a   is extended,.**
32a60 20 2a 70 70 44 61 74 61 20 69 73 20 75 70 64 61   *ppData is upda
32a70 74 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ted to point to 
32a80 74 68 65 20 6e 65 77 20 73 74 61 72 74 20 6f 66  the new start of
32a90 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65   the content are
32aa0 61 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75  a.** before retu
32ab0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e  rning..**.** Fin
32ac0 61 6c 6c 79 2c 20 61 72 67 75 6d 65 6e 74 20 70  ally, argument p
32ad0 42 65 67 69 6e 20 70 6f 69 6e 74 73 20 74 6f 20  Begin points to 
32ae0 74 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61  the byte immedia
32af0 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
32b00 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
32b10 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
32b20 62 79 20 74 68 69 73 20 70 61 67 65 20 66 6f 72  by this page for
32b30 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65   the cell-pointe
32b40 72 20 61 72 65 61 20 28 66 6f 72 0a 2a 2a 20 61  r area (for.** a
32b50 6c 6c 20 63 65 6c 6c 73 20 2d 20 6e 6f 74 20 6a  ll cells - not j
32b60 75 73 74 20 74 68 6f 73 65 20 69 6e 73 65 72 74  ust those insert
32b70 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
32b80 74 20 63 61 6c 6c 29 2e 20 49 66 20 74 68 65 20  t call). If the 
32b90 63 6f 6e 74 65 6e 74 0a 2a 2a 20 61 72 65 61 20  content.** area 
32ba0 6d 75 73 74 20 62 65 20 65 78 74 65 6e 64 65 64  must be extended
32bb0 20 74 6f 20 62 65 66 6f 72 65 20 74 68 69 73 20   to before this 
32bc0 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  point in order t
32bd0 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 61 6c 6c  o accomodate all
32be0 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  .** cells in apC
32bf0 65 6c 6c 5b 5d 2c 20 74 68 65 6e 20 74 68 65 20  ell[], then the 
32c00 63 65 6c 6c 73 20 64 6f 20 6e 6f 74 20 66 69 74  cells do not fit
32c10 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73   and non-zero is
32c20 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
32c30 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 73  atic int pageIns
32c40 65 72 74 41 72 72 61 79 28 0a 20 20 4d 65 6d 50  ertArray(.  MemP
32c50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20  age *pPg,       
32c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
32c70 61 67 65 20 74 6f 20 61 64 64 20 63 65 6c 6c 73  age to add cells
32c80 20 74 6f 20 2a 2f 0a 20 20 75 38 20 2a 70 42 65   to */.  u8 *pBe
32c90 67 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  gin,            
32ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
32cb0 6f 66 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  of cell-pointer 
32cc0 61 72 72 61 79 20 2a 2f 0a 20 20 75 38 20 2a 2a  array */.  u8 **
32cd0 70 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  ppData,         
32ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
32cf0 2f 4f 55 54 3a 20 50 61 67 65 20 63 6f 6e 74 65  /OUT: Page conte
32d00 6e 74 20 2d 61 72 65 61 20 70 6f 69 6e 74 65 72  nt -area pointer
32d10 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70   */.  u8 *pCellp
32d20 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
32d30 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
32d40 20 74 6f 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72   to cell-pointer
32d50 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
32d60 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
32d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
32d80 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f  mber of cells to
32d90 20 61 64 64 20 74 6f 20 70 50 67 20 2a 2f 0a 20   add to pPg */. 
32da0 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
32db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32dc0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
32dd0 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43  ls */.  u16 *szC
32de0 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  ell             
32df0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
32e00 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a   of cell sizes *
32e10 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
32e20 75 38 20 2a 61 44 61 74 61 20 3d 20 70 50 67 2d  u8 *aData = pPg-
32e30 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 70 44  >aData;.  u8 *pD
32e40 61 74 61 20 3d 20 2a 70 70 44 61 74 61 3b 0a 20  ata = *ppData;. 
32e50 20 63 6f 6e 73 74 20 69 6e 74 20 62 46 72 65 65   const int bFree
32e60 6c 69 73 74 20 3d 20 61 44 61 74 61 5b 31 5d 20  list = aData[1] 
32e70 7c 7c 20 61 44 61 74 61 5b 32 5d 3b 0a 20 20 61  || aData[2];.  a
32e80 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
32e90 42 20 7c 7c 20 70 50 67 2d 3e 68 64 72 4f 66 66  B || pPg->hdrOff
32ea0 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20  set==0 );    /* 
32eb0 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20  Never called on 
32ec0 70 61 67 65 20 31 20 2a 2f 0a 20 20 66 6f 72 28  page 1 */.  for(
32ed0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
32ee0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d  +){.    int sz =
32ef0 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   szCell[i];.    
32f00 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 2a  int rc;.    u8 *
32f10 70 53 6c 6f 74 3b 0a 20 20 20 20 69 66 28 20 62  pSlot;.    if( b
32f20 46 72 65 65 6c 69 73 74 3d 3d 30 20 7c 7c 20 28  Freelist==0 || (
32f30 70 53 6c 6f 74 20 3d 20 70 61 67 65 46 69 6e 64  pSlot = pageFind
32f40 53 6c 6f 74 28 70 50 67 2c 20 73 7a 2c 20 26 72  Slot(pPg, sz, &r
32f50 63 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20  c, 0))==0 ){.   
32f60 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 3b 0a     pData -= sz;.
32f70 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61 3c        if( pData<
32f80 70 42 65 67 69 6e 20 29 20 72 65 74 75 72 6e 20  pBegin ) return 
32f90 31 3b 0a 20 20 20 20 20 20 70 53 6c 6f 74 20 3d  1;.      pSlot =
32fa0 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20   pData;.    }.  
32fb0 20 20 6d 65 6d 63 70 79 28 70 53 6c 6f 74 2c 20    memcpy(pSlot, 
32fc0 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a  apCell[i], sz);.
32fd0 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65      put2byte(pCe
32fe0 6c 6c 70 74 72 2c 20 28 70 53 6c 6f 74 20 2d 20  llptr, (pSlot - 
32ff0 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65  aData));.    pCe
33000 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a  llptr += 2;.  }.
33010 20 20 2a 70 70 44 61 74 61 20 3d 20 70 44 61 74    *ppData = pDat
33020 61 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  a;.  return 0;.}
33030 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70  ../*.** Array ap
33040 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  Cell[] contains 
33050 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74  nCell pointers t
33060 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20  o b-tree cells. 
33070 41 72 72 61 79 20 73 7a 43 65 6c 6c 20 0a 2a 2a  Array szCell .**
33080 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69   contains the si
33090 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65  ze in bytes of e
330a0 61 63 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54  ach such cell. T
330b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 64  his function add
330c0 73 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61  s the.** space a
330d0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
330e0 61 63 68 20 63 65 6c 6c 20 69 6e 20 74 68 65 20  ach cell in the 
330f0 61 72 72 61 79 20 74 68 61 74 20 69 73 20 63 75  array that is cu
33100 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 0a  rrently stored .
33110 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 62 6f  ** within the bo
33120 64 79 20 6f 66 20 70 50 67 20 74 6f 20 74 68 65  dy of pPg to the
33130 20 70 50 67 20 66 72 65 65 2d 6c 69 73 74 2e 20   pPg free-list. 
33140 54 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72  The cell-pointer
33150 73 20 61 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 66  s and other.** f
33160 69 65 6c 64 73 20 6f 66 20 74 68 65 20 70 61 67  ields of the pag
33170 65 20 61 72 65 20 6e 6f 74 20 75 70 64 61 74 65  e are not update
33180 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
33190 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
331a0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
331b0 6f 66 20 63 65 6c 6c 73 20 61 64 64 65 64 20 74  of cells added t
331c0 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  o the free-list.
331d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
331e0 61 67 65 46 72 65 65 41 72 72 61 79 28 0a 20 20  ageFreeArray(.  
331f0 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20  MemPage *pPg,   
33200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33210 2f 2a 20 50 61 67 65 20 74 6f 20 65 64 69 74 20  /* Page to edit 
33220 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
33230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33240 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20 74 6f       /* Cells to
33250 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 75 38 20   delete */.  u8 
33260 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  **apCell,       
33270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33280 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a  Array of cells *
33290 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20  /.  u16 *szCell 
332a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
332b0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
332c0 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b  cell sizes */.){
332d0 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
332e0 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
332f0 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70  ;.  u8 * const p
33300 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 70 50 67  End = &aData[pPg
33310 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
33320 65 5d 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  e];.  u8 * const
33330 20 70 53 74 61 72 74 20 3d 20 26 61 44 61 74 61   pStart = &aData
33340 5b 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 20  [pPg->hdrOffset 
33350 2b 20 38 20 2b 20 70 50 67 2d 3e 63 68 69 6c 64  + 8 + pPg->child
33360 50 74 72 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20  PtrSize];.  int 
33370 6e 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nRet = 0;.  int 
33380 69 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d  i;.  u8 *pFree =
33390 20 30 3b 0a 20 20 69 6e 74 20 73 7a 46 72 65 65   0;.  int szFree
333a0 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30   = 0;..  for(i=0
333b0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
333c0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
333d0 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   apCell[i];.    
333e0 69 66 28 20 70 43 65 6c 6c 3e 3d 70 53 74 61 72  if( pCell>=pStar
333f0 74 20 26 26 20 70 43 65 6c 6c 3c 70 45 6e 64 20  t && pCell<pEnd 
33400 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20  ){.      int sz 
33410 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  = szCell[i];.   
33420 20 20 20 69 66 28 20 70 46 72 65 65 21 3d 28 70     if( pFree!=(p
33430 43 65 6c 6c 20 2b 20 73 7a 29 20 29 7b 0a 20 20  Cell + sz) ){.  
33440 20 20 20 20 20 20 69 66 28 20 70 46 72 65 65 20        if( pFree 
33450 29 20 66 72 65 65 53 70 61 63 65 28 70 50 67 2c  ) freeSpace(pPg,
33460 20 70 46 72 65 65 20 2d 20 61 44 61 74 61 2c 20   pFree - aData, 
33470 73 7a 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20  szFree);.       
33480 20 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a   pFree = pCell;.
33490 20 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 3d          szFree =
334a0 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 69 66 28   sz;.        if(
334b0 20 70 46 72 65 65 2b 73 7a 3e 70 45 6e 64 20 29   pFree+sz>pEnd )
334c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
334d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
334e0 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20  pFree = pCell;. 
334f0 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 2b 3d         szFree +=
33500 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   sz;.      }.   
33510 20 20 20 6e 52 65 74 2b 2b 3b 0a 20 20 20 20 7d     nRet++;.    }
33520 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72 65 65  .  }.  if( pFree
33530 20 29 20 66 72 65 65 53 70 61 63 65 28 70 50 67   ) freeSpace(pPg
33540 2c 20 70 46 72 65 65 20 2d 20 61 44 61 74 61 2c  , pFree - aData,
33550 20 73 7a 46 72 65 65 29 3b 0a 20 20 72 65 74 75   szFree);.  retu
33560 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn nRet;.}../*.*
33570 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65 65  * The pPg->nFree
33580 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69   field is invali
33590 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
335a0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 74  tion returns. It
335b0 20 69 73 20 74 68 65 0a 2a 2a 20 72 65 73 70 6f   is the.** respo
335c0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
335d0 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69   caller to set i
335e0 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  t correctly..*/.
335f0 73 74 61 74 69 63 20 76 6f 69 64 20 65 64 69 74  static void edit
33600 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
33610 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20  *pPg,           
33620 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20          /* Edit 
33630 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69  this page */.  i
33640 6e 74 20 69 4f 6c 64 2c 20 20 20 20 20 20 20 20  nt iOld,        
33650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33660 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
33670 20 63 65 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20   cell currently 
33680 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  on page */.  int
33690 20 69 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20   iNew,          
336a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
336b0 49 6e 64 65 78 20 6f 66 20 6e 65 77 20 66 69 72  Index of new fir
336c0 73 74 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20  st cell on page 
336d0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20 20  */.  int nNew,  
336e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
336f0 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75       /* Final nu
33700 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
33710 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
33720 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  apCell,         
33730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
33740 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a  ray of cells */.
33750 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20    u16 *szCell   
33760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33770 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
33780 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20  ll sizes */.){. 
33790 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
337a0 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
337b0 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
337c0 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74  = pPg->hdrOffset
337d0 3b 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 20 3d  ;.  u8 *pBegin =
337e0 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b   &pPg->aCellIdx[
337f0 6e 4e 65 77 20 2a 20 32 5d 3b 0a 20 20 69 6e 74  nNew * 2];.  int
33800 20 6e 43 65 6c 6c 20 3d 20 70 50 67 2d 3e 6e 43   nCell = pPg->nC
33810 65 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 65  ell;       /* Ce
33820 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 70 50  lls stored on pP
33830 67 20 2a 2f 0a 20 20 75 38 20 2a 70 44 61 74 61  g */.  u8 *pData
33840 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  ;.  u8 *pCellptr
33850 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
33860 20 69 4f 6c 64 45 6e 64 20 3d 20 69 4f 6c 64 20   iOldEnd = iOld 
33870 2b 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 2b 20 70  + pPg->nCell + p
33880 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  Pg->nOverflow;. 
33890 20 69 6e 74 20 69 4e 65 77 45 6e 64 20 3d 20 69   int iNewEnd = i
338a0 4e 65 77 20 2b 20 6e 4e 65 77 3b 0a 0a 23 69 66  New + nNew;..#if
338b0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
338c0 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71  .  u8 *pTmp = sq
338d0 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
338e0 61 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50  ace(pPg->pBt->pP
338f0 61 67 65 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ager);.  memcpy(
33900 70 54 6d 70 2c 20 61 44 61 74 61 2c 20 70 50 67  pTmp, aData, pPg
33910 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
33920 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
33930 20 52 65 6d 6f 76 65 20 63 65 6c 6c 73 20 66 72   Remove cells fr
33940 6f 6d 20 74 68 65 20 73 74 61 72 74 20 61 6e 64  om the start and
33950 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
33960 20 2a 2f 0a 20 20 69 66 28 20 69 4f 6c 64 3c 69   */.  if( iOld<i
33970 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  New ){.    int n
33980 53 68 69 66 74 20 3d 20 70 61 67 65 46 72 65 65  Shift = pageFree
33990 41 72 72 61 79 28 0a 20 20 20 20 20 20 20 20 70  Array(.        p
339a0 50 67 2c 20 69 4e 65 77 2d 69 4f 6c 64 2c 20 26  Pg, iNew-iOld, &
339b0 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2c 20 26 73  apCell[iOld], &s
339c0 7a 43 65 6c 6c 5b 69 4f 6c 64 5d 0a 20 20 20 20  zCell[iOld].    
339d0 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  );.    memmove(p
339e0 50 67 2d 3e 61 43 65 6c 6c 49 64 78 2c 20 26 70  Pg->aCellIdx, &p
339f0 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 53 68  Pg->aCellIdx[nSh
33a00 69 66 74 2a 32 5d 2c 20 6e 43 65 6c 6c 2a 32 29  ift*2], nCell*2)
33a10 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20 6e  ;.    nCell -= n
33a20 53 68 69 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28  Shift;.  }.  if(
33a30 20 69 4e 65 77 45 6e 64 20 3c 20 69 4f 6c 64 45   iNewEnd < iOldE
33a40 6e 64 20 29 7b 0a 20 20 20 20 6e 43 65 6c 6c 20  nd ){.    nCell 
33a50 2d 3d 20 70 61 67 65 46 72 65 65 41 72 72 61 79  -= pageFreeArray
33a60 28 0a 20 20 20 20 20 20 20 20 70 50 67 2c 20 69  (.        pPg, i
33a70 4f 6c 64 45 6e 64 2d 69 4e 65 77 45 6e 64 2c 20  OldEnd-iNewEnd, 
33a80 26 61 70 43 65 6c 6c 5b 69 4e 65 77 45 6e 64 5d  &apCell[iNewEnd]
33a90 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e 65 77 45 6e  , &szCell[iNewEn
33aa0 64 5d 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20  d].    );.  }.. 
33ab0 20 70 44 61 74 61 20 3d 20 26 61 44 61 74 61 5b   pData = &aData[
33ac0 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  get2byte(&aData[
33ad0 68 64 72 2b 35 5d 29 5d 3b 0a 20 20 69 66 28 20  hdr+5])];.  if( 
33ae0 70 44 61 74 61 3c 70 42 65 67 69 6e 20 29 20 67  pData<pBegin ) g
33af0 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69  oto editpage_fai
33b00 6c 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 63 65 6c  l;..  /* Add cel
33b10 6c 73 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ls to the start 
33b20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
33b30 20 69 66 28 20 69 4e 65 77 3c 69 4f 6c 64 20 29   if( iNew<iOld )
33b40 7b 0a 20 20 20 20 69 6e 74 20 6e 41 64 64 20 3d  {.    int nAdd =
33b50 20 69 4f 6c 64 2d 69 4e 65 77 3b 0a 20 20 20 20   iOld-iNew;.    
33b60 70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e  pCellptr = pPg->
33b70 61 43 65 6c 6c 49 64 78 3b 0a 20 20 20 20 6d 65  aCellIdx;.    me
33b80 6d 6d 6f 76 65 28 26 70 43 65 6c 6c 70 74 72 5b  mmove(&pCellptr[
33b90 6e 41 64 64 2a 32 5d 2c 20 70 43 65 6c 6c 70 74  nAdd*2], pCellpt
33ba0 72 2c 20 6e 43 65 6c 6c 2a 32 29 3b 0a 20 20 20  r, nCell*2);.   
33bb0 20 69 66 28 20 70 61 67 65 49 6e 73 65 72 74 41   if( pageInsertA
33bc0 72 72 61 79 28 0a 20 20 20 20 20 20 20 20 20 20  rray(.          
33bd0 70 50 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44  pPg, pBegin, &pD
33be0 61 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20  ata, pCellptr,. 
33bf0 20 20 20 20 20 20 20 20 20 6e 41 64 64 2c 20 26           nAdd, &
33c00 61 70 43 65 6c 6c 5b 69 4e 65 77 5d 2c 20 26 73  apCell[iNew], &s
33c10 7a 43 65 6c 6c 5b 69 4e 65 77 5d 0a 20 20 20 20  zCell[iNew].    
33c20 29 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67  ) ) goto editpag
33c30 65 5f 66 61 69 6c 3b 0a 20 20 20 20 6e 43 65 6c  e_fail;.    nCel
33c40 6c 20 2b 3d 20 6e 41 64 64 3b 0a 20 20 7d 0a 0a  l += nAdd;.  }..
33c50 20 20 2f 2a 20 41 64 64 20 61 6e 79 20 6f 76 65    /* Add any ove
33c60 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2a 2f 0a 20  rflow cells */. 
33c70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 67 2d   for(i=0; i<pPg-
33c80 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 69 2b 2b 29  >nOverflow; i++)
33c90 7b 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 20  {.    int iCell 
33ca0 3d 20 28 69 4f 6c 64 20 2b 20 70 50 67 2d 3e 61  = (iOld + pPg->a
33cb0 69 4f 76 66 6c 5b 69 5d 29 20 2d 20 69 4e 65 77  iOvfl[i]) - iNew
33cc0 3b 0a 20 20 20 20 69 66 28 20 69 43 65 6c 6c 3e  ;.    if( iCell>
33cd0 3d 30 20 26 26 20 69 43 65 6c 6c 3c 6e 4e 65 77  =0 && iCell<nNew
33ce0 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43   ){.      u8 *pC
33cf0 65 6c 6c 70 74 72 20 3d 20 26 70 50 67 2d 3e 61  ellptr = &pPg->a
33d00 43 65 6c 6c 49 64 78 5b 69 43 65 6c 6c 20 2a 20  CellIdx[iCell * 
33d10 32 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76  2];.      memmov
33d20 65 28 26 70 43 65 6c 6c 70 74 72 5b 32 5d 2c 20  e(&pCellptr[2], 
33d30 70 43 65 6c 6c 70 74 72 2c 20 28 6e 43 65 6c 6c  pCellptr, (nCell
33d40 20 2d 20 69 43 65 6c 6c 29 20 2a 20 32 29 3b 0a   - iCell) * 2);.
33d50 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20        nCell++;. 
33d60 20 20 20 20 20 69 66 28 20 70 61 67 65 49 6e 73       if( pageIns
33d70 65 72 74 41 72 72 61 79 28 0a 20 20 20 20 20 20  ertArray(.      
33d80 20 20 20 20 20 20 70 50 67 2c 20 70 42 65 67 69        pPg, pBegi
33d90 6e 2c 20 26 70 44 61 74 61 2c 20 70 43 65 6c 6c  n, &pData, pCell
33da0 70 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ptr,.           
33db0 20 31 2c 20 26 61 70 43 65 6c 6c 5b 69 43 65 6c   1, &apCell[iCel
33dc0 6c 20 2b 20 69 4e 65 77 5d 2c 20 26 73 7a 43 65  l + iNew], &szCe
33dd0 6c 6c 5b 69 43 65 6c 6c 20 2b 20 69 4e 65 77 5d  ll[iCell + iNew]
33de0 0a 20 20 20 20 20 20 29 20 29 20 67 6f 74 6f 20  .      ) ) goto 
33df0 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a 20  editpage_fail;. 
33e00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
33e10 70 70 65 6e 64 20 63 65 6c 6c 73 20 74 6f 20 74  ppend cells to t
33e20 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
33e30 67 65 20 2a 2f 0a 20 20 70 43 65 6c 6c 70 74 72  ge */.  pCellptr
33e40 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64   = &pPg->aCellId
33e50 78 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 69 66  x[nCell*2];.  if
33e60 28 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61  ( pageInsertArra
33e70 79 28 0a 20 20 20 20 20 20 20 20 70 50 67 2c 20  y(.        pPg, 
33e80 70 42 65 67 69 6e 2c 20 26 70 44 61 74 61 2c 20  pBegin, &pData, 
33e90 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20  pCellptr,.      
33ea0 20 20 6e 4e 65 77 2d 6e 43 65 6c 6c 2c 20 26 61    nNew-nCell, &a
33eb0 70 43 65 6c 6c 5b 69 4e 65 77 2b 6e 43 65 6c 6c  pCell[iNew+nCell
33ec0 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e 65 77 2b  ], &szCell[iNew+
33ed0 6e 43 65 6c 6c 5d 0a 20 20 29 20 29 20 67 6f 74  nCell].  ) ) got
33ee0 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3b  o editpage_fail;
33ef0 0a 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d  ..  pPg->nCell =
33f00 20 6e 4e 65 77 3b 0a 20 20 70 50 67 2d 3e 6e 4f   nNew;.  pPg->nO
33f10 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20  verflow = 0;..  
33f20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
33f30 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65  hdr+3], pPg->nCe
33f40 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  ll);.  put2byte(
33f50 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  &aData[hdr+5], p
33f60 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b 0a 0a  Data - aData);..
33f70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
33f80 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  BUG.  for(i=0; i
33f90 3c 6e 4e 65 77 20 26 26 20 21 43 4f 52 52 55 50  <nNew && !CORRUP
33fa0 54 5f 44 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  T_DB; i++){.    
33fb0 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65  u8 *pCell = apCe
33fc0 6c 6c 5b 69 2b 69 4e 65 77 5d 3b 0a 20 20 20 20  ll[i+iNew];.    
33fd0 69 6e 74 20 69 4f 66 66 20 3d 20 67 65 74 32 62  int iOff = get2b
33fe0 79 74 65 28 26 70 50 67 2d 3e 61 43 65 6c 6c 49  yte(&pPg->aCellI
33ff0 64 78 5b 69 2a 32 5d 29 3b 0a 20 20 20 20 69 66  dx[i*2]);.    if
34000 28 20 70 43 65 6c 6c 3e 3d 61 44 61 74 61 20 26  ( pCell>=aData &
34010 26 20 70 43 65 6c 6c 3c 26 61 44 61 74 61 5b 70  & pCell<&aData[p
34020 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  Pg->pBt->usableS
34030 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 70 43  ize] ){.      pC
34040 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c  ell = &pTmp[pCel
34050 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20 20  l - aData];.    
34060 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 3d  }.    assert( 0=
34070 3d 6d 65 6d 63 6d 70 28 70 43 65 6c 6c 2c 20 26  =memcmp(pCell, &
34080 61 44 61 74 61 5b 69 4f 66 66 5d 2c 20 73 7a 43  aData[iOff], szC
34090 65 6c 6c 5b 69 2b 69 4e 65 77 5d 29 20 29 3b 0a  ell[i+iNew]) );.
340a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
340b0 74 75 72 6e 3b 0a 20 65 64 69 74 70 61 67 65 5f  turn;. editpage_
340c0 66 61 69 6c 3a 0a 20 20 2f 2a 20 55 6e 61 62 6c  fail:.  /* Unabl
340d0 65 20 74 6f 20 65 64 69 74 20 74 68 69 73 20 70  e to edit this p
340e0 61 67 65 2e 20 52 65 62 75 69 6c 64 20 69 74 20  age. Rebuild it 
340f0 66 72 6f 6d 20 73 63 72 61 74 63 68 20 69 6e 73  from scratch ins
34100 74 65 61 64 2e 20 2a 2f 0a 20 20 72 65 62 75 69  tead. */.  rebui
34110 6c 64 50 61 67 65 28 70 50 67 2c 20 6e 4e 65 77  ldPage(pPg, nNew
34120 2c 20 26 61 70 43 65 6c 6c 5b 69 4e 65 77 5d 2c  , &apCell[iNew],
34130 20 26 73 7a 43 65 6c 6c 5b 69 4e 65 77 5d 29 3b   &szCell[iNew]);
34140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
34150 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65  llowing paramete
34160 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77  rs determine how
34170 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70   many adjacent p
34180 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65  ages get involve
34190 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63  d.** in a balanc
341a0 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
341b0 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  NN is the number
341c0 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
341d0 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20   either side.** 
341e0 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74  of the page that
341f0 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
34200 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  the balancing op
34210 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20  eration.  NB is 
34220 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d  the.** total num
34230 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
34240 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69  t participate, i
34250 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72  ncluding the tar
34260 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  get page and.** 
34270 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  NN neighbors on 
34280 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a  either side..**.
34290 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76  ** The minimum v
342a0 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20  alue of NN is 1 
342b0 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e  (of course).  In
342c0 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76  creasing NN abov
342d0 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20  e 1.** (to 2 or 
342e0 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73  3) gives a modes
342f0 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e  t improvement in
34300 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45   SELECT and DELE
34310 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  TE performance.*
34320 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f  * in exchange fo
34330 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61  r a larger degra
34340 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54  dation in INSERT
34350 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66   and UPDATE perf
34360 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20  ormance..** The 
34370 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65  value of NN appe
34380 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20  ars to give the 
34390 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65  best results ove
343a0 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rall..*/.#define
343b0 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20   NN 1           
343c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
343d0 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
343e0 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
343f0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28   */.#define NB (
34400 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20  NN*2+1)      /* 
34410 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f  Total pages invo
34420 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  lved in the bala
34430 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66  nce */...#ifndef
34440 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
34450 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20  CKBALANCE./*.** 
34460 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
34470 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65  balance() handle
34480 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65  s the common spe
34490 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a  cial case where.
344a0 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ** a new entry i
344b0 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  s being inserted
344c0 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20   on the extreme 
344d0 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65  right-end of the
344e0 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68  .** tree, in oth
344f0 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74  er words, when t
34500 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c  he new entry wil
34510 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72  l become the lar
34520 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  gest.** entry in
34530 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a   the tree..**.**
34540 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69   Instead of tryi
34550 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65 20 74 68  ng to balance th
34560 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  e 3 right-most l
34570 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20  eaf pages, just 
34580 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67  add.** a new pag
34590 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68  e to the right-h
345a0 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74  and side and put
345b0 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74   the one new ent
345c0 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61  ry in.** that pa
345d0 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73  ge.  This leaves
345e0 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20   the right side 
345f0 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65  of the tree some
34600 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63  what.** unbalanc
34610 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72  ed.  But odds ar
34620 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  e that we will b
34630 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20  e inserting new 
34640 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68  entries.** at th
34650 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72  e end soon after
34660 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61  wards so the nea
34670 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77  rly empty page w
34680 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66  ill quickly.** f
34690 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72  ill up.  On aver
346a0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65  age..**.** pPage
346b0 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67   is the leaf pag
346c0 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  e which is the r
346d0 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69  ight-most page i
346e0 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70  n the tree..** p
346f0 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61  Parent is its pa
34700 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73  rent.  pPage mus
34710 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20  t have a single 
34720 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a  overflow entry.*
34730 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20  * which is also 
34740 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
34750 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65  ntry on the page
34760 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61  ..**.** The pSpa
34770 63 65 20 62 75 66 66 65 72 20 69 73 20 75 73 65  ce buffer is use
34780 64 20 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d  d to store a tem
34790 70 6f 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74  porary copy of t
347a0 68 65 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65  he divider.** ce
347b0 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ll that will be 
347c0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50  inserted into pP
347d0 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65  arent. Such a ce
347e0 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
347f0 20 34 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20   4.** byte page 
34800 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20  number followed 
34810 62 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65  by a variable le
34820 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e  ngth integer. In
34830 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c   other.** words,
34840 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65   at most 13 byte
34850 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53 70  s. Hence the pSp
34860 61 63 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  ace buffer must 
34870 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31  be at.** least 1
34880 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  3 bytes in size.
34890 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
348a0 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d  alance_quick(Mem
348b0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d  Page *pParent, M
348c0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
348d0 38 20 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74  8 *pSpace){.  Bt
348e0 53 68 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42  Shared *const pB
348f0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20  t = pPage->pBt; 
34900 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74     /* B-Tree Dat
34910 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  abase */.  MemPa
34920 67 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  ge *pNew;       
34930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34940 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  /* Newly allocat
34950 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ed page */.  int
34960 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
34970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34980 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
34990 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e   */.  Pgno pgnoN
349a0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
349b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
349c0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65  ge number of pNe
349d0 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  w */..  assert( 
349e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
349f0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
34a00 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
34a10 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
34a20 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
34a30 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
34a40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
34a50 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b  >nOverflow==1 );
34a60 0a 0a 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f  ..  /* This erro
34a70 72 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e  r condition is n
34a80 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20  ow caught prior 
34a90 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73  to reaching this
34aa0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
34ab0 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  f( pPage->nCell=
34ac0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
34ad0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
34ae0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
34af0 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68 69 73  a new page. This
34b00 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
34b10 65 20 74 68 65 20 72 69 67 68 74 2d 73 69 62 6c  e the right-sibl
34b20 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61  ing of .  ** pPa
34b30 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 72  ge. Make the par
34b40 65 6e 74 20 70 61 67 65 20 77 72 69 74 61 62 6c  ent page writabl
34b50 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  e, so that the n
34b60 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a  ew divider cell.
34b70 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73 65    ** may be inse
34b80 72 74 65 64 2e 20 49 66 20 62 6f 74 68 20 74 68  rted. If both th
34b90 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ese operations a
34ba0 72 65 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70  re successful, p
34bb0 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72  roceed..  */.  r
34bc0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
34bd0 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77  ePage(pBt, &pNew
34be0 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30  , &pgnoNew, 0, 0
34bf0 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
34c00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20  LITE_OK ){..    
34c10 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 53 70 61  u8 *pOut = &pSpa
34c20 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70  ce[4];.    u8 *p
34c30 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 70  Cell = pPage->ap
34c40 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 75 31 36  Ovfl[0];.    u16
34c50 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69   szCell = cellSi
34c60 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
34c70 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70 53 74  ll);.    u8 *pSt
34c80 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  op;..    assert(
34c90 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
34ca0 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70  riteable(pNew->p
34cb0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 61  DbPage) );.    a
34cc0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
34cd0 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54  ata[0]==(PTF_INT
34ce0 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  KEY|PTF_LEAFDATA
34cf0 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20  |PTF_LEAF) );.  
34d00 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
34d10 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
34d20 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41  LEAFDATA|PTF_LEA
34d30 46 29 3b 0a 20 20 20 20 72 65 62 75 69 6c 64 50  F);.    rebuildP
34d40 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43  age(pNew, 1, &pC
34d50 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20  ell, &szCell);. 
34d60 20 20 20 70 4e 65 77 2d 3e 6e 46 72 65 65 20 3d     pNew->nFree =
34d70 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
34d80 20 2d 20 70 4e 65 77 2d 3e 63 65 6c 6c 4f 66 66   - pNew->cellOff
34d90 73 65 74 20 2d 20 32 20 2d 20 73 7a 43 65 6c 6c  set - 2 - szCell
34da0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
34db0 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
34dc0 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
34dd0 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
34de0 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68   map.    ** with
34df0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
34e00 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61   new page, and a
34e10 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  ny pointer from 
34e20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  the .    ** cell
34e30 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20   on the page to 
34e40 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
34e50 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  . If either of t
34e60 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72  hese.    ** oper
34e70 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68  ations fails, th
34e80 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  e return code is
34e90 20 73 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f   set, but the co
34ea0 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ntents.    ** of
34eb0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
34ec0 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70   are still manip
34ed0 75 6c 61 74 65 64 20 62 79 20 74 68 68 20 63 6f  ulated by thh co
34ee0 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  de below..    **
34ef0 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20   That is Ok, at 
34f00 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
34f10 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 67 75  arent page is gu
34f20 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20  aranteed to.    
34f30 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
34f40 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67  dirty. Returning
34f50 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
34f60 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20  ill cause a.    
34f70 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64  ** rollback, und
34f80 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73  oing any changes
34f90 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61 72   made to the par
34fa0 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
34fb0 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
34fc0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70  ACUUM ){.      p
34fd0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
34fe0 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54  noNew, PTRMAP_BT
34ff0 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  REE, pParent->pg
35000 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
35010 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d  if( szCell>pNew-
35020 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >minLocal ){.   
35030 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
35040 66 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c  flPtr(pNew, pCel
35050 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d  l, &rc);.      }
35060 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
35070 20 43 72 65 61 74 65 20 61 20 64 69 76 69 64 65   Create a divide
35080 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74  r cell to insert
35090 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54   into pParent. T
350a0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a  he divider cell.
350b0 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20      ** consists 
350c0 6f 66 20 61 20 34 2d 62 79 74 65 20 70 61 67 65  of a 4-byte page
350d0 20 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61 67   number (the pag
350e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67  e number of pPag
350f0 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20  e) and.    ** a 
35100 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
35110 6b 65 79 20 76 61 6c 75 65 20 28 77 68 69 63 68  key value (which
35120 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
35130 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20  e value as the. 
35140 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65     ** largest ke
35150 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20  y on pPage)..   
35160 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69   **.    ** To fi
35170 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  nd the largest k
35180 65 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67  ey value on pPag
35190 65 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74 68  e, first find th
351a0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20  e right-most .  
351b0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61    ** cell on pPa
351c0 67 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 77  ge. The first tw
351d0 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73  o fields of this
351e0 20 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20   cell are the . 
351f0 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e     ** record-len
35200 67 74 68 20 28 61 20 76 61 72 69 61 62 6c 65 20  gth (a variable 
35210 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61  length integer a
35220 74 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69  t most 32-bits i
35230 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61  n size).    ** a
35240 6e 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  nd the key value
35250 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e   (a variable len
35260 67 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79  gth integer, may
35270 20 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29   have any value)
35280 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72  ..    ** The fir
35290 73 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28  st of the while(
352a0 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77  ...) loops below
352b0 20 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20   skips over the 
352c0 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20  record-length.  
352d0 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20    ** field. The 
352e0 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e  second while(...
352f0 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68  ) loop copies th
35300 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d  e key value from
35310 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c   the.    ** cell
35320 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74   on pPage into t
35330 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
35340 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65  ..    */.    pCe
35350 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
35360 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  age, pPage->nCel
35370 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  l-1);.    pStop 
35380 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
35390 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c   while( (*(pCell
353a0 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70 43 65  ++)&0x80) && pCe
353b0 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20  ll<pStop );.    
353c0 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39  pStop = &pCell[9
353d0 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28  ];.    while( ((
353e0 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43  *(pOut++) = *(pC
353f0 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26  ell++))&0x80) &&
35400 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a   pCell<pStop );.
35410 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
35420 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
35430 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ell into pParent
35440 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43  . */.    insertC
35450 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 50 61  ell(pParent, pPa
35460 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70  rent->nCell, pSp
35470 61 63 65 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d  ace, (int)(pOut-
35480 70 53 70 61 63 65 29 2c 0a 20 20 20 20 20 20 20  pSpace),.       
35490 20 20 20 20 20 20 20 20 30 2c 20 70 50 61 67 65          0, pPage
354a0 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20  ->pgno, &rc);.. 
354b0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69     /* Set the ri
354c0 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  ght-child pointe
354d0 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20  r of pParent to 
354e0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
354f0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75   page. */.    pu
35500 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
35510 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
35520 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
35530 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f  noNew);.  .    /
35540 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65  * Release the re
35550 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e  ference to the n
35560 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ew page. */.    
35570 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
35580 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
35590 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
355a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
355b0 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69  CKBALANCE */..#i
355c0 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  f 0./*.** This f
355d0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
355e0 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74   contribute anyt
355f0 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72  hing to the oper
35600 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e  ation of SQLite.
35610 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69  .** it is someti
35620 6d 65 73 20 61 63 74 69 76 61 74 65 64 20 74 65  mes activated te
35630 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20  mporarily while 
35640 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72  debugging code r
35650 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66  esponsible .** f
35660 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74  or setting point
35670 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a  er-map entries..
35680 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
35690 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d  rmapCheckPages(M
356a0 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c  emPage **apPage,
356b0 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69   int nPage){.  i
356c0 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69  nt i, j;.  for(i
356d0 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b  =0; i<nPage; i++
356e0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20  ){.    Pgno n;. 
356f0 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d     u8 e;.    Mem
35700 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70  Page *pPage = ap
35710 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53  Page[i];.    BtS
35720 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
35730 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73  ge->pBt;.    ass
35740 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
35750 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a  it );..    for(j
35760 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; j<pPage->nCe
35770 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; j++){.      
35780 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
35790 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20       u8 *z;.    
357a0 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64   .      z = find
357b0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a  Cell(pPage, j);.
357c0 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
357d0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a  CellPtr(pPage, z
357e0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
357f0 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
35800 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ow ){.        Pg
35810 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79  no ovfl = get4by
35820 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72  te(&z[info.iOver
35830 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20  flow]);.        
35840 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f  ptrmapGet(pBt, o
35850 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  vfl, &e, &n);.  
35860 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
35870 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
35880 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
35890 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OW1 );.      }. 
358a0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
358b0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
358c0 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65   Pgno child = ge
358d0 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20  t4byte(z);.     
358e0 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
358f0 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29  , child, &e, &n)
35900 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
35910 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ( n==pPage->pgno
35920 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54   && e==PTRMAP_BT
35930 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  REE );.      }. 
35940 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50     }.    if( !pP
35950 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
35960 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20     Pgno child = 
35970 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
35980 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
35990 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
359a0 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
359b0 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29  , child, &e, &n)
359c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
359d0 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
359e0 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  & e==PTRMAP_BTRE
359f0 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  E );.    }.  }. 
35a00 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
35a10 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
35a20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
35a30 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e   to copy the con
35a40 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74  tents of the b-t
35a50 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20  ree node stored 
35a60 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f  .** on page pFro
35a70 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49  m to page pTo. I
35a80 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73  f page pFrom was
35a90 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65   not a leaf page
35aa0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f  , then.** the po
35ab0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
35ac0 73 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64  s for each child
35ad0 20 70 61 67 65 20 61 72 65 20 75 70 64 61 74 65   page are update
35ae0 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  d so that the.**
35af0 20 70 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f   parent page sto
35b00 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  red in the point
35b10 65 72 20 6d 61 70 20 69 73 20 70 61 67 65 20 70  er map is page p
35b20 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e  To. If pFrom con
35b30 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65  tained.** any ce
35b40 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f  lls with overflo
35b50 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c  w page pointers,
35b60 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73   then the corres
35b70 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a  ponding pointer.
35b80 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61  ** map entries a
35b90 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20  re also updated 
35ba0 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 72 65  so that the pare
35bb0 6e 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20  nt page is page 
35bc0 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46  pTo..**.** If pF
35bd0 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79  rom is currently
35be0 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76   carrying any ov
35bf0 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e  erflow cells (en
35c00 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20  tries in the.** 
35c10 4d 65 6d 50 61 67 65 2e 61 70 4f 76 66 6c 5b 5d  MemPage.apOvfl[]
35c20 20 61 72 72 61 79 29 2c 20 74 68 65 79 20 61 72   array), they ar
35c30 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20  e not copied to 
35c40 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  pTo. .**.** Befo
35c50 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61  re returning, pa
35c60 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74  ge pTo is reinit
35c70 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62 74  ialized using bt
35c80 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a  reeInitPage()..*
35c90 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d  *.** The perform
35ca0 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e  ance of this fun
35cb0 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69  ction is not cri
35cc0 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c  tical. It is onl
35cd0 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68  y used by .** th
35ce0 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  e balance_shallo
35cf0 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63  wer() and balanc
35d00 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63 65  e_deeper() proce
35d10 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f  dures, neither o
35d20 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63  f.** which are c
35d30 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65  alled often unde
35d40 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73  r normal circums
35d50 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tances..*/.stati
35d60 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43  c void copyNodeC
35d70 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a  ontent(MemPage *
35d80 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a  pFrom, MemPage *
35d90 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  pTo, int *pRC){.
35da0 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
35db0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42  LITE_OK ){.    B
35dc0 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74 20  tShared * const 
35dd0 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74  pBt = pFrom->pBt
35de0 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74  ;.    u8 * const
35df0 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e   aFrom = pFrom->
35e00 61 44 61 74 61 3b 0a 20 20 20 20 75 38 20 2a 20  aData;.    u8 * 
35e10 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d  const aTo = pTo-
35e20 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20  >aData;.    int 
35e30 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d  const iFromHdr =
35e40 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65   pFrom->hdrOffse
35e50 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  t;.    int const
35e60 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d   iToHdr = ((pTo-
35e70 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20  >pgno==1) ? 100 
35e80 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72 63  : 0);.    int rc
35e90 3b 0a 20 20 20 20 69 6e 74 20 69 44 61 74 61 3b  ;.    int iData;
35ea0 0a 20 20 0a 20 20 0a 20 20 20 20 61 73 73 65 72  .  .  .    asser
35eb0 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74  t( pFrom->isInit
35ec0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
35ed0 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54  pFrom->nFree>=iT
35ee0 6f 48 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65  oHdr );.    asse
35ef0 72 74 28 20 67 65 74 32 62 79 74 65 28 26 61 46  rt( get2byte(&aF
35f00 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29  rom[iFromHdr+5])
35f10 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73   <= (int)pBt->us
35f20 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20  ableSize );.  . 
35f30 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62     /* Copy the b
35f40 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65  -tree node conte
35f50 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72  nt from page pFr
35f60 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20  om to page pTo. 
35f70 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20 67  */.    iData = g
35f80 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69  et2byte(&aFrom[i
35f90 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20  FromHdr+5]);.   
35fa0 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44 61   memcpy(&aTo[iDa
35fb0 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74  ta], &aFrom[iDat
35fc0 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  a], pBt->usableS
35fd0 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20 20  ize-iData);.    
35fe0 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f 48  memcpy(&aTo[iToH
35ff0 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f  dr], &aFrom[iFro
36000 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65  mHdr], pFrom->ce
36010 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46 72  llOffset + 2*pFr
36020 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20  om->nCell);.  . 
36030 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69     /* Reinitiali
36040 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20 74  ze page pTo so t
36050 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
36060 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
36070 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a 2a  structure.    **
36080 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 64   match the new d
36090 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61 6c  ata. The initial
360a0 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63  ization of pTo c
360b0 61 6e 20 61 63 74 75 61 6c 6c 79 20 66 61 69 6c  an actually fail
360c0 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 66 61   under.    ** fa
360d0 69 72 6c 79 20 6f 62 73 63 75 72 65 20 63 69 72  irly obscure cir
360e0 63 75 6d 73 74 61 6e 63 65 73 2c 20 65 76 65 6e  cumstances, even
360f0 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 61 20   though it is a 
36100 63 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 69  copy of initiali
36110 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  zed .    ** page
36120 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20   pFrom..    */. 
36130 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d     pTo->isInit =
36140 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   0;.    rc = btr
36150 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f 29 3b  eeInitPage(pTo);
36160 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
36170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36180 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
36190 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
361a0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
361b0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
361c0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
361d0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
361e0 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20  map entries.    
361f0 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65  ** for any b-tre
36200 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  e or overflow pa
36210 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77  ges that pTo now
36220 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
36230 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a  inters to..    *
36240 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  /.    if( ISAUTO
36250 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
36260 2a 70 52 43 20 3d 20 73 65 74 43 68 69 6c 64 50  *pRC = setChildP
36270 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20 20  trmaps(pTo);.   
36280 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
36290 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64  This routine red
362a0 69 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73  istributes cells
362b0 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49   on the iParentI
362c0 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70  dx'th child of p
362d0 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61  Parent.** (herea
362e0 66 74 65 72 20 22 74 68 65 20 70 61 67 65 22 29  fter "the page")
362f0 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62   and up to 2 sib
36300 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c  lings so that al
36310 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f  l pages have abo
36320 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  ut the.** same a
36330 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70  mount of free sp
36340 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73  ace. Usually a s
36350 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e  ingle sibling on
36360 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
36370 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20  the.** page are 
36380 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  used in the bala
36390 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f  ncing, though bo
363a0 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  th siblings migh
363b0 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a  t come from one.
363c0 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65 20 70  ** side if the p
363d0 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74  age is the first
363e0 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f   or last child o
363f0 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66  f its parent. If
36400 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61   the page .** ha
36410 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 20 73  s fewer than 2 s
36420 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69  iblings (somethi
36430 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c  ng which can onl
36440 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
36450 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f  page.** is a roo
36460 74 20 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c  t page or a chil
36470 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65  d of a root page
36480 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c  ) then all avail
36490 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  able siblings.**
364a0 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
364b0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a  the balancing..*
364c0 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
364d0 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74  of siblings of t
364e0 68 65 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  he page might be
364f0 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
36500 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f  creased by .** o
36510 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20  ne or two in an 
36520 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70  effort to keep p
36530 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ages nearly full
36540 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75   but not over fu
36550 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ll. .**.** Note 
36560 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72  that when this r
36570 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
36580 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65  , some of the ce
36590 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  lls on the page.
365a0 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74  ** might not act
365b0 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ually be stored 
365c0 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  in MemPage.aData
365d0 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70  []. This can hap
365e0 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  pen.** if the pa
365f0 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ge is overfull. 
36600 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
36610 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65  ures that all ce
36620 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  lls allocated.**
36630 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64   to the page and
36640 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69   its siblings fi
36650 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61  t into MemPage.a
36660 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65  Data[] before re
36670 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
36680 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
36690 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61  balancing the pa
366a0 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
366b0 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62  ngs, cells may b
366c0 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e  e.** inserted in
366d0 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72  to or removed fr
366e0 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
366f0 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f  ge (pParent). Do
36700 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61  ing so.** may ca
36710 75 73 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  use the parent p
36720 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76  age to become ov
36730 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66  erfull or underf
36740 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20  ull. If this.** 
36750 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74  happens, it is t
36760 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
36770 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
36780 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  to invoke the co
36790 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69  rrect.** balanci
367a0 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69  ng routine to fi
367b0 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  x this problem (
367c0 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28  see the balance(
367d0 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a  ) routine). .**.
367e0 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
367f0 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  ne fails for any
36800 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68   reason, it migh
36810 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  t leave the data
36820 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72  base.** in a cor
36830 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f  rupted state. So
36840 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
36850 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61   fails, the data
36860 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  base should.** b
36870 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
36880 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61  *.** The third a
36890 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
368a0 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53  function, aOvflS
368b0 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74  pace, is a point
368c0 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65  er to a.** buffe
368d0 72 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  r big enough to 
368e0 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e 20 49  hold one page. I
368f0 66 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69 6e  f while insertin
36900 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65  g cells into the
36910 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67 65 20   parent.** page 
36920 28 70 50 61 72 65 6e 74 29 20 74 68 65 20 70 61  (pParent) the pa
36930 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65  rent page become
36940 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 69 73  s overfull, this
36950 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 75 73   buffer is.** us
36960 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
36970 70 61 72 65 6e 74 27 73 20 6f 76 65 72 66 6c 6f  parent's overflo
36980 77 20 63 65 6c 6c 73 2e 20 42 65 63 61 75 73 65  w cells. Because
36990 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
369a0 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61 78 69  nserts.** a maxi
369b0 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64 69 76 69  mum of four divi
369c0 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  der cells into t
369d0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20  he parent page, 
369e0 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a  and the maximum.
369f0 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20 63 65 6c  ** size of a cel
36a00 6c 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20  l stored within 
36a10 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  an internal node
36a20 20 69 73 20 61 6c 77 61 79 73 20 6c 65 73 73 20   is always less 
36a30 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20 74  than 1/4.** of t
36a40 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68  he page-size, th
36a50 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62  e aOvflSpace[] b
36a60 75 66 66 65 72 20 69 73 20 67 75 61 72 61 6e 74  uffer is guarant
36a70 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 0a  eed to be large.
36a80 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c  ** enough for al
36a90 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  l overflow cells
36aa0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76 66 6c  ..**.** If aOvfl
36ab0 53 70 61 63 65 20 69 73 20 73 65 74 20 74 6f 20  Space is set to 
36ac0 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  a null pointer, 
36ad0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
36ae0 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
36af0 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 23 69 66 20 64  _NOMEM..*/.#if d
36b00 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
36b10 20 26 26 20 5f 4d 53 43 5f 56 45 52 20 3e 3d 20   && _MSC_VER >= 
36b20 31 37 30 30 20 26 26 20 64 65 66 69 6e 65 64 28  1700 && defined(
36b30 5f 4d 5f 41 52 4d 29 0a 23 70 72 61 67 6d 61 20  _M_ARM).#pragma 
36b40 6f 70 74 69 6d 69 7a 65 28 22 22 2c 20 6f 66 66  optimize("", off
36b50 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ).#endif.static 
36b60 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  int balance_nonr
36b70 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  oot(.  MemPage *
36b80 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20  pParent,        
36b90 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74         /* Parent
36ba0 20 70 61 67 65 20 6f 66 20 73 69 62 6c 69 6e 67   page of sibling
36bb0 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64  s being balanced
36bc0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
36bd0 74 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  tIdx,           
36be0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
36bf0 66 20 22 74 68 65 20 70 61 67 65 22 20 69 6e 20  f "the page" in 
36c00 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75 38 20  pParent */.  u8 
36c10 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20 20 20 20  *aOvflSpace,    
36c20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36c30 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73 20  page-size bytes 
36c40 6f 66 20 73 70 61 63 65 20 66 6f 72 20 70 61 72  of space for par
36c50 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e  ent ovfl */.  in
36c60 74 20 69 73 52 6f 6f 74 2c 20 20 20 20 20 20 20  t isRoot,       
36c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36c80 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74   True if pParent
36c90 20 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65 20   is a root-page 
36ca0 2a 2f 0a 20 20 69 6e 74 20 62 42 75 6c 6b 20 20  */.  int bBulk  
36cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36cc0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
36cd0 74 68 69 73 20 63 61 6c 6c 20 69 73 20 70 61 72  this call is par
36ce0 74 20 6f 66 20 61 20 62 75 6c 6b 20 6c 6f 61 64  t of a bulk load
36cf0 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
36d00 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  d *pBt;         
36d10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f        /* The who
36d20 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
36d30 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20   int nCell = 0; 
36d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36d50 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
36d60 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
36d70 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20    int nMaxCells 
36d80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
36d90 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
36da0 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65   of apCell, szCe
36db0 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20  ll, aFrom. */.  
36dc0 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20  int nNew = 0;   
36dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36de0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
36df0 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20  in apNew[] */.  
36e00 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20  int nOld;       
36e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36e20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
36e30 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20  in apOld[] */.  
36e40 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20  int i, j, k;    
36e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36e60 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
36e70 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20  .  int nxDiv;   
36e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e90 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20  /* Next divider 
36ea0 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d  slot in pParent-
36eb0 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  >aCell[] */.  in
36ec0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
36ed0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
36ee0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
36ef0 0a 20 20 75 31 36 20 6c 65 61 66 43 6f 72 72 65  .  u16 leafCorre
36f00 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
36f10 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73  /* 4 if pPage is
36f20 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e   a leaf.  0 if n
36f30 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66  ot */.  int leaf
36f40 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
36f50 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
36f60 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20  pPage is a leaf 
36f70 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72  of a LEAFDATA tr
36f80 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ee */.  int usab
36f90 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  leSpace;        
36fa0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e       /* Bytes in
36fb0 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68   pPage beyond th
36fc0 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
36fd0 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20  t pageFlags;    
36fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
36ff0 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  lue of pPage->aD
37000 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20  ata[0] */.  int 
37010 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20  subtotal;       
37020 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74           /* Subt
37030 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e  otal of bytes in
37040 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61   cells on one pa
37050 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61  ge */.  int iSpa
37060 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ce1 = 0;        
37070 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
37080 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70  used byte of aSp
37090 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  ace1[] */.  int 
370a0 69 4f 76 66 6c 53 70 61 63 65 20 3d 20 30 3b 20  iOvflSpace = 0; 
370b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
370c0 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
370d0 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 2a 2f   aOvflSpace[] */
370e0 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68  .  int szScratch
370f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37100 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74  /* Size of scrat
37110 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73  ch memory reques
37120 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ted */.  MemPage
37130 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20   *apOld[NB];    
37140 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
37150 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62  nd up to two sib
37160 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  lings */.  MemPa
37170 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b  ge *apNew[NB+2];
37180 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65          /* pPage
37190 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69   and up to NB si
371a0 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c  blings after bal
371b0 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a  ancing */.  u8 *
371c0 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20  pRight;         
371d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
371e0 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f  tion in parent o
371f0 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20  f right-sibling 
37200 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  pointer */.  u8 
37210 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20  *apDiv[NB-1];   
37220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76            /* Div
37230 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50  ider cells in pP
37240 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63  arent */.  int c
37250 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  ntNew[NB+2];    
37260 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
37270 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63   in aCell[] of c
37280 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70  ell after i-th p
37290 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  age */.  int cnt
372a0 4f 6c 64 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  Old[NB+2];      
372b0 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20 69 6e 64        /* Old ind
372c0 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 61 66  ex in aCell[] af
372d0 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f  ter i-th page */
372e0 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b  .  int szNew[NB+
372f0 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
37300 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65  /* Combined size
37310 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 64   of cells placed
37320 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f   on i-th page */
37330 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d  .  u8 **apCell =
37340 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
37350 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67  /* All cells beg
37360 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  in balanced */. 
37370 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
37380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37390 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
373a0 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
373b0 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53  ll[] */.  u8 *aS
373c0 70 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20  pace1;          
373d0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
373e0 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69  for copies of di
373f0 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a  viders cells */.
37400 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
37410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37420 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74  * Temp var to st
37430 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ore a page numbe
37440 72 20 69 6e 20 2a 2f 0a 20 20 75 38 20 61 62 44  r in */.  u8 abD
37450 6f 6e 65 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  one[NB+2];      
37460 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 61         /* True a
37470 66 74 65 72 20 69 27 74 68 20 6e 65 77 20 70 61  fter i'th new pa
37480 67 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  ge is populated 
37490 2a 2f 0a 20 20 50 67 6e 6f 20 61 50 67 6e 6f 5b  */.  Pgno aPgno[
374a0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
374b0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
374c0 73 20 6f 66 20 6e 65 77 20 70 61 67 65 73 20 62  s of new pages b
374d0 65 66 6f 72 65 20 73 68 75 66 66 6c 69 6e 67 20  efore shuffling 
374e0 2a 2f 0a 20 20 50 67 6e 6f 20 61 50 67 4f 72 64  */.  Pgno aPgOrd
374f0 65 72 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  er[NB+2];       
37500 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 61 50 67    /* Copy of aPg
37510 6e 6f 5b 5d 20 75 73 65 64 20 66 6f 72 20 73 6f  no[] used for so
37520 72 74 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20  rting pages */. 
37530 20 75 31 36 20 61 50 67 46 6c 61 67 73 5b 4e 42   u16 aPgFlags[NB
37540 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  +2];          /*
37550 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20   flags field of 
37560 6e 65 77 20 70 61 67 65 73 20 62 65 66 6f 72 65  new pages before
37570 20 73 68 75 66 66 6c 69 6e 67 20 2a 2f 0a 0a 20   shuffling */.. 
37580 20 6d 65 6d 73 65 74 28 61 62 44 6f 6e 65 2c 20   memset(abDone, 
37590 30 2c 20 73 69 7a 65 6f 66 28 61 62 44 6f 6e 65  0, sizeof(abDone
375a0 29 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 72  ));.  pBt = pPar
375b0 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  ent->pBt;.  asse
375c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
375d0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
375e0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
375f0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
37600 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
37610 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 23 69  >pDbPage) );..#i
37620 66 20 30 0a 20 20 54 52 41 43 45 28 28 22 42 41  f 0.  TRACE(("BA
37630 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67  LANCE: begin pag
37640 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64  e %d child of %d
37650 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
37660 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  , pParent->pgno)
37670 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
37680 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 50  At this point pP
37690 61 72 65 6e 74 20 6d 61 79 20 68 61 76 65 20 61  arent may have a
376a0 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66  t most one overf
376b0 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66  low cell. And if
376c0 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76 65 72 66  .  ** this overf
376d0 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70 72 65 73  low cell is pres
376e0 65 6e 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ent, it must be 
376f0 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 0a 20  the cell with . 
37700 20 2a 2a 20 69 6e 64 65 78 20 69 50 61 72 65 6e   ** index iParen
37710 74 49 64 78 2e 20 54 68 69 73 20 73 63 65 6e 61  tIdx. This scena
37720 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74 20  rio comes about 
37730 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
37740 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65  on.  ** is calle
37750 64 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20 66  d (indirectly) f
37760 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65  rom sqlite3Btree
37770 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f 0a 20  Delete()..  */. 
37780 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
37790 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c  ->nOverflow==0 |
377a0 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  | pParent->nOver
377b0 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73 73  flow==1 );.  ass
377c0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f  ert( pParent->nO
377d0 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50  verflow==0 || pP
377e0 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d  arent->aiOvfl[0]
377f0 3d 3d 69 50 61 72 65 6e 74 49 64 78 20 29 3b 0a  ==iParentIdx );.
37800 0a 20 20 69 66 28 20 21 61 4f 76 66 6c 53 70 61  .  if( !aOvflSpa
37810 63 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ce ){.    return
37820 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
37830 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68   }..  /* Find th
37840 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
37850 74 6f 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f  to balance. Also
37860 20 6c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c   locate the cell
37870 73 20 69 6e 20 70 50 61 72 65 6e 74 20 0a 20 20  s in pParent .  
37880 2a 2a 20 74 68 61 74 20 64 69 76 69 64 65 20 74  ** that divide t
37890 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20  he siblings. An 
378a0 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
378b0 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69  to find NN sibli
378c0 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74  ngs on .  ** eit
378d0 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
378e0 65 2e 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73  e. More siblings
378f0 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20   are taken from 
37900 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65  one side, howeve
37910 72 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 72  r, .  ** if ther
37920 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e  e are fewer than
37930 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
37940 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20  the other side. 
37950 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20  If pParent.  ** 
37960 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20  has NB or fewer 
37970 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c  children then al
37980 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50  l children of pP
37990 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e  arent are taken.
379a0 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69    .  **.  ** Thi
379b0 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70  s loop also drop
379c0 73 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  s the divider ce
379d0 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20 70 61 72  lls from the par
379e0 65 6e 74 20 70 61 67 65 2e 20 54 68 69 73 0a 20  ent page. This. 
379f0 20 2a 2a 20 77 61 79 2c 20 74 68 65 20 72 65 6d   ** way, the rem
37a00 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 66 75  ainder of the fu
37a10 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
37a20 68 61 76 65 20 74 6f 20 64 65 61 6c 20 77 69 74  have to deal wit
37a30 68 20 61 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66  h any.  ** overf
37a40 6c 6f 77 20 63 65 6c 6c 73 20 69 6e 20 74 68 65  low cells in the
37a50 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20 73 69   parent page, si
37a60 6e 63 65 20 69 66 20 61 6e 79 20 65 78 69 73 74  nce if any exist
37a70 65 64 20 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a  ed they will.  *
37a80 2a 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  * have already b
37a90 65 65 6e 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a  een removed..  *
37aa0 2f 0a 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d  /.  i = pParent-
37ab0 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61  >nOverflow + pPa
37ac0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69  rent->nCell;.  i
37ad0 66 28 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78  f( i<2 ){.    nx
37ae0 44 69 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Div = 0;.  }else
37af0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 42  {.    assert( bB
37b00 75 6c 6b 3d 3d 30 20 7c 7c 20 62 42 75 6c 6b 3d  ulk==0 || bBulk=
37b10 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 69 50  =1 );.    if( iP
37b20 61 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20  arentIdx==0 ){  
37b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
37b40 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b        nxDiv = 0;
37b50 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
37b60 50 61 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a  ParentIdx==i ){.
37b70 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d        nxDiv = i-
37b80 32 2b 62 42 75 6c 6b 3b 0a 20 20 20 20 7d 65 6c  2+bBulk;.    }el
37b90 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
37ba0 28 20 62 42 75 6c 6b 3d 3d 30 20 29 3b 0a 20 20  ( bBulk==0 );.  
37bb0 20 20 20 20 6e 78 44 69 76 20 3d 20 69 50 61 72      nxDiv = iPar
37bc0 65 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a  entIdx-1;.    }.
37bd0 20 20 20 20 69 20 3d 20 32 2d 62 42 75 6c 6b 3b      i = 2-bBulk;
37be0 0a 20 20 7d 0a 20 20 6e 4f 6c 64 20 3d 20 69 2b  .  }.  nOld = i+
37bf0 31 3b 0a 20 20 69 66 28 20 28 69 2b 6e 78 44 69  1;.  if( (i+nxDi
37c00 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
37c10 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e  flow)==pParent->
37c20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69  nCell ){.    pRi
37c30 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e  ght = &pParent->
37c40 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
37c50 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d  drOffset+8];.  }
37c60 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74  else{.    pRight
37c70 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72   = findCell(pPar
37c80 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61  ent, i+nxDiv-pPa
37c90 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29  rent->nOverflow)
37ca0 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67  ;.  }.  pgno = g
37cb0 65 74 34 62 79 74 65 28 70 52 69 67 68 74 29 3b  et4byte(pRight);
37cc0 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
37cd0 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
37ce0 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
37cf0 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 30 29 3b  , &apOld[i], 0);
37d00 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
37d10 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c       memset(apOl
37d20 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65  d, 0, (i+1)*size
37d30 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20  of(MemPage*));. 
37d40 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
37d50 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
37d60 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b  .    nMaxCells +
37d70 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43  = 1+apOld[i]->nC
37d80 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f  ell+apOld[i]->nO
37d90 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28  verflow;.    if(
37da0 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61   (i--)==0 ) brea
37db0 6b 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e 78  k;..    if( i+nx
37dc0 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 69  Div==pParent->ai
37dd0 4f 76 66 6c 5b 30 5d 20 26 26 20 70 50 61 72 65  Ovfl[0] && pPare
37de0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  nt->nOverflow ){
37df0 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
37e00 3d 20 70 50 61 72 65 6e 74 2d 3e 61 70 4f 76 66  = pParent->apOvf
37e10 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f  l[0];.      pgno
37e20 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
37e30 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e  v[i]);.      szN
37e40 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  ew[i] = cellSize
37e50 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44  Ptr(pParent, apD
37e60 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50  iv[i]);.      pP
37e70 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
37e80 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
37e90 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
37ea0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  = findCell(pPare
37eb0 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
37ec0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b  ent->nOverflow);
37ed0 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  .      pgno = ge
37ee0 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
37ef0 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d  ;.      szNew[i]
37f00 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
37f10 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
37f20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f  );..      /* Dro
37f30 70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  p the cell from 
37f40 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
37f50 20 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20   apDiv[i] still 
37f60 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20  points to.      
37f70 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  ** the cell with
37f80 69 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65  in the parent, e
37f90 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61  ven though it ha
37fa0 73 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a  s been dropped..
37fb0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
37fc0 20 73 61 66 65 20 62 65 63 61 75 73 65 20 64 72   safe because dr
37fd0 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e  opping a cell on
37fe0 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ly overwrites th
37ff0 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a  e first.      **
38000 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69   four bytes of i
38010 74 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  t, and this func
38020 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  tion does not ne
38030 65 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  ed the first.   
38040 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73     ** four bytes
38050 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
38060 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69  cell. So the poi
38070 6e 74 65 72 20 69 73 20 73 61 66 65 20 74 6f 20  nter is safe to 
38080 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74  use.      ** lat
38090 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a  er on.  .      *
380a0 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e  *.      ** But n
380b0 6f 74 20 69 66 20 77 65 20 61 72 65 20 69 6e 20  ot if we are in 
380c0 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
380d0 64 65 2e 20 49 6e 20 73 65 63 75 72 65 2d 64 65  de. In secure-de
380e0 6c 65 74 65 20 6d 6f 64 65 2c 0a 20 20 20 20 20  lete mode,.     
380f0 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c   ** the dropCell
38100 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
38110 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 65 6e  overwrite the en
38120 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a  tire cell with z
38130 65 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  eroes..      ** 
38140 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 65  In this case, te
38150 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74  mporarily copy t
38160 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65  he cell into the
38170 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20   aOvflSpace[].  
38180 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49      ** buffer. I
38190 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64  t will be copied
381a0 20 6f 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f   out again as so
381b0 6f 6e 20 61 73 20 74 68 65 20 61 53 70 61 63 65  on as the aSpace
381c0 5b 5d 20 62 75 66 66 65 72 0a 20 20 20 20 20 20  [] buffer.      
381d0 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e  ** is allocated.
381e0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
381f0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
38200 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
38210 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
38220 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 69  iOff;..        i
38230 4f 66 66 20 3d 20 53 51 4c 49 54 45 5f 50 54 52  Off = SQLITE_PTR
38240 5f 54 4f 5f 49 4e 54 28 61 70 44 69 76 5b 69 5d  _TO_INT(apDiv[i]
38250 29 20 2d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  ) - SQLITE_PTR_T
38260 4f 5f 49 4e 54 28 70 50 61 72 65 6e 74 2d 3e 61  O_INT(pParent->a
38270 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69  Data);.        i
38280 66 28 20 28 69 4f 66 66 2b 73 7a 4e 65 77 5b 69  f( (iOff+szNew[i
38290 5d 29 3e 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  ])>(int)pBt->usa
382a0 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
382b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
382c0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
382d0 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
382e0 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a  apOld, 0, (i+1)*
382f0 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29  sizeof(MemPage*)
38300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
38310 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
38320 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
38330 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
38340 70 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 69  py(&aOvflSpace[i
38350 4f 66 66 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20  Off], apDiv[i], 
38360 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20  szNew[i]);.     
38370 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
38380 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69  &aOvflSpace[apDi
38390 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44  v[i]-pParent->aD
383a0 61 74 61 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ata];.        }.
383b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 72        }.      dr
383c0 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  opCell(pParent, 
383d0 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
383e0 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65  >nOverflow, szNe
383f0 77 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20  w[i], &rc);.    
38400 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
38410 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c   nMaxCells a mul
38420 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72  tiple of 4 in or
38430 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20  der to preserve 
38440 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67  8-byte.  ** alig
38450 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43  nment */.  nMaxC
38460 65 6c 6c 73 20 3d 20 28 6e 4d 61 78