/ Hex Artifact Content
Login

Artifact 3e320cac836546c905bd90007074d887980aa70e:


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 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3040: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3050: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3060: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3070: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3090: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
30a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30b0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30c0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30e0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30f0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
3100: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3110: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3120: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3130: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3140: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3150: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3160: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3170: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3180: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3190: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
31a0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31b0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31c0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31d0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
3200: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3210: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3230: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3240: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3250: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3260: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3270: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3280: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
32a0: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32b0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32c0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32d0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32e0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32f0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
3300: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3310: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3320: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3330: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3340: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3350: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3370: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3380: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3390: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
33a0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33b0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33c0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33d0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33f0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
3400: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3410: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3430: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3440: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3450: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3460: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3470: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3480: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3490: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
34a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34b0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34d0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34e0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34f0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
3500: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3510: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3520: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3540: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3550: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3560: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3570: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3580: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3590: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
35a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35b0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35c0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35e0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35f0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
3600: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3610: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3620: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3630: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3640: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3650: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3660: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3670: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3680: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3690: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
36a0: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36c0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36d0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36e0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36f0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
3700: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3710: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3720: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3730: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3740: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3750: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3760: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3770: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3780: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3790: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
37a0: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37b0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37c0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37d0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37f0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
3800: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3810: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3820: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3830: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3840: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3850: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3860: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3870: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3880: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
38a0: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38b0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38c0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38d0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38e0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38f0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
3900: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3910: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3920: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3930: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3940: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3950: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3960: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3970: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3980: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3990: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
39a0: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3a00: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a10: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a20: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a30: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a40: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a60: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3a70: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3a80: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3a90: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
3aa0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3ab0: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
3ac0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3ad0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
3ae0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
3af0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3b00: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
3b10: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
3b20: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
3b30: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b40: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3b50: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
3b60: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
3b70: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
3b80: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
3b90: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
3ba0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3bb0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
3bc0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
3bd0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
3be0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3bf0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3c00: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3c10: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
3c20: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
3c30: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
3c40: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
3c50: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
3c60: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
3c70: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3c80: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
3c90: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
3ca0: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3cb0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3cc0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3cd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3ce0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3cf0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
3d00: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
3d10: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3d20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d30: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3d40: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3d50: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3d60: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3d70: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
3d80: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
3d90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3da0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
3db0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3dc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
3dd0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
3de0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
3df0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
3e00: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
3e10: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3e20: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3e30: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3e40: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3e50: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
3e60: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3e70: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3e80: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3e90: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3ea0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3eb0: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
3ec0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3ed0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
3ee0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
3ef0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
3f00: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
3f10: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3f20: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3f30: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3f40: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3f50: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3f60: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3f70: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3f80: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3f90: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3fa0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3fb0: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
3fc0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
3fd0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
3fe0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
3ff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4000: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4010: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
4020: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
4030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4040: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
4050: 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  eck */.  i64 iRo
4060: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
4070: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
4080: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
4090: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
40a0: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
40b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
40c0: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
40d0: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
40e0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42  BtCursor *p;.  B
40f0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
4100: 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73  Btree->pBt;.  as
4110: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
4120: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74  eeHoldsMutex(pBt
4130: 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  ree) );.  for(p=
4140: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
4150: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
4160: 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c 61    if( (p->curFla
4170: 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62 6c  gs & BTCF_Incrbl
4180: 6f 62 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  ob)!=0.     && (
4190: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20  isClearTable || 
41a0: 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52  p->info.nKey==iR
41b0: 6f 77 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ow).    ){.     
41c0: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
41d0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
41e0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
41f0: 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69    /* Stub functi
4200: 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42  on when INCRBLOB
4210: 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20   is omitted */. 
4220: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
4230: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
4240: 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  rs(x,y,z).#endif
4250: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
4260: 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a  INCRBLOB */../*.
4270: 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20  ** Set bit pgno 
4280: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  of the BtShared.
4290: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
42a0: 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  ec. This is call
42b0: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61  ed .** when a pa
42c0: 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73  ge that previous
42d0: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74  ly contained dat
42e0: 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65  a becomes a free
42f0: 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70  -list leaf .** p
4300: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  age..**.** The B
4310: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4320: 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74  ent bitvec exist
4330: 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  s to work around
4340: 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62   an obscure.** b
4350: 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65  ug caused by the
4360: 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20   interaction of 
4370: 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70  two useful IO op
4380: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72  timizations surr
4390: 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d  ounding.** free-
43a0: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a  list leaf pages:
43b0: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e  .**.**   1) When
43c0: 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c   all data is del
43d0: 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65  eted from a page
43e0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65   and the page be
43f0: 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20  comes.**      a 
4400: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4410: 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73  age, the page is
4420: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
4430: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
4440: 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69       (as free-li
4450: 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f  st leaf pages co
4460: 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67  ntain no meaning
4470: 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74  ful data). Somet
4480: 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63  imes.**      suc
4490: 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20  h a page is not 
44a0: 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  even journalled 
44b0: 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  (as it will not 
44c0: 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20  be modified,.** 
44d0: 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20       why bother 
44e0: 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29  journalling it?)
44f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
4500: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4510: 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65  af page is reuse
4520: 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69  d, its content i
4530: 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20  s not read.**   
4540: 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61     from the data
4550: 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20  base or written 
4560: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
4570: 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20  ile (why should 
4580: 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69  it.**      be, i
4590: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61  f it is not at a
45a0: 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e  ll meaningful?).
45b0: 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65  .**.** By themse
45c0: 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69  lves, these opti
45d0: 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66  mizations work f
45e0: 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20  ine and provide 
45f0: 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f  a handy.** perfo
4600: 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20  rmance boost to 
4610: 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69  bulk delete or i
4620: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
4630: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a  . However, if.**
4640: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
4650: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
4660: 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  t and then reuse
4670: 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  d within the sam
4680: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
4690: 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65  , a problem come
46a0: 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67  s up. If the pag
46b0: 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  e is not journal
46c0: 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69  led when.** it i
46d0: 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  s moved to the f
46e0: 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20  ree-list and it 
46f0: 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72  is also not jour
4700: 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a  nalled when it.*
4710: 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  * is extracted f
4720: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
4730: 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68  t and reused, th
4740: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
4750: 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c  data.** may be l
4760: 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e  ost. In the even
4770: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  t of a rollback,
4780: 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70   it may not be p
4790: 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65  ossible.** to re
47a0: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
47b0: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
47c0: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
47d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75  ..**.** The solu
47e0: 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68  tion is the BtSh
47f0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4800: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4810: 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20  r a page is .** 
4820: 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20  moved to become 
4830: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4840: 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65   page, the corre
4850: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a  sponding bit is.
4860: 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69  ** set in the bi
4870: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
4880: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78   leaf page is ex
4890: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
48a0: 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f   free-list,.** o
48b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62  ptimization 2 ab
48c0: 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69  ove is omitted i
48d0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
48e0: 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61  ing bit is alrea
48f0: 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53  dy.** set in BtS
4900: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4910: 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  t. The contents 
4920: 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72  of the bitvec ar
4930: 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20  e cleared.** at 
4940: 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
4950: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
4960: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4970: 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42  eSetHasContent(B
4980: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
4990: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
49a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
49b0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
49c0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61  Content ){.    a
49d0: 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74  ssert( pgno<=pBt
49e0: 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70  ->nPage );.    p
49f0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4a00: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
4a10: 72 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65  reate(pBt->nPage
4a20: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d  );.    if( !pBt-
4a30: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
4a40: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
4a50: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
4a60: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
4a70: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
4a80: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
4a90: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
4aa0: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
4ab0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
4ac0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4ad0: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
4ae0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4af0: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
4b00: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4b10: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
4b20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
4b30: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4b40: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4b50: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
4b60: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
4b70: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
4b80: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
4b90: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
4ba0: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
4bb0: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
4bc0: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
4bd0: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
4be0: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
4bf0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
4c00: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
4c10: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4c20: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
4c30: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
4c40: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
4c50: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
4c60: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
4c70: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
4c80: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
4c90: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
4ca0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
4cb0: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
4cc0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4cd0: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
4ce0: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
4cf0: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
4d00: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
4d10: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
4d20: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
4d30: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
4d40: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4d50: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
4d60: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
4d70: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
4d80: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
4d90: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
4da0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
4db0: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
4dc0: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
4dd0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
4de0: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
4df0: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
4e00: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4e10: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
4e20: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
4e30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
4e40: 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
4e50: 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43  Page[i]);.    pC
4e60: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
4e70: 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  0;.  }.  pCur->i
4e80: 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f  Page = -1;.}.../
4e90: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
4ea0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
4eb0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
4ec0: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
4ed0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
4ee0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
4ef0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
4f00: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
4f10: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
4f20: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
4f30: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
4f40: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
4f50: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
4f60: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
4f70: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
4f80: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
4f90: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
4fa0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
4fb0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
4fc0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
4fd0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
4fe0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
4ff0: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
5000: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
5010: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
5020: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5030: 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
5040: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
5050: 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e  e(pCur, &pCur->n
5060: 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
5070: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
5080: 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63    /* KeySize() c
5090: 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20  annot fail */.. 
50a0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
50b0: 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20  n intKey table, 
50c0: 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63  then the above c
50d0: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53  all to BtreeKeyS
50e0: 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65  ize().  ** store
50f0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  s the integer ke
5100: 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e  y in pCur->nKey.
5110: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
5120: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a  is value is.  **
5130: 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
5140: 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
5150: 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74  , if pCur is not
5160: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b   open on an intK
5170: 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74  ey.  ** table, t
5180: 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  hen malloc space
5190: 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74   for and store t
51a0: 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79  he pCur->nKey by
51b0: 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a  tes of key .  **
51c0: 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66   data..  */.  if
51d0: 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ( 0==pCur->apPag
51e0: 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  e[0]->intKey ){.
51f0: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d      void *pKey =
5200: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
5210: 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  pCur->nKey );.  
5220: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
5230: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5240: 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30  BtreeKey(pCur, 0
5250: 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  , (int)pCur->nKe
5260: 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
5270: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5280: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
5290: 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a  r->pKey = pKey;.
52a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
52b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
52c0: 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  e(pKey);.      }
52d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
52e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
52f0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
5300: 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e   assert( !pCur->
5310: 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
5320: 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79  y || !pCur->pKey
5330: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
5340: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5350: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
5360: 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72 29  ursorPages(pCur)
5370: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
5380: 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55  te = CURSOR_REQU
5390: 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20  IRESEEK;.  }..  
53a0: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
53b0: 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
53c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
53d0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
53e0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
53f0: 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
5400: 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  E saveCursorsOnL
5410: 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67  ist(BtCursor*,Pg
5420: 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a  no,BtCursor*);..
5430: 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70  /*.** Save the p
5440: 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20  ositions of all 
5450: 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74 20  cursors (except 
5460: 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61 72  pExcept) that ar
5470: 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65  e open on.** the
5480: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
5490: 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53  -page iRoot.  "S
54a0: 61 76 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  aving the cursor
54b0: 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73   position" means
54c0: 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63   that.** the loc
54d0: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72  ation in the btr
54e0: 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64  ee is remembered
54f0: 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
5500: 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a  hat it can be.**
5510: 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74   moved back to t
5520: 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74  he same spot aft
5530: 65 72 20 74 68 65 20 62 74 72 65 65 20 68 61 73  er the btree has
5540: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
5550: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
5560: 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20   is called just 
5570: 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45  before cursor pE
5580: 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f  xcept is used to
5590: 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74   modify the.** t
55a0: 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c  able, for exampl
55b0: 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65  e in BtreeDelete
55c0: 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72  () or BtreeInser
55d0: 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65  t()..**.** Imple
55e0: 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20  mentation note: 
55f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65   This routine me
5600: 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73  rely checks to s
5610: 65 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72  ee if any cursor
5620: 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20  s.** need to be 
5630: 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73  saved.  It calls
5640: 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73   out to saveCurs
5650: 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74  orsOnList() in t
5660: 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20  he (unusual).** 
5670: 65 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f  event that curso
5680: 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74  rs are in need t
5690: 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a  o being saved..*
56a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
56b0: 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68  eAllCursors(BtSh
56c0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
56d0: 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20  iRoot, BtCursor 
56e0: 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43  *pExcept){.  BtC
56f0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
5700: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
5710: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
5720: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
5730: 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45  pExcept==0 || pE
5740: 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20  xcept->pBt==pBt 
5750: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
5760: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
5770: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
5780: 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28   p!=pExcept && (
5790: 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70  0==iRoot || p->p
57a0: 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20  gnoRoot==iRoot) 
57b0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
57c0: 65 74 75 72 6e 20 70 20 3f 20 73 61 76 65 43 75  eturn p ? saveCu
57d0: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69  rsorsOnList(p, i
57e0: 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 20 3a  Root, pExcept) :
57f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
5800: 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f  * This helper ro
5810: 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c  utine to saveAll
5820: 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65  Cursors does the
5830: 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20   actual work of 
5840: 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75  saving.** the cu
5850: 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65  rsors if and whe
5860: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f  n a cursor is fo
5870: 75 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c  und that actuall
5880: 79 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e  y requires savin
5890: 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  g..** The common
58a0: 20 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f   case is that no
58b0: 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f   cursors need to
58c0: 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68   be saved, so th
58d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
58e0: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
58f0: 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61   its caller to a
5900: 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
5910: 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d   stack pointer m
5920: 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ovement..*/.stat
5930: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
5940: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
5950: 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75  rsOnList(.  BtCu
5960: 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20  rsor *p,        
5970: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75   /* The first cu
5980: 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20  rsor that needs 
5990: 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  saving */.  Pgno
59a0: 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20   iRoot,         
59b0: 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75   /* Only save cu
59c0: 72 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69  rsor with this i
59d0: 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69  Root. Save all i
59e0: 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75  f zero */.  BtCu
59f0: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20  rsor *pExcept   
5a00: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20   /* Do not save 
5a10: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29  this cursor */.)
5a20: 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  {.  do{.    if( 
5a30: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
5a40: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
5a50: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
5a60: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
5a70: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
5a80: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69  LID ){.        i
5a90: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
5aa0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
5ab0: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
5ac0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
5ad0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
5ae0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5af0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5b00: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
5b10: 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ge>0 );.        
5b20: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
5b30: 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
5b40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5b50: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
5b60: 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20   }while( p );.  
5b70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5b80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
5b90: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
5ba0: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
5bb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
5bc0: 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74  eeClearCursor(Bt
5bd0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
5be0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
5bf0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
5c00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
5c10: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
5c20: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
5c30: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
5c40: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
5c50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68  ;.}../*.** In th
5c60: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74  is version of Bt
5c70: 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20  reeMoveto, pKey 
5c80: 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65  is a packed inde
5c90: 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68  x record.** such
5ca0: 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64   as is generated
5cb0: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
5cc0: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55  ecord opcode.  U
5cd0: 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63  npack the.** rec
5ce0: 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  ord and then cal
5cf0: 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  l BtreeMovetoUnp
5d00: 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68  acked() to do th
5d10: 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e work..*/.stati
5d20: 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74  c int btreeMovet
5d30: 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
5d40: 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73  Cur,     /* Curs
5d50: 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  or open on the b
5d60: 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63  tree to be searc
5d70: 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  hed */.  const v
5d80: 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
5d90: 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68  Packed key if th
5da0: 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e  e btree is an in
5db0: 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  dex */.  i64 nKe
5dc0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
5dd0: 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  Integer key for 
5de0: 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66  tables.  Size of
5df0: 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65   pKey for indice
5e00: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c  s */.  int bias,
5e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
5e20: 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  as search to the
5e30: 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
5e40: 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
5e50: 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
5e60: 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
5e70: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64     /* Status cod
5ea0: 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  e */.  UnpackedR
5eb0: 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20  ecord *pIdxKey; 
5ec0: 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e    /* Unpacked in
5ed0: 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61  dex key */.  cha
5ee0: 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 20 20  r aSpace[200];  
5ef0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
5f00: 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65  space for pIdxKe
5f10: 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  y - to avoid a m
5f20: 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
5f30: 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69  *pFree = 0;..  i
5f40: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
5f50: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36  ssert( nKey==(i6
5f60: 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20  4)(int)nKey );. 
5f70: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
5f80: 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
5f90: 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20  ackedRecord(.   
5fa0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49       pCur->pKeyI
5fb0: 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a  nfo, aSpace, siz
5fc0: 65 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46  eof(aSpace), &pF
5fd0: 72 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ree.    );.    i
5fe0: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
5ff0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6000: 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MEM;.    sqlite3
6010: 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
6020: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c  (pCur->pKeyInfo,
6030: 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79   (int)nKey, pKey
6040: 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
6050: 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69  if( pIdxKey->nFi
6060: 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eld==0 ){.      
6070: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
6080: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
6090: 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20  , pFree);.      
60a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
60b0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
60c0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
60d0: 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  IdxKey = 0;.  }.
60e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
60f0: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
6100: 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c  d(pCur, pIdxKey,
6110: 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65   nKey, bias, pRe
6120: 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20  s);.  if( pFree 
6130: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
6140: 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49  Free(pCur->pKeyI
6150: 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b  nfo->db, pFree);
6160: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6170: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f  ;.}../*.** Resto
6180: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  re the cursor to
6190: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
61a0: 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63   was in (or as c
61b0: 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69  lose to as possi
61c0: 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76  ble).** when sav
61d0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
61e0: 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f  ) was called. No
61f0: 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c  te that this cal
6200: 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a  l deletes the .*
6210: 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  * saved position
6220: 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20   info stored by 
6230: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6240: 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63  on(), so there c
6250: 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74  an be.** at most
6260: 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72   one effective r
6270: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6280: 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65  tion() call afte
6290: 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43  r each .** saveC
62a0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e  ursorPosition().
62b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
62c0: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
62d0: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
62e0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
62f0: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63   rc;.  assert( c
6300: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
6310: 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
6320: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  t( pCur->eState>
6330: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
6340: 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
6350: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6360: 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
6370: 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
6380: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72  Next;.  }.  pCur
6390: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
63a0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20  R_INVALID;.  rc 
63b0: 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  = btreeMoveto(pC
63c0: 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20  ur, pCur->pKey, 
63d0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26  pCur->nKey, 0, &
63e0: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b  pCur->skipNext);
63f0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6400: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
6410: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
6420: 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Key);.    pCur->
6430: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  pKey = 0;.    as
6440: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
6450: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
6460: 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
6470: 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
6480: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
6490: 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43  ->skipNext && pC
64a0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
64b0: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
64c0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
64d0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
64e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
64f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
6500: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
6510: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
6520: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
6530: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
6540: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72  ? \.         btr
6550: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
6560: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
6570: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
6580: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
6590: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
65a0: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
65b0: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
65c0: 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  osition where.**
65d0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61   it was last pla
65e0: 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e  ced, or has been
65f0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72   invalidated for
6600: 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f   any other reaso
6610: 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61  n..** Cursors ca
6620: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
6630: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
6640: 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65  nting at is dele
6650: 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20  ted out.** from 
6660: 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20  under them, for 
6670: 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72  example.  Cursor
6680: 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65   might also move
6690: 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69   if a btree.** i
66a0: 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a  s rebalanced..**
66b0: 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
66c0: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
66d0: 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e  NULL cursor poin
66e0: 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ter returns fals
66f0: 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  e..**.** Use the
6700: 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65   separate sqlite
6710: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
6720: 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ore() routine to
6730: 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f   restore a curso
6740: 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65  r.** back to whe
6750: 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  re it ought to b
6760: 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e if this routin
6770: 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a  e returns true..
6780: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
6790: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
67a0: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
67b0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
67c0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
67d0: 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _VALID;.}../*.**
67e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
67f0: 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20  stores a cursor 
6800: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
6810: 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66  inal position af
6820: 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65  ter it.** has be
6830: 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65  en moved by some
6840: 20 6f 75 74 73 69 64 65 20 61 63 74 69 76 69 74   outside activit
6850: 79 20 28 73 75 63 68 20 61 73 20 61 20 62 74 72  y (such as a btr
6860: 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a  ee rebalance or.
6870: 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20  ** a row having 
6880: 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
6890: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
68a0: 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a  cursor).  .**.**
68b0: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65   On success, the
68c0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
68d0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c  parameter is fal
68e0: 73 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  se if the cursor
68f0: 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e   is left.** poin
6900: 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20  ting at exactly 
6910: 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a  the same row.  *
6920: 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20  pDifferntRow is 
6930: 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73  the row the curs
6940: 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69  or.** was pointi
6950: 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64  ng to has been d
6960: 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20  eleted, forcing 
6970: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
6980: 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e  int to some.** n
6990: 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a  earby row..**.**
69a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
69b0: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
69c0: 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72  led for a cursor
69d0: 20 74 68 61 74 20 6a 75 73 74 20 72 65 74 75 72   that just retur
69e0: 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d  ned.** TRUE from
69f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
6a00: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a  sorHasMoved()..*
6a10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
6a20: 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
6a30: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
6a40: 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52  int *pDifferentR
6a50: 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ow){.  int rc;..
6a60: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
6a70: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
6a80: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
6a90: 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72  SOR_VALID );.  r
6aa0: 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
6ab0: 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
6ac0: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
6ad0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
6ae0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
6af0: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
6b00: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
6b10: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 4e 45 56 45  OR_VALID || NEVE
6b20: 52 28 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  R(pCur->skipNext
6b30: 21 3d 30 29 20 29 7b 0a 20 20 20 20 2a 70 44 69  !=0) ){.    *pDi
6b40: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a  fferentRow = 1;.
6b50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 44    }else{.    *pD
6b60: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b  ifferentRow = 0;
6b70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
6b80: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
6b90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6ba0: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
6bb0: 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75   Given a page nu
6bc0: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61  mber of a regula
6bd0: 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  r database page,
6be0: 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   return the page
6bf0: 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
6c00: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  he pointer-map p
6c10: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
6c20: 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  s the entry for 
6c30: 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67  the.** input pag
6c40: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
6c50: 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20  Return 0 (not a 
6c60: 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20  valid page) for 
6c70: 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68  pgno==1 since th
6c80: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69  ere is.** no poi
6c90: 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61  nter map associa
6ca0: 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31 2e  ted with page 1.
6cb0: 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f    The integrity_
6cc0: 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72  check logic.** r
6cd0: 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74 72  equires that ptr
6ce0: 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d  mapPageno(*,1)!=
6cf0: 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  1..*/.static Pgn
6d00: 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42  o ptrmapPageno(B
6d10: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
6d20: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
6d30: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6d40: 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70  ;.  Pgno iPtrMap
6d50: 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28  , ret;.  assert(
6d60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6d70: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
6d80: 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20  );.  if( pgno<2 
6d90: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50  ) return 0;.  nP
6da0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d  agesPerMapPage =
6db0: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
6dc0: 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61  e/5)+1;.  iPtrMa
6dd0: 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61  p = (pgno-2)/nPa
6de0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
6df0: 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a   ret = (iPtrMap*
6e00: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6e10: 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65  ) + 2; .  if( re
6e20: 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
6e30: 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
6e40: 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ret++;.  }.  re
6e50: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
6e60: 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72  ** Write an entr
6e70: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
6e80: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
6e90: 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74  is routine updat
6ea0: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
6eb0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
6ec0: 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a  e number 'key'.*
6ed0: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70  * so that it map
6ee0: 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65  s to type 'eType
6ef0: 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  ' and parent pag
6f00: 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e  e number 'pgno'.
6f10: 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69  .**.** If *pRC i
6f20: 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d  s initially non-
6f30: 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45  zero (non-SQLITE
6f40: 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72  _OK) then this r
6f50: 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e  outine is.** a n
6f60: 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72  o-op.  If an err
6f70: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61  or occurs, the a
6f80: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
6f90: 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e   code is written
6fa0: 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a  .** into *pRC..*
6fb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
6fc0: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
6fd0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
6fe0: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
6ff0: 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43  parent, int *pRC
7000: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
7010: 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f  Page;  /* The po
7020: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
7030: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
7040: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
7050: 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f  nter map data */
7060: 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b  .  Pgno iPtrmap;
7070: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
7080: 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d  ter map page num
7090: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ber */.  int off
70a0: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66  set;       /* Of
70b0: 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20  fset in pointer 
70c0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
70d0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
70e0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
70f0: 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
7100: 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
7110: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
7120: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7130: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
7140: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
7150: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
7160: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
7170: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
7180: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
7190: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
71a0: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
71b0: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
71c0: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
71d0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
71e0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
71f0: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
7200: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7210: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7220: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7230: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
7240: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
7250: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
7260: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
7270: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
7280: 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
7290: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
72a0: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
72b0: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
72c0: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
72d0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
72e0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
72f0: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
7300: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7310: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7320: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
7330: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  exit;.  }.  asse
7340: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
7350: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
7360: 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61  ze-5 );.  pPtrma
7370: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
7380: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
7390: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
73a0: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
73b0: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
73c0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
73d0: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
73e0: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
73f0: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
7400: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
7410: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
7420: 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d  ;.    *pRC= rc =
7430: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
7440: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
7450: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7460: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
7470: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
7480: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
7490: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
74a0: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
74b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d  .    }.  }..ptrm
74c0: 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ap_exit:.  sqlit
74d0: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
74e0: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
74f0: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
7500: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
7510: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
7520: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
7530: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7540: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
7550: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
7560: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
7570: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
7580: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
7590: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
75a0: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
75b0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
75c0: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
75d0: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
75e0: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
75f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
7600: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
7610: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
7620: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
7630: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
7640: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
7650: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7660: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
7670: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
7680: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
7690: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
76a0: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
76b0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
76c0: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
76d0: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
76e0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
76f0: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
7700: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
7710: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
7720: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7730: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
7740: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
7750: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
7760: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
7770: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
7780: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
7790: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
77a0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
77b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
77c0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
77d0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
77e0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
77f0: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
7800: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
7810: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
7820: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
7830: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
7840: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
7850: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7860: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7870: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7880: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7890: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
78a0: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
78b0: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
78c0: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
78d0: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
78e0: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
78f0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
7900: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
7910: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
7920: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
7930: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
7940: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
7950: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7960: 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  T;.  return SQLI
7970: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20  TE_OK;.}..#else 
7980: 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51  /* if defined SQ
7990: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
79a0: 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e  CUUM */.  #defin
79b0: 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c  e ptrmapPut(w,x,
79c0: 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e  y,z,rc).  #defin
79d0: 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c  e ptrmapGet(w,x,
79e0: 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  y,z) SQLITE_OK. 
79f0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
7a00: 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20  utOvflPtr(x, y, 
7a10: 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  rc).#endif../*.*
7a20: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
7a30: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
7a40: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
7a50: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
7a60: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
7a70: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
7a80: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
7a90: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
7aa0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
7ab0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
7ac0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7ad0: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
7ae0: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
7af0: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
7b00: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65  ow cells..*/.#de
7b10: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c  fine findCell(P,
7b20: 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61  I) \.  ((P)->aDa
7b30: 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  ta + ((P)->maskP
7b40: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 28 26  age & get2byte(&
7b50: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
7b60: 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20  (I)]))).#define 
7b70: 66 69 6e 64 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f  findCellv2(D,M,O
7b80: 2c 49 29 20 28 44 2b 28 4d 26 67 65 74 32 62 79  ,I) (D+(M&get2by
7b90: 74 65 28 44 2b 28 4f 2b 32 2a 28 49 29 29 29 29  te(D+(O+2*(I))))
7ba0: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  ).../*.** This a
7bb0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
7bc0: 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c  rsion of findCel
7bd0: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
7be0: 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74  or.** pages that
7bf0: 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72   do contain over
7c00: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  flow cells..*/.s
7c10: 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76  tatic u8 *findOv
7c20: 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61  erflowCell(MemPa
7c30: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
7c40: 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Cell){.  int i;.
7c50: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7c60: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
7c70: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
7c80: 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65  );.  for(i=pPage
7c90: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69  ->nOverflow-1; i
7ca0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
7cb0: 6e 74 20 6b 3b 0a 20 20 20 20 6b 20 3d 20 70 50  nt k;.    k = pP
7cc0: 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 69 5d 3b 0a  age->aiOvfl[i];.
7cd0: 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c      if( k<=iCell
7ce0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d   ){.      if( k=
7cf0: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
7d00: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e    return pPage->
7d10: 61 70 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 20  apOvfl[i];.     
7d20: 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d   }.      iCell--
7d30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
7d40: 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50  turn findCell(pP
7d50: 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a  age, iCell);.}..
7d60: 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65  /*.** Parse a ce
7d70: 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b  ll content block
7d80: 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65   and fill in the
7d90: 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74   CellInfo struct
7da0: 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61  ure.  There.** a
7db0: 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20  re two versions 
7dc0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
7dd0: 2e 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
7de0: 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20  l() takes a .** 
7df0: 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68  cell index as th
7e00: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
7e10: 74 20 61 6e 64 20 62 74 72 65 65 50 61 72 73 65  t and btreeParse
7e20: 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61  CellPtr() .** ta
7e30: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
7e40: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
7e50: 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63   cell as its sec
7e60: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
7e70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
7e80: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a  eeParseCellPtr(.
7e90: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
7ea0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
7eb0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
7ec0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
7ed0: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
7ee0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
7ef0: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
7f00: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
7f10: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
7f20: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
7f30: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  ucture */.){.  u
7f40: 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20  8 *pIter;       
7f50: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63         /* For sc
7f60: 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70  anning through p
7f70: 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50  Cell */.  u32 nP
7f80: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
7f90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7fa0: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
7fb0: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  load */..  asser
7fc0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7fd0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
7fe0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
7ff0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
8000: 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c  f==0 || pPage->l
8010: 65 61 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  eaf==1 );.  if( 
8020: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
8030: 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
8040: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
8050: 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Size==0 );.    p
8060: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 67  Iter = pCell + g
8070: 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
8080: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
8090: 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72   pIter += getVar
80a0: 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a  int(pIter, (u64*
80b0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
80c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
80d0: 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 7b 0a  e->noPayload ){.
80e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
80f0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
8100: 3d 34 20 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  =4 );.    pInfo-
8110: 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74  >nSize = 4 + get
8120: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
8130: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
8140: 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f  nKey);.    pInfo
8150: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->nPayload = 0;.
8160: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
8170: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e 66 6f  l = 0;.    pInfo
8180: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
8190: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79  .    pInfo->pPay
81a0: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 72 65  load = 0;.    re
81b0: 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  turn;.  }else{. 
81c0: 20 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c     pIter = pCell
81d0: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
81e0: 74 72 53 69 7a 65 3b 0a 20 20 20 20 70 49 74 65  trSize;.    pIte
81f0: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
8200: 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64  (pIter, nPayload
8210: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b  );.    pInfo->nK
8220: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
8230: 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79   }.  pInfo->nPay
8240: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
8250: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
8260: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
8270: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
8280: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
8290: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
82a0: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
82b0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
82c0: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
82d0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
82e0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
82f0: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
8300: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
8310: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
8320: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
8330: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
8340: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
8350: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
8360: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
8370: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
8380: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
8390: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
83a0: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
83b0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
83c0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
83d0: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
83e0: 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69  ad;.    pInfo->i
83f0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
8400: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
8410: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
8420: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
8430: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
8440: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
8450: 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65      ** to decide
8460: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
8470: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
8480: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
8490: 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65   onto.    ** ove
84a0: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68  rflow pages.  Th
84b0: 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  e strategy is to
84c0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d   minimize the am
84d0: 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20  ount of unused. 
84e0: 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f     ** space on o
84f0: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
8500: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
8510: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
8520: 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69  storage.    ** i
8530: 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63  n between minLoc
8540: 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e  al and maxLocal.
8550: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
8560: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
8570: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
8580: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
8590: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
85a0: 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  .    ** way will
85b0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
85c0: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
85d0: 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20  format..    */. 
85e0: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b     int minLocal;
85f0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
8600: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
8610: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
8620: 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b     int maxLocal;
8630: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f    /* Maximum amo
8640: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
8650: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
8660: 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20     int surplus; 
8670: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
8680: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
8690: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
86a0: 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63  e */..    minLoc
86b0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
86c0: 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63  ocal;.    maxLoc
86d0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
86e0: 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75  ocal;.    surplu
86f0: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
8700: 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f  nPayload - minLo
8710: 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74  cal)%(pPage->pBt
8720: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
8730: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8740: 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63   surplus==maxLoc
8750: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
8760: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
8770: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
8780: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
8790: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
87a0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
87b0: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
87c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
87d0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
87e0: 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  u16)minLocal;.  
87f0: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69    }.    pInfo->i
8800: 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29  Overflow = (u16)
8810: 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61  (&pInfo->pPayloa
8820: 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d  d[pInfo->nLocal]
8830: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 70   - pCell);.    p
8840: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49  Info->nSize = pI
8850: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b  nfo->iOverflow +
8860: 20 34 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63   4;.  }.}.static
8870: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
8880: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
8890: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
88a0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
88b0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
88c0: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
88d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
88e0: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
88f0: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
8900: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
8910: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
8920: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
8930: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 62 74 72 65  ure */.){.  btre
8940: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
8950: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
8960: 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e  age, iCell), pIn
8970: 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  fo);.}../*.** Co
8980: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
8990: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
89a0: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
89b0: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
89c0: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
89d0: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
89e0: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
89f0: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
8a00: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
8a10: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
8a20: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
8a30: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
8a40: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
8a50: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
8a60: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ell pointer..*/.
8a70: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
8a80: 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  izePtr(MemPage *
8a90: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
8aa0: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
8ab0: 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e   pCell + pPage->
8ac0: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a  childPtrSize; /*
8ad0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
8ae0: 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c  r bytes of pCell
8af0: 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20   */.  u8 *pEnd; 
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b20: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
8b30: 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32   varint */.  u32
8b40: 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61        /* Size va
8b70: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
8b80: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8b90: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
8ba0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
8bb0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
8bc0: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
8bd0: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
8be0: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
8bf0: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
8c00: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
8c10: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
8c20: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
8c30: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
8c40: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
8c50: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
8c60: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
8c70: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
8c80: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
8c90: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
8ca0: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
8cb0: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62  o debuginfo;.  b
8cc0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8cd0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
8ce0: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
8cf0: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  if..  if( pPage-
8d00: 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  >noPayload ){.  
8d10: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
8d20: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
8d30: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
8d40: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
8d50: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8d60: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
8d70: 3d 34 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =4 );.    return
8d80: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
8d90: 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 6e 53 69  Cell);.  }.  nSi
8da0: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
8db0: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
8dc0: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
8dd0: 74 65 72 5b 39 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[9];.    nSiz
8de0: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
8df0: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
8e00: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
8e10: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
8e20: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
8e30: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
8e40: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
8e50: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
8e60: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
8e70: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
8e80: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
8e90: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
8ea0: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
8eb0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
8ec0: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
8ed0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
8ee0: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
8ef0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
8f00: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
8f10: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
8f20: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
8f30: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
8f40: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
8f50: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
8f60: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
8f70: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
8f80: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
8f90: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
8fa0: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
8fb0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
8fc0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
8fd0: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
8fe0: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
8ff0: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
9000: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
9010: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
9020: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
9030: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
9040: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
9050: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
9060: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
9070: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
9080: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
9090: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
90a0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
90b0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
90c0: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
90d0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
90e0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
90f0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
9100: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
9110: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
9120: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
9130: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
9140: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
9150: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
9160: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
9170: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
9180: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
9190: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
91a0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
91b0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
91c0: 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c  variation on cel
91d0: 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73  lSizePtr() is us
91e0: 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ed inside of ass
91f0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
9200: 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61  .** only. */.sta
9210: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
9220: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9230: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72   int iCell){.  r
9240: 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74  eturn cellSizePt
9250: 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c  r(pPage, findCel
9260: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29  l(pPage, iCell))
9270: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
9280: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9290: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
92a0: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65   If the cell pCe
92b0: 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65  ll, part of page
92c0: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
92d0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
92e0: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
92f0: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
9300: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
9310: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
9320: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
9330: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9340: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
9350: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9360: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20   u8 *pCell, int 
9370: 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  *pRC){.  CellInf
9380: 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70  o info;.  if( *p
9390: 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  RC ) return;.  a
93a0: 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20  ssert( pCell!=0 
93b0: 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43  );.  btreeParseC
93c0: 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
93d0: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
93e0: 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
93f0: 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  w ){.    Pgno ov
9400: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
9410: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
9420: 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  low]);.    ptrma
9430: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
9440: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
9450: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
9460: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
9470: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
9480: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
9490: 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c  page given.  All
94a0: 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64   Cells are moved
94b0: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
94c0: 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61  f the page and a
94d0: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73  ll free space is
94e0: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
94f0: 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42  one.** big FreeB
9500: 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  lk that occurs i
9510: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65  n between the he
9520: 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a  ader and cell.**
9530: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61   pointer array a
9540: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
9550: 65 6e 74 20 61 72 65 61 2e 0a 2a 2a 0a 2a 2a 20  ent area..**.** 
9560: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
9570: 34 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74  4582-60138 SQLit
9580: 65 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20  e may from time 
9590: 74 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69  to time reorgani
95a0: 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70  ze a.** b-tree p
95b0: 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72  age so that ther
95c0: 65 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f  e are no freeblo
95d0: 63 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20  cks or fragment 
95e0: 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e  bytes, all.** un
95f0: 75 73 65 64 20 62 79 74 65 73 20 61 72 65 20 63  used bytes are c
9600: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
9610: 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  unallocated spac
9620: 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c  e region, and al
9630: 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70  l.** cells are p
9640: 61 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74  acked tightly at
9650: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
9660: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
9670: 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61  int defragmentPa
9680: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
9690: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
96a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96b0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
96c0: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96e0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
96f0: 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a  he i-th cell */.
9700: 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9720: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61  Offset to the pa
9730: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
9740: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
9750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
9760: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20  e of a cell */. 
9770: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
9780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9790: 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20  umber of usable 
97a0: 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20  bytes on a page 
97b0: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
97c0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
97d0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
97e0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
97f0: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72  ray */.  int cbr
9800: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
9810: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
9820: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
9830: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
9840: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
9850: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9860: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
9870: 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
9880: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20  ned char *data; 
9890: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
98a0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69  e data */.  unsi
98b0: 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b  gned char *temp;
98c0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61         /* Temp a
98d0: 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e  rea for cell con
98e0: 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  tent */.  unsign
98f0: 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20  ed char *src;   
9900: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f       /* Source o
9910: 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  f content */.  i
9920: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
9930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
9940: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
9950: 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  l index */.  int
9960: 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
9970: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
9980: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e  possible cell in
9990: 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72  dex */...  asser
99a0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
99b0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
99c0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
99d0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
99e0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
99f0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t( pPage->pBt->u
9a00: 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c  sableSize <= SQL
9a10: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
9a20: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
9a30: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
9a40: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9a50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9a60: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
9a70: 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20  utex) );.  temp 
9a80: 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74  = 0;.  src = dat
9a90: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
9aa0: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
9ab0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65  >hdrOffset;.  ce
9ac0: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
9ad0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
9ae0: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
9af0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
9b00: 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28  nCell==get2byte(
9b10: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b  &data[hdr+3]) );
9b20: 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
9b30: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9b40: 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d  leSize;.  cbrk =
9b50: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69   usableSize;.  i
9b60: 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c  CellFirst = cell
9b70: 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c  Offset + 2*nCell
9b80: 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20  ;.  iCellLast = 
9b90: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
9ba0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
9bb0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
9bc0: 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20   *pAddr;     /* 
9bd0: 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f  The i-th cell po
9be0: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64  inter */.    pAd
9bf0: 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dr = &data[cellO
9c00: 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20  ffset + i*2];.  
9c10: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
9c20: 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74  pAddr);.    test
9c30: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
9c40: 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74  irst );.    test
9c50: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c  case( pc==iCellL
9c60: 61 73 74 20 29 3b 0a 23 69 66 20 21 64 65 66 69  ast );.#if !defi
9c70: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
9c80: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
9c90: 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a 20 54 68  CHECK).    /* Th
9ca0: 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68  ese conditions h
9cb0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
9cc0: 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74 72   verified in btr
9cd0: 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20  eeInitPage().   
9ce0: 20 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 45 4e   ** if SQLITE_EN
9cf0: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
9d00: 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64 65 66 69  LL_CHECK is defi
9d10: 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ned .    */.    
9d20: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
9d30: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
9d40: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
9d50: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9d60: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e  _BKPT;.    }.#en
9d70: 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
9d80: 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26  pc>=iCellFirst &
9d90: 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20  & pc<=iCellLast 
9da0: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65  );.    size = ce
9db0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
9dc0: 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20   &src[pc]);.    
9dd0: 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 23 69  cbrk -= size;.#i
9de0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
9df0: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
9e00: 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20  _CELL_CHECK).   
9e10: 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46   if( cbrk<iCellF
9e20: 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  irst ){.      re
9e30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9e40: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
9e50: 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 63 62  #else.    if( cb
9e60: 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  rk<iCellFirst ||
9e70: 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53   pc+size>usableS
9e80: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
9e90: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
9ea0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23  PT_BKPT;.    }.#
9eb0: 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
9ec0: 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61  ( cbrk+size<=usa
9ed0: 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e  bleSize && cbrk>
9ee0: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
9ef0: 20 20 20 74 65 73 74 63 61 73 65 28 20 63 62 72     testcase( cbr
9f00: 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69  k+size==usableSi
9f10: 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ze );.    testca
9f20: 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61  se( pc+size==usa
9f30: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70  bleSize );.    p
9f40: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63  ut2byte(pAddr, c
9f50: 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65  brk);.    if( te
9f60: 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  mp==0 ){.      i
9f70: 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20  nt x;.      if( 
9f80: 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69  cbrk==pc ) conti
9f90: 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20  nue;.      temp 
9fa0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65  = sqlite3PagerTe
9fb0: 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70  mpSpace(pPage->p
9fc0: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
9fd0: 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28     x = get2byte(
9fe0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
9ff0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d       memcpy(&tem
a000: 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20  p[x], &data[x], 
a010: 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29  (cbrk+size) - x)
a020: 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20 74 65  ;.      src = te
a030: 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  mp;.    }.    me
a040: 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d  mcpy(&data[cbrk]
a050: 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65  , &src[pc], size
a060: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
a070: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
a080: 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  t );.  put2byte(
a090: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62  &data[hdr+5], cb
a0a0: 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  rk);.  data[hdr+
a0b0: 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  1] = 0;.  data[h
a0c0: 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+2] = 0;.  dat
a0d0: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
a0e0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65  memset(&data[iCe
a0f0: 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72  llFirst], 0, cbr
a100: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  k-iCellFirst);. 
a110: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a120: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
a130: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
a140: 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69   );.  if( cbrk-i
a150: 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65  CellFirst!=pPage
a160: 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72  ->nFree ){.    r
a170: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
a180: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
a190: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a1a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  K;.}../*.** Sear
a1b0: 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  ch the free-list
a1c0: 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72   on page pPg for
a1d0: 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20   space to store 
a1e0: 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74  a cell nByte byt
a1f0: 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49  es in.** size. I
a200: 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75  f one can be fou
a210: 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69  nd, return a poi
a220: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70 61 63  nter to the spac
a230: 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a  e and remove it.
a240: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ** from the free
a250: 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  -list..**.** If 
a260: 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70 61 63  no suitable spac
a270: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f  e can be found o
a280: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
a290: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
a2a0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
a2b0: 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72  n may detect cor
a2c0: 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70  ruption within p
a2d0: 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69  Pg.  If corrupti
a2e0: 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65  on is.** detecte
a2f0: 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73  d then *pRc is s
a300: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52  et to SQLITE_COR
a310: 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73  RUPT and NULL is
a320: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
a330: 20 49 66 20 61 20 73 6c 6f 74 20 6f 66 20 61 74   If a slot of at
a340: 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74   least nByte byt
a350: 65 73 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20  es is found but 
a360: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 62  cannot be used b
a370: 65 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 72 65  ecause .** there
a380: 20 61 72 65 20 61 6c 72 65 61 64 79 20 61 74 20   are already at 
a390: 6c 65 61 73 74 20 36 30 20 66 72 61 67 6d 65 6e  least 60 fragmen
a3a0: 74 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  ted bytes on the
a3b0: 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20 4e 55   page, return NU
a3c0: 4c 4c 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63  LL..** In this c
a3d0: 61 73 65 2c 20 69 66 20 70 62 44 65 66 72 61 67  ase, if pbDefrag
a3e0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
a3f0: 74 20 4e 55 4c 4c 2c 20 73 65 74 20 2a 70 62 44  t NULL, set *pbD
a400: 65 66 72 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a  efrag to true..*
a410: 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67  /.static u8 *pag
a420: 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67  eFindSlot(MemPag
a430: 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74  e *pPg, int nByt
a440: 65 2c 20 69 6e 74 20 2a 70 52 63 2c 20 69 6e 74  e, int *pRc, int
a450: 20 2a 70 62 44 65 66 72 61 67 29 7b 0a 20 20 63   *pbDefrag){.  c
a460: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
a470: 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  Pg->hdrOffset;. 
a480: 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
a490: 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
a4a0: 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 69    int iAddr;.  i
a4b0: 6e 74 20 70 63 3b 0a 20 20 69 6e 74 20 75 73 61  nt pc;.  int usa
a4c0: 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  bleSize = pPg->p
a4d0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
a4e0: 0a 20 20 66 6f 72 28 69 41 64 64 72 3d 68 64 72  .  for(iAddr=hdr
a4f0: 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79  +1; (pc = get2by
a500: 74 65 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d  te(&aData[iAddr]
a510: 29 29 3e 30 3b 20 69 41 64 64 72 3d 70 63 29 7b  ))>0; iAddr=pc){
a520: 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  .    int size;  
a530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
a540: 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c  e of the free sl
a550: 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49  ot */.    /* EVI
a560: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 38 36  DENCE-OF: R-0686
a570: 36 2d 33 39 31 32 35 20 46 72 65 65 62 6c 6f 63  6-39125 Freebloc
a580: 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f  ks are always co
a590: 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72 64 65 72  nnected in order
a5a0: 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63 72 65   of.    ** incre
a5b0: 61 73 69 6e 67 20 6f 66 66 73 65 74 2e 20 2a 2f  asing offset. */
a5c0: 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62  .    if( pc>usab
a5d0: 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 69  leSize-4 || pc<i
a5e0: 41 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  Addr+4 ){.      
a5f0: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
a600: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a610: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
a620: 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  }.    /* EVIDENC
a630: 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33  E-OF: R-22710-53
a640: 33 32 38 20 54 68 65 20 74 68 69 72 64 20 61 6e  328 The third an
a650: 64 20 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f  d fourth bytes o
a660: 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72  f each.    ** fr
a670: 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62  eeblock form a b
a680: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
a690: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
a6a0: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 62  ize of the freeb
a6b0: 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62  lock.    ** in b
a6c0: 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ytes, including 
a6d0: 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65  the 4-byte heade
a6e0: 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d  r. */.    size =
a6f0: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
a700: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  [pc+2]);.    if(
a710: 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a   size>=nByte ){.
a720: 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69        int x = si
a730: 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20  ze - nByte;.    
a740: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
a750: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
a760: 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20  se( x==3 );.    
a770: 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20    if( x<4 ){.   
a780: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
a790: 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30  -OF: R-11498-580
a7a0: 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  22 In a well-for
a7b0: 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c  med b-tree page,
a7c0: 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20   the total.     
a7d0: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
a7e0: 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e  bytes in fragmen
a7f0: 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65  ts may not excee
a800: 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20  d 60. */.       
a810: 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37   if( aData[hdr+7
a820: 5d 3e 3d 36 30 20 29 7b 0a 20 20 20 20 20 20 20  ]>=60 ){.       
a830: 20 20 20 69 66 28 20 70 62 44 65 66 72 61 67 20     if( pbDefrag 
a840: 29 20 2a 70 62 44 65 66 72 61 67 20 3d 20 31 3b  ) *pbDefrag = 1;
a850: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
a860: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 0;.        }. 
a870: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
a880: 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74   the slot from t
a890: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70  he free-list. Up
a8a0: 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  date the number 
a8b0: 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72  of.        ** fr
a8c0: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77  agmented bytes w
a8d0: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20  ithin the page. 
a8e0: 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  */.        memcp
a8f0: 79 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c  y(&aData[iAddr],
a900: 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b   &aData[pc], 2);
a910: 0a 20 20 20 20 20 20 20 20 61 44 61 74 61 5b 68  .        aData[h
a920: 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a  dr+7] += (u8)x;.
a930: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a940: 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65  size+pc > usable
a950: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
a960: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
a970: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a980: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a990: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a9a0: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
a9b0: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
a9c0: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
a9d0: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
a9e0: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  unt.         ** 
a9f0: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
aa00: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
aa10: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
aa20: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
aa30: 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29  &aData[pc+2], x)
aa40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
aa50: 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63  return &aData[pc
aa60: 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d   + x];.    }.  }
aa70: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
aa80: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
aa90: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
aaa0: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
aab0: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
aac0: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
aad0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
aae0: 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49  . Write into *pI
aaf0: 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  dx the index int
ab00: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
ab10: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74  .** of the first
ab20: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
ab30: 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e  ed space. Return
ab40: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f   either SQLITE_O
ab50: 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  K or.** an error
ab60: 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53   code (usually S
ab70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
ab80: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
ab90: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
aba0: 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63   there is suffic
abb0: 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61  ient space to ma
abc0: 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ke the.** alloca
abd0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
abe0: 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ine might need t
abf0: 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20  o defragment in 
ac00: 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a  order to bring.*
ac10: 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20  * all the space 
ac20: 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65  together, howeve
ac30: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
ac40: 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e   will avoid usin
ac50: 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  g.** the first t
ac60: 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68  wo bytes past th
ac70: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
ac80: 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d  rea since presum
ac90: 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c  ably this.** all
aca0: 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ocation is being
acb0: 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
acc0: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63  o insert a new c
acd0: 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a  ell, so we will.
ace0: 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e  ** also end up n
acf0: 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c  eeding a new cel
ad00: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
ad10: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
ad20: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
ad30: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
ad40: 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20  , int *pIdx){.  
ad50: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
ad60: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
ad70: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
ad80: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
ad90: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
ada0: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
adb0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
adc0: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
add0: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
ade0: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
ae10: 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c  rst byte of cell
ae20: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
ae30: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ae40: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
ae50: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
ae60: 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  er return code *
ae70: 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20  /.  int gap;    
ae80: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
ae90: 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e  e of gap between
aea0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
aeb0: 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  nd cell content 
aec0: 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  */.  .  assert( 
aed0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
aee0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
aef0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
af00: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
af10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
af20: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
af30: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
af40: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
af50: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
af60: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
af70: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
af80: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
af90: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
afa0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
afb0: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
afc0: 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69  sert( nByte < (i
afd0: 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  nt)(pPage->pBt->
afe0: 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b  usableSize-8) );
aff0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
b000: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d  e->cellOffset ==
b010: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
b020: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67  age->leaf );.  g
b030: 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ap = pPage->cell
b040: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
b050: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
b060: 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b  t( gap<=65536 );
b070: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
b080: 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31  F: R-29356-02391
b090: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
b0a0: 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62 79   uses a 65536-by
b0b0: 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a  te page size.  *
b0c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72 76  * and the reserv
b0d0: 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f  ed space is zero
b0e0: 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75   (the usual valu
b0f0: 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20 73  e for reserved s
b100: 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20  pace).  ** then 
b110: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
b120: 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d   offset of an em
b130: 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20 74  pty page wants t
b140: 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a  o be 65536..  **
b150: 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69   However, that i
b160: 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61  nteger is too la
b170: 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64  rge to be stored
b180: 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73   in a 2-byte uns
b190: 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67  igned.  ** integ
b1a0: 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f  er, so a value o
b1b0: 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20 69  f 0 is used in i
b1c0: 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74  ts place. */.  t
b1d0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
b1e0: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
b1f0: 5d 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74 6f  ]);.  if( gap>to
b200: 70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  p ) return SQLIT
b210: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b220: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
b230: 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62  s enough space b
b240: 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74  etween gap and t
b250: 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20  op for one more 
b260: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a  cell pointer.  *
b270: 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66  * array entry of
b280: 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65  fset, and if the
b290: 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74   freelist is not
b2a0: 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61   empty, then sea
b2b0: 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65  rch the.  ** fre
b2c0: 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f  elist looking fo
b2d0: 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69  r a free slot bi
b2e0: 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69  g enough to sati
b2f0: 73 66 79 20 74 68 65 20 72 65 71 75 65 73 74 2e  sfy the request.
b300: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
b310: 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a  ( gap+2==top );.
b320: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
b330: 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74  1==top );.  test
b340: 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29  case( gap==top )
b350: 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 3c 3d 74  ;.  if( gap+2<=t
b360: 6f 70 20 26 26 20 28 64 61 74 61 5b 68 64 72 2b  op && (data[hdr+
b370: 31 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 32  1] || data[hdr+2
b380: 5d 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 44  ]) ){.    int bD
b390: 65 66 72 61 67 20 3d 20 30 3b 0a 20 20 20 20 75  efrag = 0;.    u
b3a0: 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65  8 *pSpace = page
b3b0: 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20  FindSlot(pPage, 
b3c0: 6e 42 79 74 65 2c 20 26 72 63 2c 20 26 62 44 65  nByte, &rc, &bDe
b3d0: 66 72 61 67 29 3b 0a 20 20 20 20 69 66 28 20 72  frag);.    if( r
b3e0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
b3f0: 20 20 20 69 66 28 20 62 44 65 66 72 61 67 20 29     if( bDefrag )
b400: 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74   goto defragment
b410: 5f 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  _page;.    if( p
b420: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61  Space ){.      a
b430: 73 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64  ssert( pSpace>=d
b440: 61 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d  ata && (pSpace -
b450: 20 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a   data)<65536 );.
b460: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69        *pIdx = (i
b470: 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74  nt)(pSpace - dat
b480: 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
b490: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
b4a0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
b4b0: 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f  request could no
b4c0: 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75  t be fulfilled u
b4d0: 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20  sing a freelist 
b4e0: 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a  slot.  Check.  *
b4f0: 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72  * to see if defr
b500: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e  agmentation is n
b510: 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
b520: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
b530: 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20  +nByte==top );. 
b540: 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65   if( gap+2+nByte
b550: 3e 74 6f 70 20 29 7b 0a 20 64 65 66 72 61 67 6d  >top ){. defragm
b560: 65 6e 74 5f 70 61 67 65 3a 0a 20 20 20 20 61 73  ent_page:.    as
b570: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
b580: 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ll>0 || CORRUPT_
b590: 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64  DB );.    rc = d
b5a0: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
b5b0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
b5c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
b5d0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
b5e0: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
b5f0: 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  r+5]);.    asser
b600: 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f  t( gap+nByte<=to
b610: 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  p );.  }...  /* 
b620: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
b630: 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20  from the gap in 
b640: 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c  between the cell
b650: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20   pointer array. 
b660: 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c   ** and the cell
b670: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20   content area.  
b680: 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61 67  The btreeInitPag
b690: 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72  e() call has alr
b6a0: 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61  eady.  ** valida
b6b0: 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73 74  ted the freelist
b6c0: 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74 68  .  Given that th
b6d0: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76 61  e freelist is va
b6e0: 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20  lid, there.  ** 
b6f0: 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74  is no way that t
b700: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61  he allocation ca
b710: 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65  n extend off the
b720: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
b730: 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72  ..  ** The asser
b740: 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69  t() below verifi
b750: 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  es the previous 
b760: 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  sentence..  */. 
b770: 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20   top -= nByte;. 
b780: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
b790: 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20  hdr+5], top);.  
b7a0: 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74  assert( top+nByt
b7b0: 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  e <= (int)pPage-
b7c0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
b7d0: 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f   );.  *pIdx = to
b7e0: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
b7f0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b800: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
b810: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
b820: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
b830: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
b840: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
b850: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
b860: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53   pPage->aData[iS
b870: 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65  tart].** and the
b880: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
b890: 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74 65  ck is iSize byte
b8a0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e  s..**.** Adjacen
b8b0: 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65  t freeblocks are
b8c0: 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a   coalesced..**.*
b8d0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e  * Note that even
b8e0: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
b8f0: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
b900: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49  hecked by btreeI
b910: 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68  nitPage(),.** th
b920: 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  at routine will 
b930: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
b940: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73  ap between cells
b950: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   or freeblocks. 
b960: 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20   Nor.** does it 
b970: 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20  detect cells or 
b980: 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20  freeblocks that 
b990: 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68  encrouch into th
b9a0: 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  e reserved bytes
b9b0: 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
b9c0: 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20  f the page.  So 
b9d0: 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  do additional co
b9e0: 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20  rruption checks 
b9f0: 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72  inside this.** r
ba00: 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72  outine and retur
ba10: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ba20: 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73   if any problems
ba30: 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   are found..*/.s
ba40: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
ba50: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
ba60: 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20  ge, u16 iStart, 
ba70: 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31  u16 iSize){.  u1
ba80: 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20  6 iPtr;         
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
bab0: 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72  f ptr to next fr
bac0: 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36  eeblock */.  u16
bad0: 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20   iFreeBlk;      
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baf0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
bb00: 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c   the next freebl
bb10: 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b  ock */.  u8 hdr;
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb40: 2a 20 50 61 67 65 20 68 65 61 64 65 72 20 73 69  * Page header si
bb50: 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f  ze.  0 or 100 */
bb60: 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b  .  u8 nFrag = 0;
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb80: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75           /* Redu
bb90: 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e  ction in fragmen
bba0: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20  tation */.  u16 
bbb0: 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a  iOrigSize = iSiz
bbc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
bbd0: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
bbe0: 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a  lue of iSize */.
bbf0: 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50    u32 iLast = pP
bc00: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
bc10: 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65  Size-4; /* Large
bc20: 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65  st possible free
bc30: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
bc40: 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74    u32 iEnd = iSt
bc50: 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20  art + iSize;    
bc60: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
bc70: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69   byte past the i
bc80: 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a  Start buffer */.
bc90: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
bca0: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
bcb0: 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20  Data;   /* Page 
bcc0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
bcd0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
bce0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
bcf0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
bd00: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
bd10: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
bd20: 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 70 50  sert( iStart>=pP
bd30: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
bd40: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
bd50: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
bd60: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
bd70: 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70  iEnd <= pPage->p
bd80: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
bd90: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bda0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
bdb0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
bdc0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
bdd0: 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20  Size>=4 );   /* 
bde0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
bdf0: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
be00: 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61 73  rt( iStart<=iLas
be10: 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77  t );..  /* Overw
be20: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
be30: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
be40: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63  ros when the sec
be50: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
be60: 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
be70: 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  d */.  if( pPage
be80: 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
be90: 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
bea0: 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ETE ){.    memse
beb0: 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  t(&data[iStart],
bec0: 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a   0, iSize);.  }.
bed0: 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f  .  /* The list o
bee0: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73  f freeblocks mus
bef0: 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e  t be in ascendin
bf00: 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74  g order.  Find t
bf10: 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e  he .  ** spot on
bf20: 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65 20   the list where 
bf30: 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
bf40: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
bf50: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
bf60: 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72  drOffset;.  iPtr
bf70: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66   = hdr + 1;.  if
bf80: 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d  ( data[iPtr+1]==
bf90: 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d  0 && data[iPtr]=
bfa0: 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42  =0 ){.    iFreeB
bfb0: 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72  lk = 0;  /* Shor
bfc0: 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61 73  tcut for the cas
bfd0: 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c  e when the freel
bfe0: 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  ist is empty */.
bff0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
c000: 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20  le( (iFreeBlk = 
c010: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
c020: 50 74 72 5d 29 29 3e 30 20 26 26 20 69 46 72 65  Ptr]))>0 && iFre
c030: 65 42 6c 6b 3c 69 53 74 61 72 74 20 29 7b 0a 20  eBlk<iStart ){. 
c040: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c       if( iFreeBl
c050: 6b 3c 69 50 74 72 2b 34 20 29 20 72 65 74 75 72  k<iPtr+4 ) retur
c060: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c070: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 50 74  _BKPT;.      iPt
c080: 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20  r = iFreeBlk;.  
c090: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65    }.    if( iFre
c0a0: 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65 74  eBlk>iLast ) ret
c0b0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c0c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
c0d0: 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50  ert( iFreeBlk>iP
c0e0: 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d  tr || iFreeBlk==
c0f0: 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41  0 );.  .    /* A
c100: 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20  t this point:.  
c110: 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b    **    iFreeBlk
c120: 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62 6c  :   First freebl
c130: 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72 74  ock after iStart
c140: 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e  , or zero if non
c150: 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72  e.    **    iPtr
c160: 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64 72  :       The addr
c170: 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ess of a pointer
c180: 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a   iFreeBlk.    **
c190: 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
c1a0: 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b   see if iFreeBlk
c1b0: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65   should be coale
c1c0: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
c1d0: 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20  d of iStart..   
c1e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65   */.    if( iFre
c1f0: 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d  eBlk && iEnd+3>=
c200: 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20  iFreeBlk ){.    
c210: 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42    nFrag = iFreeB
c220: 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20  lk - iEnd;.     
c230: 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42   if( iEnd>iFreeB
c240: 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  lk ) return SQLI
c250: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c260: 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46  .      iEnd = iF
c270: 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74  reeBlk + get2byt
c280: 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
c290: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 53 69 7a  +2]);.      iSiz
c2a0: 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61 72  e = iEnd - iStar
c2b0: 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42 6c  t;.      iFreeBl
c2c0: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
c2d0: 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20  ta[iFreeBlk]);. 
c2e0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
c2f0: 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68 65  f iPtr is anothe
c300: 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68 61  r freeblock (tha
c310: 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69 73  t is, if iPtr is
c320: 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69 73   not the freelis
c330: 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72  t.    ** pointer
c340: 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61   in the page hea
c350: 64 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b 20  der) then check 
c360: 74 6f 20 73 65 65 20 69 66 20 69 53 74 61 72 74  to see if iStart
c370: 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a   should be.    *
c380: 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  * coalesced onto
c390: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74 72   the end of iPtr
c3a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c3b0: 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20   iPtr>hdr+1 ){. 
c3c0: 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e 64       int iPtrEnd
c3d0: 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62 79   = iPtr + get2by
c3e0: 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32 5d  te(&data[iPtr+2]
c3f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 74  );.      if( iPt
c400: 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20 29  rEnd+3>=iStart )
c410: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  {.        if( iP
c420: 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20 72  trEnd>iStart ) r
c430: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c440: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
c450: 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74 61     nFrag += iSta
c460: 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20  rt - iPtrEnd;.  
c470: 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45        iSize = iE
c480: 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20 20  nd - iPtr;.     
c490: 20 20 20 69 53 74 61 72 74 20 3d 20 69 50 74 72     iStart = iPtr
c4a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c4b0: 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e 64 61      if( nFrag>da
c4c0: 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65 74 75  ta[hdr+7] ) retu
c4d0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c4e0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64 61 74 61  T_BKPT;.    data
c4f0: 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67  [hdr+7] -= nFrag
c500: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 74 61  ;.  }.  if( iSta
c510: 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  rt==get2byte(&da
c520: 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20  ta[hdr+5]) ){.  
c530: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66 72 65    /* The new fre
c540: 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74 68 65  eblock is at the
c550: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
c560: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
c570: 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a  rea,.    ** so j
c580: 75 73 74 20 65 78 74 65 6e 64 20 74 68 65 20 63  ust extend the c
c590: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
c5a0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 72 65   rather than cre
c5b0: 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20  ate another.    
c5c0: 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e 74 72  ** freelist entr
c5d0: 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74  y */.    if( iPt
c5e0: 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72  r!=hdr+1 ) retur
c5f0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c600: 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75 74 32 62  _BKPT;.    put2b
c610: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
c620: 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20  , iFreeBlk);.   
c630: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
c640: 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20  hdr+5], iEnd);. 
c650: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
c660: 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 66 72  nsert the new fr
c670: 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65  eeblock into the
c680: 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20   freelist */.   
c690: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
c6a0: 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a  iPtr], iStart);.
c6b0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
c6c0: 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46 72 65  ta[iStart], iFre
c6d0: 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62  eBlk);.    put2b
c6e0: 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72 74  yte(&data[iStart
c6f0: 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d  +2], iSize);.  }
c700: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
c710: 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20  += iOrigSize;.  
c720: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c730: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
c740: 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
c750: 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
c760: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20   of the header) 
c770: 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e  for a page.** an
c780: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65  d initialize fie
c790: 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  lds of the MemPa
c7a0: 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63  ge structure acc
c7b0: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ordingly..**.** 
c7c0: 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  Only the followi
c7d0: 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
c7e0: 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20  are supported.  
c7f0: 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65  Anything differe
c800: 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20  nt.** indicates 
c810: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
c820: 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  se files:.**.** 
c830: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
c840: 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  DATA.**         
c850: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50  PTF_ZERODATA | P
c860: 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20  TF_LEAF.**      
c870: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
c880: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20  | PTF_INTKEY.** 
c890: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
c8a0: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
c8b0: 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a  Y | PTF_LEAF.*/.
c8c0: 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64  static int decod
c8d0: 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a  eFlags(MemPage *
c8e0: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42  pPage, int flagB
c8f0: 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  yte){.  BtShared
c900: 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20   *pBt;     /* A 
c910: 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70  copy of pPage->p
c920: 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  Bt */..  assert(
c930: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
c940: 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t==(pPage->pgno=
c950: 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b  =1 ? 100 : 0) );
c960: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c970: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
c980: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
c990: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61   );.  pPage->lea
c9a0: 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74  f = (u8)(flagByt
c9b0: 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20  e>>3);  assert( 
c9c0: 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33  PTF_LEAF == 1<<3
c9d0: 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26   );.  flagByte &
c9e0: 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70  = ~PTF_LEAF;.  p
c9f0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
ca00: 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e  ze = 4-4*pPage->
ca10: 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50  leaf;.  pBt = pP
ca20: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
ca30: 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
ca40: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
ca50: 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20  TKEY) ){.    /* 
ca60: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
ca70: 33 36 34 30 2d 31 33 34 31 35 20 41 20 76 61 6c  3640-13415 A val
ca80: 75 65 20 6f 66 20 35 20 6d 65 61 6e 73 20 74 68  ue of 5 means th
ca90: 65 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74  e page is an int
caa0: 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62  erior.    ** tab
cab0: 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
cac0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
cad0: 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
cae0: 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20  _INTKEY)==5 );. 
caf0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
cb00: 46 3a 20 52 2d 32 30 35 30 31 2d 36 31 37 39 36  F: R-20501-61796
cb10: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 6d   A value of 13 m
cb20: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
cb30: 20 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 74   a leaf.    ** t
cb40: 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65  able b-tree page
cb50: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
cb60: 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50   (PTF_LEAFDATA|P
cb70: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
cb80: 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70  AF)==13 );.    p
cb90: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31  Page->intKey = 1
cba0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
cbb0: 4b 65 79 4c 65 61 66 20 3d 20 70 50 61 67 65 2d  KeyLeaf = pPage-
cbc0: 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  >leaf;.    pPage
cbd0: 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 21 70  ->noPayload = !p
cbe0: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
cbf0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
cc00: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
cc10: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
cc20: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
cc30: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
cc40: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
cc50: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a  RODATA ){.    /*
cc60: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
cc70: 32 37 32 32 35 2d 35 33 39 33 36 20 41 20 76 61  27225-53936 A va
cc80: 6c 75 65 20 6f 66 20 32 20 6d 65 61 6e 73 20 74  lue of 2 means t
cc90: 68 65 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e  he page is an in
cca0: 74 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 69 6e  terior.    ** in
ccb0: 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e  dex b-tree page.
ccc0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
ccd0: 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d  (PTF_ZERODATA)==
cce0: 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  2 );.    /* EVID
ccf0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 36 35 37 31  ENCE-OF: R-16571
cd00: 2d 31 31 36 31 35 20 41 20 76 61 6c 75 65 20 6f  -11615 A value o
cd10: 66 20 31 30 20 6d 65 61 6e 73 20 74 68 65 20 70  f 10 means the p
cd20: 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20  age is a leaf.  
cd30: 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72 65    ** index b-tre
cd40: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
cd50: 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f  ssert( (PTF_ZERO
cd60: 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d  DATA|PTF_LEAF)==
cd70: 31 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  10 );.    pPage-
cd80: 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20  >intKey = 0;.   
cd90: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
cda0: 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  af = 0;.    pPag
cdb0: 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 30  e->noPayload = 0
cdc0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
cdd0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
cde0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
cdf0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
ce00: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
ce10: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
ce20: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
ce30: 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
ce40: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
ce50: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
ce60: 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
ce70: 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
ce80: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ce90: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
cea0: 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
ceb0: 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62  oad = pBt->max1b
cec0: 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  ytePayload;.  re
ced0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
cee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
cef0: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
cf00: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
cf10: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
cf20: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
cf30: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
cf40: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
cf50: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
cf60: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
cf70: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
cf80: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
cf90: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
cfa0: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
cfb0: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
cfc0: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
cfd0: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
cfe0: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
cff0: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
d000: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
d010: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
d020: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
d030: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
d040: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
d050: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
d060: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
d070: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
d080: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d090: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d0a0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d0b0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
d0c0: 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
d0d0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
d0e0: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
d0f0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
d100: 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
d110: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
d120: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
d130: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
d140: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
d150: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
d160: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
d170: 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  e) );..  if( !pP
d180: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
d190: 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20     u16 pc;      
d1a0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
d1b0: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
d1c0: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
d1d0: 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ata[] */.    u8 
d1e0: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
d1f0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
d200: 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
d210: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20  eader */.    u8 
d220: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
d230: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
d240: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20  e->aData */.    
d250: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
d260: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
d270: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
d280: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61  e */.    int usa
d290: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
d2a0: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
d2b0: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
d2c0: 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65  ge */.    u16 ce
d2d0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
d2e0: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
d2f0: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
d300: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
d310: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65  */.    int nFree
d320: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
d330: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
d340: 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  tes on the page 
d350: 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20  */.    int top; 
d360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
d370: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  st byte of the c
d380: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
d390: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
d3a0: 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69  lFirst;    /* Fi
d3b0: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
d3c0: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
d3d0: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e  offset */.    in
d3e0: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
d3f0: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
d400: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
d410: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20  ock offset */.. 
d420: 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e     pBt = pPage->
d430: 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20  pBt;..    hdr = 
d440: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d450: 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
d460: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f  ge->aData;.    /
d470: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
d480: 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65  -28594-02890 The
d490: 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61   one-byte flag a
d4a0: 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63  t offset 0 indic
d4b0: 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ating.    ** the
d4c0: 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70   b-tree page typ
d4d0: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65  e. */.    if( de
d4e0: 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
d4f0: 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65   data[hdr]) ) re
d500: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d510: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  UPT_BKPT;.    as
d520: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
d530: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
d540: 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
d550: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   );.    pPage->m
d560: 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28  askPage = (u16)(
d570: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
d580: 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  1);.    pPage->n
d590: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
d5a0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
d5b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
d5c0: 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f      pPage->cellO
d5d0: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
d5e0: 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70  et = hdr + 8 + p
d5f0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
d600: 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ze;.    pPage->a
d610: 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
d620: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20  usableSize];.   
d630: 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
d640: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
d650: 73 65 74 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49  set];.    /* EVI
d660: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31  DENCE-OF: R-5801
d670: 35 2d 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d  5-48175 The two-
d680: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
d690: 6f 66 66 73 65 74 20 35 20 64 65 73 69 67 6e 61  offset 5 designa
d6a0: 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  tes.    ** the s
d6b0: 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
d6c0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41   content area. A
d6d0: 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20   zero value for 
d6e0: 74 68 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a  this integer is.
d6f0: 20 20 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74      ** interpret
d700: 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a  ed as 65536. */.
d710: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
d720: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
d730: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20  hdr+5]);.    /* 
d740: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
d750: 37 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74  7002-32774 The t
d760: 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
d770: 61 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65  at offset 3 give
d780: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  s the.    ** num
d790: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
d7a0: 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  the page. */.   
d7b0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
d7c0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
d7d0: 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20  dr+3]);.    if( 
d7e0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
d7f0: 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
d800: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
d810: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
d820: 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
d830: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
d840: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
d850: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d860: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
d870: 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
d880: 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28  >nCell==MX_CELL(
d890: 70 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45  pBt) );.    /* E
d8a0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
d8b0: 30 38 39 2d 35 37 39 37 39 20 49 66 20 61 20 70  089-57979 If a p
d8c0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
d8d0: 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69 73 20  cells (which is 
d8e0: 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73  only.    ** poss
d8f0: 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20  ible for a root 
d900: 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
d910: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  that contains no
d920: 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a   rows) then the.
d930: 20 20 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f      ** offset to
d940: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
d950: 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61  t area will equa
d960: 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  l the page size 
d970: 6d 69 6e 75 73 20 74 68 65 0a 20 20 20 20 2a 2a  minus the.    **
d980: 20 62 79 74 65 73 20 6f 66 20 72 65 73 65 72 76   bytes of reserv
d990: 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20  ed space. */.   
d9a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d9b0: 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d  nCell>0 || top==
d9c0: 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f  usableSize || CO
d9d0: 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20  RRUPT_DB );..   
d9e0: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
d9f0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
da00: 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
da10: 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
da20: 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65  d.    ** of page
da30: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
da40: 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  cell.  .    **. 
da50: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
da60: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ing block of cod
da70: 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74  e checks early t
da80: 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20  o see if a cell 
da90: 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70  extends.    ** p
daa0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
dab0: 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
dac0: 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
dad0: 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
dae0: 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20      ** returned 
daf0: 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20  if it does..    
db00: 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73  */.    iCellFirs
db10: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
db20: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
db30: 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  .    iCellLast =
db40: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
db50: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
db60: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
db70: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
db80: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
db90: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
dba0: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
dbb0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
dbc0: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
dbd0: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
dbe0: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
dbf0: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
dc00: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
dc10: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
dc20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
dc30: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
dc40: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
dc50: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
dc60: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
dc70: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
dc80: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
dc90: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
dca0: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
dcb0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
dcc0: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
dcd0: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
dce0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
dcf0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
dd00: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
dd10: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
dd20: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
dd30: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
dd40: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
dd50: 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
dd60: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
dd70: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
dd80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
dd90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
dda0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
ddb0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ddc0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
ddd0: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
dde0: 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66  ;.    }  .#endif
ddf0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
de00: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
de10: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
de20: 65 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  e.    ** EVIDENC
de30: 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34  E-OF: R-23588-34
de40: 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65  450 The two-byte
de50: 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
de60: 65 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20  et 1 gives the. 
de70: 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74     ** start of t
de80: 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
de90: 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  ck on the page, 
dea0: 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  or is zero if th
deb0: 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a  ere are no.    *
dec0: 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f  * freeblocks. */
ded0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
dee0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
def0: 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61  ;.    nFree = da
df00: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b  ta[hdr+7] + top;
df10: 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20    /* Init nFree 
df20: 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b  to non-freeblock
df30: 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20   free space */. 
df40: 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29     while( pc>0 )
df50: 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74  {.      u16 next
df60: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
df70: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
df80: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
df90: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
dfa0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35  IDENCE-OF: R-555
dfb0: 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65  30-52930 In a we
dfc0: 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
dfd0: 20 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c   page, there wil
dfe0: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  l.        ** alw
dff0: 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20  ays be at least 
e000: 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20  one cell before 
e010: 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
e020: 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ock..        **.
e030: 20 20 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 74          ** Or, t
e040: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20  he freeblock is 
e050: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
e060: 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
e070: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
e080: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e090: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
e0a0: 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
e0b0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
e0c0: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
e0d0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
e0e0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
e0f0: 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c  (next>0 && next<
e100: 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70  =pc+size+3) || p
e110: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
e120: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
e130: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
e140: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
e150: 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20   order. And the 
e160: 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20  last byte of.   
e170: 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65       ** the free
e180: 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20  -block must lie 
e190: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
e1a0: 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
e1b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e1c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
e1d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
e1e0: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
e1f0: 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65  e;.      pc = ne
e200: 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  xt;.    }..    /
e210: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
e220: 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
e230: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
e240: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
e250: 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  rt.    ** of the
e260: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
e270: 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62  ea plus the numb
e280: 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
e290: 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74   within.    ** t
e2a0: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
e2b0: 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73  area. If this is
e2c0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
e2d0: 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20  e usable-size.  
e2e0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
e2f0: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
e300: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
e310: 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
e320: 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73  so.    ** serves
e330: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
e340: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
e350: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
e360: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ell-content.    
e370: 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
e380: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
e390: 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
e3a0: 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  in the page..   
e3b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65   */.    if( nFre
e3c0: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
e3d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e3e0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e3f0: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  ; .    }.    pPa
e400: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
e410: 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46  )(nFree - iCellF
e420: 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65  irst);.    pPage
e430: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
e440: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
e450: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
e460: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
e470: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
e480: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
e490: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
e4a0: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
e4b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
e4c0: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
e4d0: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
e4e0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
e4f0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
e500: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
e510: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
e520: 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d  >pBt;.  u8 hdr =
e530: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
e540: 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a  t;.  u16 first;.
e550: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e560: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
e570: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
e580: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
e590: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e5a0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
e5b0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
e5c0: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
e5d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
e5e0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
e5f0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
e600: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
e610: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
e620: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
e630: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
e640: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e650: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e660: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
e670: 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
e680: 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
e690: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ELETE ){.    mem
e6a0: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
e6b0: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
e6c0: 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20  ze - hdr);.  }. 
e6d0: 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
e6e0: 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
e6f0: 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67  t = hdr + ((flag
e700: 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
e710: 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73   12 : 8);.  mems
e720: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
e730: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
e740: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
e750: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
e760: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
e770: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
e780: 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74  Free = (u16)(pBt
e790: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
e7a0: 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46  irst);.  decodeF
e7b0: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
e7c0: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  s);.  pPage->cel
e7d0: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
e7e0: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
e7f0: 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e  nd = &data[pBt->
e800: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  usableSize];.  p
e810: 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
e820: 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20   &data[first];. 
e830: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
e840: 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  w = 0;.  assert(
e850: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
e860: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
e870: 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
e880: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
e890: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
e8a0: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70  geSize - 1);.  p
e8b0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
e8c0: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
e8d0: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
e8e0: 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65  Convert a DbPage
e8f0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74   obtained from t
e900: 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20  he pager into a 
e910: 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a  MemPage used by.
e920: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
e930: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  er..*/.static Me
e940: 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
e950: 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67  FromDbPage(DbPag
e960: 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f  e *pDbPage, Pgno
e970: 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20   pgno, BtShared 
e980: 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
e990: 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
e9a0: 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
e9b0: 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
e9c0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  );.  pPage->aDat
e9d0: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
e9e0: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
e9f0: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61  ;.  pPage->pDbPa
ea00: 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
ea10: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
ea20: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ;.  pPage->pgno 
ea30: 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d  = pgno;.  pPage-
ea40: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  >hdrOffset = pPa
ea50: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
ea60: 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  0 : 0;.  return 
ea70: 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
ea80: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
ea90: 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
eaa0: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
eab0: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
eac0: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
ead0: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
eae0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f  .**.** If the no
eaf0: 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20  Content flag is 
eb00: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
eb10: 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
eb20: 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
eb30: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
eb40: 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
eb50: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
eb60: 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
eb70: 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
eb80: 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
eb90: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
eba0: 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
ebb0: 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
ebc0: 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
ebd0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
ebe0: 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
ebf0: 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
ec00: 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
ec10: 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
ec20: 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
ec30: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
ec40: 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
ec50: 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
ec60: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
ec70: 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
ec80: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
ec90: 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
eca0: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
ecb0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ecc0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
ecd0: 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
ece0: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
ecf0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
ed00: 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
ed10: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  eter */.  int fl
ed20: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
ed30: 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  * PAGER_GET_NOCO
ed40: 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47  NTENT or PAGER_G
ed50: 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29  ET_READONLY */.)
ed60: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
ed70: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
ed80: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
ed90: 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  =0 || flags==PAG
eda0: 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
edb0: 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
edc0: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b  _GET_READONLY );
edd0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ede0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
edf0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
ee00: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
ee10: 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
ee20: 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
ee30: 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66  ge**)&pDbPage, f
ee40: 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20  lags);.  if( rc 
ee50: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
ee60: 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  ppPage = btreePa
ee70: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
ee80: 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
ee90: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
eea0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
eeb0: 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66  etrieve a page f
eec0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
eed0: 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75  che. If the requ
eee0: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
eef0: 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20  t.** already in 
ef00: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
ef10: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69  return NULL. Ini
ef20: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
ef30: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
ef40: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
ef50: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
ef60: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
ef70: 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f  ge *btreePageLoo
ef80: 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  kup(BtShared *pB
ef90: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
efa0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
efb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
efc0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
efd0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
efe0: 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
eff0: 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
f000: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
f010: 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
f020: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
f030: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
f040: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
f050: 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pBt);.  }.  retu
f060: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
f070: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
f080: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
f090: 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66  ile in pages. If
f0a0: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
f0b0: 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20  nd of.** error, 
f0c0: 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65  return ((unsigne
f0d0: 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74  d int)-1)..*/.st
f0e0: 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50  atic Pgno btreeP
f0f0: 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65  agecount(BtShare
f100: 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72  d *pBt){.  retur
f110: 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a  n pBt->nPage;.}.
f120: 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65  u32 sqlite3Btree
f130: 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a  LastPage(Btree *
f140: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
f150: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
f160: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
f170: 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e  ert( ((p->pBt->n
f180: 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29  Page)&0x8000000)
f190: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
f1a0: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
f1b0: 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pBt);.}../*.**
f1c0: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
f1d0: 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
f1e0: 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54  nitialize it.  T
f1f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
f200: 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69  ust a.** conveni
f210: 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f  ence wrapper aro
f220: 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c  und separate cal
f230: 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ls to btreeGetPa
f240: 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72  ge() and .** btr
f250: 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a  eeInitPage()..**
f260: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
f270: 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
f280: 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69   value *ppPage i
f290: 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65  s set to is unde
f2a0: 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79  fined. It.** may
f2b0: 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
f2c0: 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  d, or it may be 
f2d0: 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  set to an invali
f2e0: 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  d value..*/.stat
f2f0: 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
f300: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
f310: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
f320: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f330: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
f340: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f360: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f370: 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
f380: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
f390: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
f3a0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
f3b0: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
f3c0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ere */.  int bRe
f3d0: 61 64 6f 6e 6c 79 20 20 20 20 20 20 20 20 20 20  adonly          
f3e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
f3f0: 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 6f  R_GET_READONLY o
f400: 72 20 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  r 0 */.){.  int 
f410: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
f420: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f430: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
f440: 20 20 61 73 73 65 72 74 28 20 62 52 65 61 64 6f    assert( bReado
f450: 6e 6c 79 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52  nly==PAGER_GET_R
f460: 45 41 44 4f 4e 4c 59 20 7c 7c 20 62 52 65 61 64  EADONLY || bRead
f470: 6f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  only==0 );..  if
f480: 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  ( pgno>btreePage
f490: 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
f4a0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
f4b0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65  RRUPT_BKPT;.  }e
f4c0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  lse{.    rc = bt
f4d0: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
f4e0: 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 52  pgno, ppPage, bR
f4f0: 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 69 66  eadonly);.    if
f500: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f510: 26 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73  && (*ppPage)->is
f520: 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Init==0 ){.     
f530: 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
f540: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
f550: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f560: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
f570: 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
f580: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
f590: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74     }.  }..  test
f5a0: 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
f5b0: 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
f5c0: 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
f5d0: 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
f5e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f5f0: 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
f600: 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
f610: 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
f620: 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
f630: 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
f640: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
f650: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
f660: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
f670: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
f680: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
f690: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
f6a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
f6b0: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
f6c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62  sert( pPage->pDb
f6d0: 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61  Page!=0 );.    a
f6e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
f6f0: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
f700: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
f710: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
f720: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
f730: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
f740: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
f750: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
f760: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
f770: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
f780: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
f790: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
f7a0: 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
f7b0: 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  l(pPage->pDbPage
f7c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
f7d0: 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
f7e0: 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
f7f0: 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
f800: 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
f810: 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
f820: 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
f830: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
f840: 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
f850: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
f860: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
f870: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
f880: 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
f890: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
f8a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f8b0: 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
f8c0: 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
f8d0: 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
f8e0: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
f8f0: 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
f900: 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
f910: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
f920: 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
f930: 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
f940: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
f950: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
f960: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
f970: 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
f980: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f990: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
f9a0: 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
f9b0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
f9c0: 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
f9d0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
f9e0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
f9f0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
fa00: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
fa10: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
fa20: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
fa30: 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
fa40: 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
fa50: 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
fa60: 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
fa70: 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
fa80: 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
fa90: 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
faa0: 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
fab0: 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
fac0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
fad0: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
fae0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
faf0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
fb00: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
fb10: 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
fb20: 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
fb30: 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
fb40: 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
fb50: 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
fb60: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
fb70: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
fb80: 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
fb90: 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
fba0: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
fbb0: 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
fbc0: 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
fbd0: 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
fbe0: 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
fbf0: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
fc00: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
fc10: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
fc20: 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
fc30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
fc40: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
fc50: 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
fc60: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
fc70: 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
fc80: 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
fc90: 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
fca0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
fcb0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
fcc0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
fcd0: 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
fce0: 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
fcf0: 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
fd00: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
fd10: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
fd20: 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
fd30: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
fd40: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
fd50: 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
fd60: 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
fd70: 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
fd80: 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
fd90: 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
fda0: 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
fdb0: 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
fdc0: 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
fdd0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
fde0: 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
fdf0: 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
fe00: 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
fe10: 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
fe20: 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
fe30: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
fe40: 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
fe50: 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
fe60: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
fe70: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
fe80: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
fe90: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
fea0: 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
feb0: 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
fec0: 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
fed0: 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
fee0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
fef0: 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
ff00: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
ff10: 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
ff20: 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54   bits like.** BT
ff30: 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
ff40: 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45   and/or BTREE_ME
ff50: 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  MORY..**.** If t
ff60: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
ff70: 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
ff80: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
ff90: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
ffa0: 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
ffb0: 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
ffc0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
ffd0: 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
ffe0: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
fff0: 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
10000 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
10010 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
10020 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
10030 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
10040 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
10050 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
10060 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
10070 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
10080 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
10090 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
100a0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
100b0 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74  s,      /* VFS t
100c0 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
100d0 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  -tree */.  const
100e0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
100f0 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
10100 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
10110 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
10120 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
10130 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
10140 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
10150 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
10160 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
10170 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
10180 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
10190 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
101a0 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
101b0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
101c0 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
101d0 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
101e0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
101f0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
10200 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
10210 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
10220 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
10230 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
10240 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
10250 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
10260 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
10270 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
10280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
10290 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
102a0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
102b0 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
102c0 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
102d0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
102e0 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
102f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10300 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
10310 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
10320 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
10330 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
10340 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
10350 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
10360 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
10370 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
10380 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
10390 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
103a0 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
103b0 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
103c0 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e   /* True if open
103d0 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
103e0 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  , temporary data
103f0 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
10400 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a  int isTempDb = z
10410 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
10420 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a  Filename[0]==0;.
10430 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
10440 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
10450 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
10460 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
10470 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
10480 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
10490 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
104a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
104b0 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63  MIT_MEMORYDB.  c
104c0 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
104d0 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
104e0 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
104f0 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  = (zFilename && 
10500 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
10510 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  , ":memory:")==0
10520 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
10530 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54           || (isT
10540 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33  empDb && sqlite3
10550 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
10560 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
10570 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73           || (vfs
10580 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
10590 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
105a0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
105b0 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
105c0 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
105d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
105e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
105f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
10600 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
10610 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
10620 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
10630 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
10640 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
10650 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
10660 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
10670 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
10680 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
10690 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
106a0 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
106b0 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
106c0 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
106d0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
106e0 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
106f0 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
10700 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
10710 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
10720 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
10730 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  pDb );..  if( is
10740 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
10750 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
10760 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
10770 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
10780 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
10790 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
107a0 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
107b0 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
107c0 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
107d0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
107e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
107f0 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
10800 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
10810 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
10820 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
10830 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10840 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
10850 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
10860 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
10870 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
10880 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
10890 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
108a0 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
108b0 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
108c0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
108d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
108e0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
108f0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
10900 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
10910 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
10920 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
10930 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
10940 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
10950 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
10960 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
10970 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
10980 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
10990 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62  /.  if( isTempDb
109a0 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d  ==0 && (isMemdb=
109b0 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26  =0 || (vfsFlags&
109c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
109d0 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0) ){.    if( 
109e0 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
109f0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
10a00 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
10a10 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
10a20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
10a30 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
10a40 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
10a50 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46  sqlite3Malloc(nF
10a60 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
10a70 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
10a80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
10a90 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20  mutexShared; ). 
10aa0 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
10ab0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
10ac0 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
10ad0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10ae0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
10af0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10b00 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
10b10 20 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64        if( isMemd
10b20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  b ){.        mem
10b30 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cpy(zFullPathnam
10b40 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71  e, zFilename, sq
10b50 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
10b60 69 6c 65 6e 61 6d 65 29 2b 31 29 3b 0a 20 20 20  ilename)+1);.   
10b70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10b80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10b90 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
10ba0 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  s, zFilename,.  
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bd0 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   nFullPathname, 
10be0 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
10bf0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
10c00 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
10c10 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
10c20 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
10c30 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10c40 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
10c50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
10c60 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53   }.      }.#if S
10c70 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
10c80 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
10c90 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
10ca0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
10cb0 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
10cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
10cd0 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
10ce0 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
10cf0 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
10d00 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
10d10 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
10d20 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
10d30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
10d40 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
10d50 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f  .#endif.      fo
10d60 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53  r(pBt=GLOBAL(BtS
10d70 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
10d80 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20  aredCacheList); 
10d90 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e  pBt; pBt=pBt->pN
10da0 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ext){.        as
10db0 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
10dc0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
10dd0 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c   0==strcmp(zFull
10de0 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Pathname, sqlite
10df0 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
10e00 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a  Bt->pPager, 0)).
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
10e30 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Vfs(pBt->pPager)
10e40 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ==pVfs ){.      
10e50 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
10e60 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64         for(iDb=d
10e70 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30  b->nDb-1; iDb>=0
10e80 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  ; iDb--){.      
10e90 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78        Btree *pEx
10ea0 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62  isting = db->aDb
10eb0 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
10ec0 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73         if( pExis
10ed0 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e  ting && pExistin
10ee0 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20  g->pBt==pBt ){. 
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10f00 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10f10 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
10f20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10f30 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10f40 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
10f50 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
10f60 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
10f70 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
10f80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
10f90 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
10fa0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10fb0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
10fc0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
10fd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10fe0 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
10ff0 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e  .          pBt->
11000 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
11010 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
11020 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
11030 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
11040 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
11050 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11060 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
11070 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ame);.    }.#ifd
11080 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
11090 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
110a0 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65  /* In debug mode
110b0 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65  , we mark all pe
110c0 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73  rsistent databas
110d0 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20  es as sharable. 
110e0 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65       ** even whe
110f0 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20  n they are not. 
11100 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20   This exercises 
11110 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65  the locking code
11120 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69   and.      ** gi
11130 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75  ves more opportu
11140 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73  nity for asserts
11150 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68  (sqlite3_mutex_h
11160 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20  eld()).      ** 
11170 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69  statements to fi
11180 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c  nd locking probl
11190 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ems..      */.  
111a0 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
111b0 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
111c0 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
111d0 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
111e0 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
111f0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
11200 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
11210 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
11220 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65  by the btree are
11230 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
11240 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73  t size.  This is
11250 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
11260 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74  t size changes t
11270 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  hat result.    *
11280 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
11290 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
112a0 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
112b0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
112c0 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20   sizeof(i64)==8 
112d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
112e0 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b  izeof(u64)==8 );
112f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
11300 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
11310 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
11320 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
11330 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
11340 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
11350 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
11360 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
11370 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
11380 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
11390 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
113a0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
113b0 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
113c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
113d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
113e0 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
113f0 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
11400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11410 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41             EXTRA
11420 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66  _SIZE, flags, vf
11430 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e  sFlags, pageRein
11440 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  it);.    if( rc=
11450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11460 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
11470 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
11480 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a  ->pPager, db->sz
11490 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20  Mmap);.      rc 
114a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
114b0 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74  adFileheader(pBt
114c0 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28  ->pPager,sizeof(
114d0 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65  zDbHeader),zDbHe
114e0 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ader);.    }.   
114f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11500 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
11510 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
11520 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
11530 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29  openFlags = (u8)
11540 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e  flags;.    pBt->
11550 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c  db = db;.    sql
11560 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
11570 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61  handler(pBt->pPa
11580 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65  ger, btreeInvoke
11590 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74  BusyHandler, pBt
115a0 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20  );.    p->pBt = 
115b0 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d  pBt;.  .    pBt-
115c0 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >pCursor = 0;.  
115d0 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
115e0 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
115f0 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
11600 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  y(pBt->pPager) )
11610 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
11620 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
11630 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
11640 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20  ECURE_DELETE.   
11650 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
11660 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  = BTS_SECURE_DEL
11670 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ETE;.#endif.    
11680 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
11690 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68  R-51873-39618 Th
116a0 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20  e page size for 
116b0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
116c0 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
116d0 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79  ined by the 2-by
116e0 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74  te integer locat
116f0 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  ed at an offset 
11700 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d  of 16 bytes from
11710 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69  .    ** the begi
11720 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
11730 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
11740 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
11750 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36   = (zDbHeader[16
11760 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64  ]<<8) | (zDbHead
11770 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  er[17]<<16);.   
11780 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
11790 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
117a0 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
117b0 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
117c0 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
117d0 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
117e0 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
117f0 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
11800 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
11810 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
11820 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
11830 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
11840 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
11850 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
11860 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
11870 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
11880 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
11890 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
118a0 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
118b0 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
118c0 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
118d0 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
118e0 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
118f0 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
11900 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
11910 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
11920 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
11930 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
11940 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
11950 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
11960 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
11970 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
11980 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
11990 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
119a0 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
119b0 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
119c0 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
119d0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
119e0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
119f0 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
11a00 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
11a10 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
11a20 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
11a30 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
11a40 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
11a50 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
11a60 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
11a70 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  se{.      /* EVI
11a80 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39  DENCE-OF: R-3749
11a90 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65  7-42412 The size
11aa0 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64   of the reserved
11ab0 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 20   region is.     
11ac0 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
11ad0 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75  y the one-byte u
11ae0 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
11af0 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73  found at an offs
11b00 65 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20 2a  et of 20.      *
11b10 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  * into the datab
11b20 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e  ase file header.
11b30 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65 72   */.      nReser
11b40 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
11b50 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  0];.      pBt->b
11b60 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
11b70 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
11b80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11b90 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
11ba0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
11bb0 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
11bc0 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
11bd0 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
11be0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
11bf0 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
11c00 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
11c10 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
11c20 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
11c30 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
11c40 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
11c50 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
11c60 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
11c70 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
11c80 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
11c90 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
11ca0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
11cb0 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
11cc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
11cd0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
11ce0 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
11cf0 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
11d00 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a  pageSize */.   .
11d10 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
11d20 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
11d30 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
11d40 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
11d50 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
11d60 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
11d70 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
11d80 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
11d90 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
11da0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
11db0 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
11dc0 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
11dd0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
11de0 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a  *mutexShared; ).
11df0 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20        pBt->nRef 
11e00 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  = 1;.      MUTEX
11e10 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61  _LOGIC( mutexSha
11e20 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
11e30 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
11e40 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
11e50 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20  ER);).      if( 
11e60 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
11e70 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  E && sqlite3Glob
11e80 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
11e90 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  tex ){.        p
11ea0 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  Bt->mutex = sqli
11eb0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
11ec0 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
11ed0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  ;.        if( pB
11ee0 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  t->mutex==0 ){. 
11ef0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
11f00 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
11f10 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
11f20 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  Failed = 0;.    
11f30 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
11f40 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20  _open_out;.     
11f50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11f60 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
11f70 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
11f80 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ed);.      pBt->
11f90 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pNext = GLOBAL(B
11fa0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
11fb0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
11fc0 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  ;.      GLOBAL(B
11fd0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
11fe0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
11ff0 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71   = pBt;.      sq
12000 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
12010 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
12020 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
12030 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
12040 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
12050 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
12060 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
12070 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66  _DISKIO).  /* If
12080 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75   the new Btree u
12090 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70  ses a sharable p
120a0 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c  BtShared, then l
120b0 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  ink the new.  **
120c0 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20   Btree into the 
120d0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72  list of all shar
120e0 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20  able Btrees for 
120f0 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74  the same connect
12100 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69  ion..  ** The li
12110 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73  st is kept in as
12120 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
12130 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20   pBt address..  
12140 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  */.  if( p->shar
12150 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  able ){.    int 
12160 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53  i;.    Btree *pS
12170 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ib;.    for(i=0;
12180 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
12190 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69  {.      if( (pSi
121a0 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  b = db->aDb[i].p
121b0 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e  Bt)!=0 && pSib->
121c0 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
121d0 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
121e0 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d  >pPrev ){ pSib =
121f0 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a   pSib->pPrev; }.
12200 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
12210 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a  Bt<pSib->pBt ){.
12220 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
12230 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  xt = pSib;.     
12240 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
12250 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69  0;.          pSi
12260 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  b->pPrev = p;.  
12270 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12280 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
12290 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69  ib->pNext && pSi
122a0 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d  b->pNext->pBt<p-
122b0 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
122c0 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d      pSib = pSib-
122d0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
122e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
122f0 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70  >pNext = pSib->p
12300 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
12310 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b  p->pPrev = pSib;
12320 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
12330 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
12340 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d         p->pNext-
12350 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
12360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12370 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20    pSib->pNext = 
12380 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
12390 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
123a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
123b0 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20  ndif.  *ppBtree 
123c0 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
123d0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
123e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
123f0 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
12400 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
12410 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
12420 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
12430 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
12440 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
12450 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12460 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
12470 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
12480 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72    /* If the B-Tr
12490 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ee was successfu
124a0 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20  lly opened, set 
124b0 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
124c0 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20  size to the.    
124d0 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
124e0 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f  . Except, when o
124f0 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69  pening on an exi
12500 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67  sting shared pag
12510 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a  er-cache,.    **
12520 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74   do not change t
12530 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
12540 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
12550 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
12560 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d  Schema(p, 0, 0)=
12570 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
12580 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
12590 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  size(p->pBt->pPa
125a0 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ger, SQLITE_DEFA
125b0 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b  ULT_CACHE_SIZE);
125c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
125d0 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20   mutexOpen ){.  
125e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
125f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74  3_mutex_held(mut
12600 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73  exOpen) );.    s
12610 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
12620 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
12630 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12640 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
12650 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  nt the BtShared.
12660 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57  nRef counter.  W
12670 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a  hen it reaches z
12680 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74  ero,.** remove t
12690 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
126a0 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73  cture from the s
126b0 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65  haring list.  Re
126c0 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
126d0 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
126e0 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65  f counter reache
126f0 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  s zero and retur
12700 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74  n.** false if it
12710 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69   is still positi
12720 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ve..*/.static in
12730 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  t removeFromShar
12740 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64  ingList(BtShared
12750 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20   *pBt){.#ifndef 
12760 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
12770 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58  ED_CACHE.  MUTEX
12780 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
12790 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
127a0 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ).  BtShared *pL
127b0 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
127c0 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
127d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
127e0 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
127f0 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f  tex) );.  MUTEX_
12800 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
12810 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
12820 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
12830 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
12840 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
12850 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
12860 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
12870 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
12880 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
12890 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
128a0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
128b0 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
128c0 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
128d0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
128e0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
128f0 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
12900 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
12910 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
12920 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
12930 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
12940 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
12950 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
12960 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
12970 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
12980 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
12990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
129a0 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
129b0 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
129c0 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
129d0 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
129e0 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
129f0 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
12a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
12a10 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
12a20 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
12a30 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
12a40 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12a50 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
12a60 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
12a70 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
12a80 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
12a90 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
12aa0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
12ab0 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
12ac0 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
12ad0 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
12ae0 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62 79  ytes with a 4-by
12af0 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61 20  te prefix for a 
12b00 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f  left-child.** po
12b10 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
12b20 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65   void allocateTe
12b30 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
12b40 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70   *pBt){.  if( !p
12b50 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
12b60 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
12b70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
12b80 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
12b90 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f  geSize );..    /
12ba0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65  * One of the use
12bb0 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70  s of pBt->pTmpSp
12bc0 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74  ace is to format
12bd0 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20   cells before.  
12be0 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74    ** inserting t
12bf0 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20  hem into a leaf 
12c00 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66  page (function f
12c10 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66  illInCell()). If
12c20 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69  .    ** a cell i
12c30 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79  s less than 4 by
12c40 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20  tes in size, it 
12c50 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  is rounded up to
12c60 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20   4 bytes.    ** 
12c70 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72  by the various r
12c80 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e  outines that man
12c90 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63  ipulate binary c
12ca0 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20  ells. Which.    
12cb0 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74  ** can mean that
12cc0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e   fillInCell() on
12cd0 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74  ly initializes t
12ce0 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a  he first 2 or 3.
12cf0 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
12d00 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74  pTmpSpace, but t
12d10 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20  hat the first 4 
12d20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64  bytes are copied
12d30 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20   from.    ** it 
12d40 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  into a database 
12d50 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f  page. This is no
12d60 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f  t actually a pro
12d70 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20  blem, but it.   
12d80 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61   ** does cause a
12d90 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20   valgrind error 
12da0 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20  when the 1 or 2 
12db0 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c  bytes of unitial
12dc0 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74  ized .    ** dat
12dd0 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73  a is passed to s
12de0 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65  ystem call write
12df0 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20  (). So to avoid 
12e00 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20  this error,.    
12e10 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73  ** zero the firs
12e20 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d  t 4 bytes of tem
12e30 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20 20  p space here..  
12e40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
12e50 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72 20  :  Provide four 
12e60 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61 6c  bytes of initial
12e70 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f 72  ized space befor
12e80 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65 67  e the.    ** beg
12e90 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53 70  inning of pTmpSp
12ea0 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20 61  ace as an area a
12eb0 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65 70  vailable to prep
12ec0 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c  end the.    ** l
12ed0 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  eft-child pointe
12ee0 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  r to the beginni
12ef0 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20  ng of a cell..  
12f00 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74    */.    if( pBt
12f10 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
12f20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74 2d       memset(pBt-
12f30 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 38  >pTmpSpace, 0, 8
12f40 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 54  );.      pBt->pT
12f50 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20  mpSpace += 4;.  
12f60 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
12f70 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70   Free the pBt->p
12f80 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  TmpSpace allocat
12f90 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
12fa0 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65  id freeTempSpace
12fb0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
12fc0 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70  .  if( pBt->pTmp
12fd0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
12fe0 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20 34  ->pTmpSpace -= 4
12ff0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
13000 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70 53  eFree(pBt->pTmpS
13010 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e  pace);.    pBt->
13020 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 20  pTmpSpace = 0;. 
13030 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
13040 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61  e an open databa
13050 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74  se and invalidat
13060 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
13070 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
13080 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70  eeClose(Btree *p
13090 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
130a0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
130b0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a  tCursor *pCur;..
130c0 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63    /* Close all c
130d0 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69  ursors opened vi
130e0 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20  a this handle.  
130f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
13100 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13110 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
13120 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
13130 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20  nter(p);.  pCur 
13140 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
13150 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b    while( pCur ){
13160 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70  .    BtCursor *p
13170 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20  Tmp = pCur;.    
13180 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  pCur = pCur->pNe
13190 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70  xt;.    if( pTmp
131a0 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
131b0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
131c0 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d  eCloseCursor(pTm
131d0 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
131e0 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79   /* Rollback any
131f0 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
13200 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65  ion and free the
13210 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72   handle structur
13220 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  e..  ** The call
13230 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
13240 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73  Rollback() drops
13250 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73   any table-locks
13260 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68   held by.  ** th
13270 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a  is handle..  */.
13280 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
13290 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45  llback(p, SQLITE
132a0 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  _OK, 0);.  sqlit
132b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
132c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
132d0 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20  are still other 
132e0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
132f0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68  rences to the sh
13300 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20  ared-btree.  ** 
13310 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72  structure, retur
13320 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69  n now. The remai
13330 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f  nder of this pro
13340 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20  cedure cleans . 
13350 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65   ** up the share
13360 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  d-btree..  */.  
13370 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
13380 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c  oLock==0 && p->l
13390 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
133a0 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c  ( !p->sharable |
133b0 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  | removeFromShar
133c0 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a  ingList(pBt) ){.
133d0 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69      /* The pBt i
133e0 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74  s no longer on t
133f0 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c  he sharing list,
13400 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73   so we can acces
13410 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68  s.    ** it with
13420 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f  out having to ho
13430 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20  ld the mutex..  
13440 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61    **.    ** Clea
13450 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65  n out and delete
13460 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62   the BtShared ob
13470 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ject..    */.   
13480 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
13490 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71  Cursor );.    sq
134a0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
134b0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
134c0 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65    if( pBt->xFree
134d0 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70  Schema && pBt->p
134e0 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
134f0 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
13500 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
13510 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
13520 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e  3DbFree(0, pBt->
13530 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72  pSchema);.    fr
13540 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
13550 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
13560 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69  ee(pBt);.  }..#i
13570 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13580 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
13590 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
135a0 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61  ToLock==0 );.  a
135b0 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64  ssert( p->locked
135c0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
135d0 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76  pPrev ) p->pPrev
135e0 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
135f0 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65  xt;.  if( p->pNe
13600 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  xt ) p->pNext->p
13610 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
13620 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
13630 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65  e3_free(p);.  re
13640 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13650 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
13660 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  the limit on the
13670 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
13680 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20   allowed in the 
13690 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cache..**.** The
136a0 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
136b0 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20 69  of cache pages i
136c0 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62 73  s set to the abs
136d0 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  olute.** value o
136e0 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78  f mxPage.  If mx
136f0 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
13700 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  , the pager will
13710 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e  .** operate asyn
13720 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20  chronously - it 
13730 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f  will not stop to
13740 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20   do fsync()s.** 
13750 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20 69  to insure data i
13760 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
13770 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65   disk surface be
13780 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69  fore.** continui
13790 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e  ng.  Transaction
137a0 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20  s still work if 
137b0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
137c0 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ff,.** and the d
137d0 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62  atabase cannot b
137e0 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74  e corrupted if t
137f0 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63  his program.** c
13800 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20  rashes.  But if 
13810 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
13820 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20  stem crashes or 
13830 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61  there is.** an a
13840 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c  brupt power fail
13850 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f  ure when synchro
13860 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65  nous is off, the
13870 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75   database.** cou
13880 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e  ld be left in an
13890 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e   inconsistent an
138a0 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20  d unrecoverable 
138b0 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72  state..** Synchr
138c0 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64  onous is on by d
138d0 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61  efault so databa
138e0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
138f0 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79   not.** normally
13900 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74   a worry..*/.int
13910 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
13920 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20  CacheSize(Btree 
13930 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
13940 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
13950 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
13960 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
13970 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
13980 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
13990 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
139a0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
139b0 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d  etCachesize(pBt-
139c0 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
139d0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
139e0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
139f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13a00 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
13a10 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
13a20 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
13a30 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74  it on the amount
13a40 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
13a50 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62   file that may b
13a60 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70  e.** memory mapp
13a70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
13a80 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69  e3BtreeSetMmapLi
13a90 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71  mit(Btree *p, sq
13aa0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
13ab0 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ap){.  BtShared 
13ac0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
13ad0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13ae0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
13af0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
13b00 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13b10 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
13b20 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
13b30 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d  pBt->pPager, szM
13b40 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  map);.  sqlite3B
13b50 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
13b60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13b70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
13b80 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
13b90 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  ZE>0 */../*.** C
13ba0 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61  hange the way da
13bb0 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20  ta is synced to 
13bc0 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  disk in order to
13bd0 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63   increase or dec
13be0 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c  rease.** how wel
13bf0 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  l the database r
13c00 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75  esists damage du
13c10 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20  e to OS crashes 
13c20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  and power.** fai
13c30 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20  lures.  Level 1 
13c40 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
13c50 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20  synchronous (no 
13c60 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e  syncs() occur an
13c70 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20  d.** there is a 
13c80 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
13c90 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76   of damage)  Lev
13ca0 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61  el 2 is the defa
13cb0 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69  ult.  There.** i
13cc0 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74  s a very low but
13cd0 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62   non-zero probab
13ce0 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e  ility of damage.
13cf0 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65    Level 3 reduce
13d00 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69  s the.** probabi
13d10 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74  lity of damage t
13d20 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20  o near zero but 
13d30 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72  with a write per
13d40 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69  formance reducti
13d50 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  on..*/.#ifndef S
13d60 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
13d70 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c  _PRAGMAS.int sql
13d80 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
13d90 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20  rFlags(.  Btree 
13da0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
13db0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f   /* The btree to
13dc0 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79 20   set the safety 
13dd0 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e  level on */.  un
13de0 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20  signed pgFlags  
13df0 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
13e00 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f  PAGER_* flags */
13e10 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
13e20 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
13e30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
13e40 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
13e50 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
13e60 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
13e70 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
13e80 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e  erSetFlags(pBt->
13e90 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29  pPager, pgFlags)
13ea0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13eb0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
13ec0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13ed0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
13ee0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
13ef0 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20   given btree is 
13f00 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65  set to safety le
13f10 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72  vel 1.  In other
13f20 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72  .** words, retur
13f30 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e  n TRUE if no syn
13f40 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  c() occurs on th
13f50 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f  e disk files..*/
13f60 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13f70 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74  eSyncDisabled(Bt
13f80 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
13f90 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
13fa0 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  t;.  int rc;.  a
13fb0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
13fc0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
13fd0 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73  >mutex) );  .  s
13fe0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13ff0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
14000 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
14010 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  r );.  rc = sqli
14020 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70  te3PagerNosync(p
14030 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73  Bt->pPager);.  s
14040 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
14050 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
14060 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
14070 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  e the default pa
14080 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65  ges size and the
14090 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
140a0 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61  ved bytes per pa
140b0 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  ge..** Or, if th
140c0 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20  e page size has 
140d0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78  already been fix
140e0 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
140f0 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77  E_READONLY .** w
14100 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
14110 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  anything..**.** 
14120 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75  The page size mu
14130 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
14140 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61   2 between 512 a
14150 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68  nd 65536.  If th
14160 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73  e page.** size s
14170 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74  upplied does not
14180 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74   meet this const
14190 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70  raint then the p
141a0 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  age size is not.
141b0 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  ** changed..**.*
141c0 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65  * Page sizes are
141d0 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20   constrained to 
141e0 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  be a power of tw
141f0 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65  o so that the re
14200 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64  gion.** of the d
14210 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
14220 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62  d for locking (b
14230 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44  eginning at PEND
14240 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65  ING_BYTE,.** the
14250 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
14260 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72   the 1GB boundar
14270 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e  y, 0x40000000) n
14280 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  eeds to occur.**
14290 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
142a0 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  g of a page..**.
142b0 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
142c0 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73  nReserve is less
142d0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
142e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
142f0 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73  eserved.** bytes
14300 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66   per page is lef
14310 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
14320 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d  ** If the iFix!=
14330 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  0 then the BTS_P
14340 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c  AGESIZE_FIXED fl
14350 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61  ag is set so tha
14360 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a  t the page size.
14370 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75  ** and autovacuu
14380 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f  m mode can no lo
14390 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e  nger be changed.
143a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
143b0 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
143c0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
143d0 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
143e0 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b  erve, int iFix){
143f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14400 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
14410 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
14420 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
14430 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65  rve>=-1 && nRese
14440 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71  rve<=255 );.  sq
14450 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
14460 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48  p);.#if SQLITE_H
14470 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e  AS_CODEC.  if( n
14480 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74  Reserve>pBt->opt
14490 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70 42  imalReserve ) pB
144a0 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
144b0 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65  e = (u8)nReserve
144c0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
144d0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
144e0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
144f0 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
14500 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
14510 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14520 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
14530 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
14540 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
14550 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
14560 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
14570 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
14580 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
14590 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
145a0 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
145b0 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
145c0 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
145d0 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
145e0 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
145f0 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
14600 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
14610 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
14620 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
14630 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42  t->pPage1 && !pB
14640 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
14650 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
14660 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b  = (u32)pageSize;
14670 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
14680 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  ce(pBt);.  }.  r
14690 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
146a0 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
146b0 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
146c0 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
146d0 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c  e);.  pBt->usabl
146e0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
146f0 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65  eSize - (u16)nRe
14700 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69  serve;.  if( iFi
14710 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  x ) pBt->btsFlag
14720 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
14730 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74  E_FIXED;.  sqlit
14740 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
14750 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14760 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
14770 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
14780 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f  ned page size.*/
14790 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
147a0 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eGetPageSize(Btr
147b0 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
147c0 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
147d0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
147e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d   function is sim
147f0 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42  ilar to sqlite3B
14800 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28 29  treeGetReserve()
14810 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  , except that it
14820 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  .** may only be 
14830 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20  called if it is 
14840 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
14850 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78  the b-tree mutex
14860 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68   is already.** h
14870 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  eld..**.** This 
14880 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65  is useful in one
14890 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e   special case in
148a0 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20   the backup API 
148b0 63 6f 64 65 20 77 68 65 72 65 20 69 74 20 69 73  code where it is
148c0 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74  .** known that t
148d0 68 65 20 73 68 61 72 65 64 20 62 2d 74 72 65 65  he shared b-tree
148e0 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20   mutex is held, 
148f0 62 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e  but the mutex on
14900 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
14910 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
14920 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e  ns *p is not. In
14930 20 74 68 69 73 20 63 61 73 65 20 69 66 20 73 71   this case if sq
14940 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
14950 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20  ).** were to be 
14960 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74  called, it might
14970 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f   collide with so
14980 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69  me other operati
14990 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  on on the.** dat
149a0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61  abase handle tha
149b0 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69  t owns *p, causi
149c0 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68  ng undefined beh
149d0 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  avior..*/.int sq
149e0 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
149f0 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65  erveNoMutex(Btre
14a00 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  e *p){.  int n;.
14a10 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14a20 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
14a30 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
14a40 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67   n = p->pBt->pag
14a50 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
14a60 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65  usableSize;.  re
14a70 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
14a80 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
14a90 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
14aa0 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
14ab0 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
14ac0 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
14ad0 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
14ae0 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
14af0 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
14b00 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
14b10 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
14b20 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  tensions..**.** 
14b30 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55  If SQLITE_HAS_MU
14b40 54 45 58 20 69 73 20 64 65 66 69 6e 65 64 20 74  TEX is defined t
14b50 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72  hen the number r
14b60 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a  eturned is the.*
14b70 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74 68 65  * greater of the
14b80 20 63 75 72 72 65 6e 74 20 72 65 73 65 72 76 65   current reserve
14b90 64 20 73 70 61 63 65 20 61 6e 64 20 74 68 65 20  d space and the 
14ba0 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65  maximum requeste
14bb0 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61  d.** reserve spa
14bc0 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
14bd0 65 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61  e3BtreeGetOptima
14be0 6c 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  lReserve(Btree *
14bf0 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  p){.  int n;.  s
14c00 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
14c10 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
14c20 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
14c30 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66  eNoMutex(p);.#if
14c40 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
14c50 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e  ODEC.  if( n<p->
14c60 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
14c70 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74  rve ) n = p->pBt
14c80 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
14c90 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
14ca0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
14cb0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
14cc0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d  ./*.** Set the m
14cd0 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
14ce0 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  t for a database
14cf0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
14d00 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68  sitive..** No ch
14d10 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
14d20 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72  f mxPage is 0 or
14d30 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65   negative..** Re
14d40 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
14d50 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c  value of mxPage,
14d60 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   return the maxi
14d70 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
14d80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
14d90 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
14da0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
14db0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Page){.  int n;.
14dc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
14dd0 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
14de0 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
14df0 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70  eCount(p->pBt->p
14e00 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
14e10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
14e20 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
14e30 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   n;.}../*.** Set
14e40 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f   the BTS_SECURE_
14e50 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e  DELETE flag if n
14e60 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31  ewFlag is 0 or 1
14e70 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73  .  If newFlag is
14e80 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b   -1,.** then mak
14e90 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41  e no changes.  A
14ea0 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65  lways return the
14eb0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54   value of the BT
14ec0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  S_SECURE_DELETE.
14ed0 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65 72  ** setting after
14ee0 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a   the change..*/.
14ef0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
14f00 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74 72  SecureDelete(Btr
14f10 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c  ee *p, int newFl
14f20 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20  ag){.  int b;.  
14f30 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
14f40 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  n 0;.  sqlite3Bt
14f50 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
14f60 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b  f( newFlag>=0 ){
14f70 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73  .    p->pBt->bts
14f80 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45  Flags &= ~BTS_SE
14f90 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20  CURE_DELETE;.   
14fa0 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70   if( newFlag ) p
14fb0 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
14fc0 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
14fd0 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d  LETE;.  } .  b =
14fe0 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61   (p->pBt->btsFla
14ff0 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
15000 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71  DELETE)!=0;.  sq
15010 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15020 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a  p);.  return b;.
15030 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
15040 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
15050 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  ' property of th
15060 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
15070 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a  he 'autoVacuum'.
15080 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
15090 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
150a0 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
150b0 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a  is enabled. If z
150c0 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69  ero, it.** is di
150d0 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61  sabled. The defa
150e0 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
150f0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
15100 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65  operty is .** de
15110 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
15120 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
15130 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e  UTOVACUUM macro.
15140 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15150 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
15160 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  m(Btree *p, int 
15170 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66  autoVacuum){.#if
15180 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15190 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
151a0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
151b0 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53  NLY;.#else.  BtS
151c0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
151d0 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
151e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
151f0 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63  av = (u8)autoVac
15200 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  uum;..  sqlite3B
15210 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
15220 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
15230 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
15240 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28  E_FIXED)!=0 && (
15250 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61  av ?1:0)!=pBt->a
15260 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
15270 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
15280 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DONLY;.  }else{.
15290 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
152a0 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20  uum = av ?1:0;. 
152b0 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
152c0 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b  um = av==2 ?1:0;
152d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
152e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
152f0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
15300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
15310 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
15320 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
15330 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
15340 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
15350 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
15360 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
15370 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
15380 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
15390 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
153a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
153b0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
153c0 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54  return BTREE_AUT
153d0 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65  OVACUUM_NONE;.#e
153e0 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lse.  int rc;.  
153f0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15400 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20  r(p);.  rc = (. 
15410 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74     (!p->pBt->aut
15420 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  oVacuum)?BTREE_A
15430 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a  UTOVACUUM_NONE:.
15440 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e      (!p->pBt->in
15450 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  crVacuum)?BTREE_
15460 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a  AUTOVACUUM_FULL:
15470 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56  .    BTREE_AUTOV
15480 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a  ACUUM_INCR.  );.
15490 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
154a0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
154b0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
154c0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
154d0 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
154e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
154f0 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
15500 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
15510 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
15520 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
15530 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
15540 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
15550 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
15560 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
15570 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
15580 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
15590 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
155a0 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
155b0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
155c0 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
155d0 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
155e0 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
155f0 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
15600 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
15610 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
15620 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
15630 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
15640 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
15650 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
15660 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
15670 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ons */.  MemPage
15680 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a   *pPage1;     /*
15690 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   Page 1 of the d
156a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
156b0 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
156c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
156d0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
156e0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
156f0 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30  nt nPageFile = 0
15700 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
15710 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
15720 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
15730 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72   int nPageHeader
15740 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
15750 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
15760 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69  database accordi
15770 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20  ng to hdr */..  
15780 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15790 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
157a0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
157b0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
157c0 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
157d0 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
157e0 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ock(pBt->pPager)
157f0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
15800 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
15810 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47  c;.  rc = btreeG
15820 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
15830 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
15840 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15850 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
15860 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
15870 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
15880 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
15890 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
158a0 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
158b0 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
158c0 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67  /.  nPage = nPag
158d0 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79  eHeader = get4by
158e0 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
158f0 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c  1->aData);.  sql
15900 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
15910 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
15920 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69  &nPageFile);.  i
15930 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d  f( nPage==0 || m
15940 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50  emcmp(24+(u8*)pP
15950 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b  age1->aData, 92+
15960 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
15970 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ta,4)!=0 ){.    
15980 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c  nPage = nPageFil
15990 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  e;.  }.  if( nPa
159a0 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20  ge>0 ){.    u32 
159b0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33  pageSize;.    u3
159c0 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  2 usableSize;.  
159d0 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
159e0 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
159f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
15a00 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ADB;.    /* EVID
15a10 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37  ENCE-OF: R-43737
15a20 2d 33 39 39 39 39 20 45 76 65 72 79 20 76 61 6c  -39999 Every val
15a30 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  id SQLite databa
15a40 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20  se file begins. 
15a50 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66     ** with the f
15a60 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65  ollowing 16 byte
15a70 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35  s (in hex): 53 5
15a80 31 20 34 63 20 36 39 20 37 34 20 36 35 20 32 30  1 4c 69 74 65 20
15a90 20 36 36 20 36 66 20 37 32 20 36 64 0a 20 20 20   66 6f 72 6d.   
15aa0 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33 20   ** 61 74 20 33 
15ab0 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d  00. */.    if( m
15ac0 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
15ad0 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
15ae0 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
15af0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
15b00 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  d;.    }..#ifdef
15b10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
15b20 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
15b30 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
15b40 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
15b50 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
15b60 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
15b70 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[19]>1 ){.     
15b80 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
15b90 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23  _failed;.    }.#
15ba0 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67  else.    if( pag
15bb0 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[18]>2 ){.    
15bc0 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
15bd0 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
15be0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15bf0 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20  page1[19]>2 ){. 
15c00 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
15c10 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
15c20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
15c30 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20  e write version 
15c40 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69  is set to 2, thi
15c50 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  s database shoul
15c60 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20  d be accessed.  
15c70 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65    ** in WAL mode
15c80 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20  . If the log is 
15c90 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
15ca0 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54  , open it now. T
15cb0 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75  hen .    ** retu
15cc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
15cd0 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
15ce0 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61  populating BtSha
15cf0 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20  red.pPage1..    
15d00 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65  ** The caller de
15d10 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63  tects this and c
15d20 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
15d30 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69  on again. This i
15d40 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  s.    ** require
15d50 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e  d as the version
15d60 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65   of page 1 curre
15d70 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
15d80 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20  1 buffer.    ** 
15d90 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c  may not be the l
15da0 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20  atest version - 
15db0 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e  there may be a n
15dc0 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20  ewer one in the 
15dd0 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  log.    ** file.
15de0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
15df0 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20  page1[19]==2 && 
15e00 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
15e10 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20   BTS_NO_WAL)==0 
15e20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f  ){.      int isO
15e30 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  pen = 0;.      r
15e40 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
15e50 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61  OpenWal(pBt->pPa
15e60 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20  ger, &isOpen);. 
15e70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
15e80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15e90 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
15ea0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
15eb0 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e  }else if( isOpen
15ec0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
15ed0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
15ee0 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  1);.        retu
15ef0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15f00 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
15f10 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
15f20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
15f30 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
15f40 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33 20  : R-15465-20813 
15f50 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20  The maximum and 
15f60 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65 64  minimum embedded
15f70 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a 20   payload.    ** 
15f80 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74 68  fractions and th
15f90 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20 66  e leaf payload f
15fa0 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20 6d  raction values m
15fb0 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20 61  ust be 64, 32, a
15fc0 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20 20  nd 32..    **.  
15fd0 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
15fe0 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
15ff0 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
16000 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
16010 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
16020 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
16030 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
16040 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
16050 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
16060 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
16070 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
16080 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
16090 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
160a0 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e   }.    /* EVIDEN
160b0 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33  CE-OF: R-51873-3
160c0 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69  9618 The page si
160d0 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  ze for a databas
160e0 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a  e file is.    **
160f0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
16100 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65  he 2-byte intege
16110 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20  r located at an 
16120 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74  offset of 16 byt
16130 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  es from.    ** t
16140 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
16150 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16160 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53 69  e. */.    pageSi
16170 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c  ze = (page1[16]<
16180 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d  <8) | (page1[17]
16190 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45 56  <<16);.    /* EV
161a0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30  IDENCE-OF: R-250
161b0 30 38 2d 32 31 36 38 38 20 54 68 65 20 73 69 7a  08-21688 The siz
161c0 65 20 6f 66 20 61 20 70 61 67 65 20 69 73 20 61  e of a page is a
161d0 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20 20   power of two.  
161e0 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31 32    ** between 512
161f0 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c 75   and 65536 inclu
16200 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sive. */.    if(
16210 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
16220 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20  ageSize)!=0.    
16230 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c   || pageSize>SQL
16240 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
16250 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  E .     || pageS
16260 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b  ize<=256 .    ){
16270 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
16280 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
16290 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
162a0 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
162b0 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  =0 );.    /* EVI
162c0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33 31  DENCE-OF: R-5931
162d0 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65 73  0-51205 The "res
162e0 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69 7a  erved space" siz
162f0 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65 0a  e in the 1-byte.
16300 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61      ** integer a
16310 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20 74  t offset 20 is t
16320 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
16330 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74  es of space at t
16340 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a  he end of.    **
16350 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72 65   each page to re
16360 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e 73  serve for extens
16370 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  ions. .    **.  
16380 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
16390 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20  : R-37497-42412 
163a0 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
163b0 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20  reserved region 
163c0 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
163d0 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d  ined by the one-
163e0 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e  byte unsigned in
163f0 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61  teger found at a
16400 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20  n offset of 20. 
16410 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
16420 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
16430 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61 62  der. */.    usab
16440 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  leSize = pageSiz
16450 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20  e - page1[20];. 
16460 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67 65     if( (u32)page
16470 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53  Size!=pBt->pageS
16480 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
16490 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68  After reading th
164a0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
164b0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
164c0 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a  uming a page siz
164d0 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74  e.      ** of Bt
164e0 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c  Shared.pageSize,
164f0 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65   we have discove
16500 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  red that the pag
16510 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20  e-size is.      
16520 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65  ** actually page
16530 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65  Size. Unlock the
16540 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65   database, leave
16550 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a   pBt->pPage1 at.
16560 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e        ** zero an
16570 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
16580 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  OK. The caller w
16590 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75  ill call this fu
165a0 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
165b0 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63  again with the c
165c0 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65  orrect page-size
165d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
165e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
165f0 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge1);.      pBt-
16600 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73  >usableSize = us
16610 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  ableSize;.      
16620 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
16630 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
16640 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
16650 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
16660 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
16670 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
16680 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
16690 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
166a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166b0 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d         pageSize-
166c0 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20  usableSize);.   
166d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
166e0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74    }.    if( (pBt
166f0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
16700 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64  LITE_RecoveryMod
16710 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e  e)==0 && nPage>n
16720 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20  PageFile ){.    
16730 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
16740 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
16750 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
16760 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
16770 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
16780 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37 30  OF: R-28312-6470
16790 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 75  4 However, the u
167a0 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f  sable size is no
167b0 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20  t allowed to.   
167c0 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61 6e   ** be less than
167d0 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20 77   480. In other w
167e0 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61 67  ords, if the pag
167f0 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20 74  e size is 512, t
16800 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
16810 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73 69  eserved space si
16820 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64  ze cannot exceed
16830 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   32. */.    if( 
16840 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29  usableSize<480 )
16850 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
16860 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
16870 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
16880 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
16890 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
168a0 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
168b0 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
168c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
168d0 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
168e0 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
168f0 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
16900 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
16910 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
16920 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
16930 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
16940 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
16950 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
16960 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
16970 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
16980 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
16990 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
169a0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
169b0 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
169c0 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
169d0 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
169e0 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
169f0 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
16a00 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
16a10 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
16a20 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
16a30 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
16a40 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
16a50 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
16a60 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
16a70 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
16a80 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
16a90 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
16aa0 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
16ab0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
16ac0 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
16ad0 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
16ae0 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
16af0 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
16b00 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
16b10 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68  yte pointer, a h
16b20 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
16b30 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
16b40 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
16b50 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
16b60 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
16b70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
16b80 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
16b90 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
16ba0 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
16bb0 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
16bc0 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
16bd0 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
16be0 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >minLocal = (u16
16bf0 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
16c00 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
16c10 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c  23);.  pBt->maxL
16c20 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d  eaf = (u16)(pBt-
16c30 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
16c40 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  );.  pBt->minLea
16c50 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  f = (u16)((pBt->
16c60 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
16c70 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69  2/255 - 23);.  i
16c80 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  f( pBt->maxLocal
16c90 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d  >127 ){.    pBt-
16ca0 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
16cb0 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b   = 127;.  }else{
16cc0 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
16cd0 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29  tePayload = (u8)
16ce0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
16cf0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
16d00 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
16d10 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
16d20 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
16d30 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
16d40 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
16d50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
16d60 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f  LITE_OK;..page1_
16d70 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72  init_failed:.  r
16d80 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
16d90 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65  1);.  pBt->pPage
16da0 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  1 = 0;.  return 
16db0 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
16dc0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
16dd0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
16de0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
16df0 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f   pBt. This is fo
16e00 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
16e10 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
16e20 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
16e30 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
16e40 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
16e50 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ined..**.** Only
16e60 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
16e70 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72  re counted if wr
16e80 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49  Only is true.  I
16e90 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66  f wrOnly is.** f
16ea0 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75  alse then all cu
16eb0 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
16ec0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  d..**.** For the
16ed0 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
16ee0 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72  s routine, a cur
16ef0 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
16f00 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
16f10 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20  able of reading 
16f20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  or writing to th
16f30 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72  e database.  Cur
16f40 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76  sors that.** hav
16f50 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69  e been tripped i
16f60 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46  nto the CURSOR_F
16f70 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e  AULT state are n
16f80 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73  ot counted..*/.s
16f90 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56  tatic int countV
16fa0 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68  alidCursors(BtSh
16fb0 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77  ared *pBt, int w
16fc0 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  rOnly){.  BtCurs
16fd0 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
16fe0 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
16ff0 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
17000 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
17010 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
17020 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28   (wrOnly==0 || (
17030 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
17040 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
17050 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75  !=0).     && pCu
17060 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
17070 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
17080 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
17090 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
170a0 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
170b0 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
170c0 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
170d0 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
170e0 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
170f0 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
17100 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
17110 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
17120 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
17130 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
17140 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
17150 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
17160 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
17170 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
17180 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
17190 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
171a0 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
171b0 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
171c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
171d0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
171e0 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
171f0 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
17200 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
17210 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
17220 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
17230 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
17240 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
17250 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c  sors(pBt,0)==0 |
17260 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
17270 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
17280 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
17290 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
172a0 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
172b0 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
172c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
172d0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
172e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
172f0 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
17300 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17310 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
17320 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b  t->pPager)==1 );
17330 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
17340 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73   = 0;.    releas
17350 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
17360 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70   }.}../*.** If p
17370 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  Bt points to an 
17380 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20  empty file then 
17390 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70  convert that emp
173a0 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20  ty file.** into 
173b0 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61  a new empty data
173c0 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69  base by initiali
173d0 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  zing the first p
173e0 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61  age of.** the da
173f0 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
17400 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
17410 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
17420 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
17430 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
17440 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
17450 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
17460 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17470 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
17480 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
17490 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
174a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
174b0 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61    pP1 = pBt->pPa
174c0 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge1;.  assert( p
174d0 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20  P1!=0 );.  data 
174e0 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20  = pP1->aData;.  
174f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17500 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50  rWrite(pP1->pDbP
17510 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
17520 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
17530 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69  mcpy(data, zMagi
17540 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  cHeader, sizeof(
17550 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a  zMagicHeader));.
17560 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
17570 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d  (zMagicHeader)==
17580 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d  16 );.  data[16]
17590 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61   = (u8)((pBt->pa
175a0 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29  geSize>>8)&0xff)
175b0 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28  ;.  data[17] = (
175c0 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
175d0 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20  ze>>16)&0xff);. 
175e0 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20   data[18] = 1;. 
175f0 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20   data[19] = 1;. 
17600 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
17610 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70  ableSize<=pBt->p
17620 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e  ageSize && pBt->
17630 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d  usableSize+255>=
17640 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
17650 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38    data[20] = (u8
17660 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
17670 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
17680 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d  e);.  data[21] =
17690 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20   64;.  data[22] 
176a0 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d  = 32;.  data[23]
176b0 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28   = 32;.  memset(
176c0 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30  &data[24], 0, 10
176d0 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67  0-24);.  zeroPag
176e0 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45  e(pP1, PTF_INTKE
176f0 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c  Y|PTF_LEAF|PTF_L
17700 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74  EAFDATA );.  pBt
17710 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
17720 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
17730 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
17740 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
17750 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
17760 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  autoVacuum==1 ||
17770 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
17780 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
17790 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
177a0 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72  ==1 || pBt->incr
177b0 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70  Vacuum==0 );.  p
177c0 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
177d0 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75   + 4*4], pBt->au
177e0 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74  toVacuum);.  put
177f0 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
17800 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72   7*4], pBt->incr
17810 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a  Vacuum);.#endif.
17820 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31    pBt->nPage = 1
17830 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31  ;.  data[31] = 1
17840 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17850 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
17860 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69  nitialize the fi
17870 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
17880 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63  database file (c
17890 72 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61  reating a databa
178a0 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67  se.** consisting
178b0 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   of a single pag
178c0 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20  e and no schema 
178d0 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e  objects). Return
178e0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66   SQLITE_OK.** if
178f0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
17900 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
17910 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
17920 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17930 72 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a  reeNewDb(Btree *
17940 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
17950 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17960 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e  r(p);.  p->pBt->
17970 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20  nPage = 0;.  rc 
17980 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d  = newDatabase(p-
17990 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  >pBt);.  sqlite3
179a0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
179b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
179c0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
179d0 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e  start a new tran
179e0 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65  saction. A write
179f0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20  -transaction.** 
17a00 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68  is started if th
17a10 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
17a20 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74  t is nonzero, ot
17a30 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a  herwise a read-.
17a40 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
17a50 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
17a60 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20  rgument is 2 or 
17a70 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69  more and exclusi
17a80 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
17a90 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65  n is started, me
17aa0 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74  aning that no ot
17ab0 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61  her process is a
17ac0 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63  llowed.** to acc
17ad0 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
17ae0 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67  .  A preexisting
17af0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
17b00 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61   not be.** upgra
17b10 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ded to exclusive
17b20 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
17b30 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e   routine a secon
17b40 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20  d time - the.** 
17b50 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67  exclusivity flag
17b60 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
17b70 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
17b80 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65  n..**.** A write
17b90 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
17ba0 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  t be started bef
17bb0 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
17bc0 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ny .** changes t
17bd0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
17be0 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   None of the fol
17bf0 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
17c00 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e  .** will work un
17c10 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69  less a transacti
17c20 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69  on is started fi
17c30 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  rst:.**.**      
17c40 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
17c50 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  teTable().**    
17c60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
17c70 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20  eateIndex().**  
17c80 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17c90 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20  ClearTable().** 
17ca0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
17cb0 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20  eDropTable().** 
17cc0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
17cd0 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20  eInsert().**    
17ce0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65    sqlite3BtreeDe
17cf0 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  lete().**      s
17d00 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
17d10 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66  eMeta().**.** If
17d20 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65   an initial atte
17d30 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74  mpt to acquire t
17d40 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65  he lock fails be
17d50 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f  cause of lock co
17d60 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  ntention.** and 
17d70 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
17d80 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f   previously unlo
17d90 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  cked, then invok
17da0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
17db0 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  er.** if there i
17dc0 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74  s one.  But if t
17dd0 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75  here was previou
17de0 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c  sly a read-lock,
17df0 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b   do not.** invok
17e00 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
17e10 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e  er - just return
17e20 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53   SQLITE_BUSY.  S
17e30 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a  QLITE_BUSY is .*
17e40 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20  * returned when 
17e50 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
17e60 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20   a read-lock in 
17e70 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61  order to avoid a
17e80 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   deadlock..**.**
17e90 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61   Suppose there a
17ea0 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  re two processes
17eb0 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73   A and B.  A has
17ec0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64   a read lock and
17ed0 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65   B has.** a rese
17ee0 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72  rved lock.  B tr
17ef0 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
17f00 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20  o exclusive but 
17f10 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75  is blocked becau
17f20 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61  se.** of A's rea
17f30 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73  d lock.  A tries
17f40 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72   to promote to r
17f50 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62  eserved but is b
17f60 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20  locked by B..** 
17f70 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72  One or the other
17f80 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63   of the two proc
17f90 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20  esses must give 
17fa0 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e  way or there can
17fb0 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65   be.** no progre
17fc0 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e  ss.  By returnin
17fd0 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  g SQLITE_BUSY an
17fe0 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74  d not invoking t
17ff0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
18000 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61  .** when A alrea
18010 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  dy has a read lo
18020 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65  ck, we encourage
18030 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e   A to give up an
18040 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65  d let B.** proce
18050 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
18060 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
18070 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  s(Btree *p, int 
18080 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74  wrflag){.  sqlit
18090 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a  e3 *pBlock = 0;.
180a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
180b0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
180c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
180d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
180e0 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
180f0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
18100 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65   /* If the btree
18110 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
18120 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
18130 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69  on, or it.  ** i
18140 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72  s already in a r
18150 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
18160 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73  and a read-trans
18170 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72  action.  ** is r
18180 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69  equested, this i
18190 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
181a0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
181b0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
181c0 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52   (p->inTrans==TR
181d0 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66  ANS_READ && !wrf
181e0 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  lag) ){.    goto
181f0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
18200 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  }.  assert( pBt-
18210 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
18220 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49  TRANS_WRITE || I
18230 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
18240 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20  bDoTruncate)==0 
18250 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  );..  /* Write t
18260 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
18270 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20  not possible on 
18280 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
18290 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70  base */.  if( (p
182a0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
182b0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
182c0 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
182d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
182e0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f  ADONLY;.    goto
182f0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
18300 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
18310 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
18320 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74  CHE.  /* If anot
18330 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
18340 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
18350 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
18360 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
18370 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d   on this shared-
18380 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
18390 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69  and a second wri
183a0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
183b0 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64  s.  ** requested
183c0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
183d0 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69  LOCKED..  */.  i
183e0 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42  f( (wrflag && pB
183f0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
18400 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20  ==TRANS_WRITE). 
18410 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c    || (pBt->btsFl
18420 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
18430 47 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70  G)!=0.  ){.    p
18440 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
18450 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73  iter->db;.  }els
18460 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
18470 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49  {.    BtLock *pI
18480 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  ter;.    for(pIt
18490 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
184a0 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
184b0 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
184c0 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
184d0 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
184e0 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d   pBlock = pIter-
184f0 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
18500 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18510 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
18520 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20  if( pBlock ){.  
18530 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
18540 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
18550 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72  , pBlock);.    r
18560 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
18570 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
18580 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
18590 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gun;.  }.#endif.
185a0 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
185b0 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
185c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
185d0 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
185e0 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
185f0 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
18600 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
18610 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
18620 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
18630 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
18640 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
18650 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
18660 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ed. */.  rc = qu
18670 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
18680 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
18690 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
186a0 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  K);.  if( SQLITE
186b0 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74  _OK!=rc ) goto t
186c0 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70  rans_begun;..  p
186d0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
186e0 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45  ~BTS_INITIALLY_E
186f0 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d  MPTY;.  if( pBt-
18700 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d  >nPage==0 ) pBt-
18710 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
18720 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
18730 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20  ;.  do {.    /* 
18740 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29  Call lockBtree()
18750 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42   until either pB
18760 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70  t->pPage1 is pop
18770 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a  ulated or.    **
18780 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74   lockBtree() ret
18790 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  urns something o
187a0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
187b0 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29  _OK. lockBtree()
187c0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  .    ** may retu
187d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  rn SQLITE_OK but
187e0 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
187f0 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61  e1 set to 0 if a
18800 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64  fter.    ** read
18810 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69  ing page 1 it di
18820 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65  scovers that the
18830 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
18840 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
18850 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  ** file is not p
18860 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e  Bt->pageSize. In
18870 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42   this case lockB
18880 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61  tree() will upda
18890 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70  te.    ** pBt->p
188a0 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70  ageSize to the p
188b0 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
188c0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
188d0 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
188e0 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26  pBt->pPage1==0 &
188f0 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
18900 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
18910 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  )) );..    if( r
18920 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18930 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
18940 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
18950 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
18960 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)!=0 ){.      
18970 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
18980 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
18990 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
189a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
189b0 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  gin(pBt->pPager,
189c0 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33  wrflag>1,sqlite3
189d0 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e  TempInMemory(p->
189e0 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  db));.        if
189f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18a00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
18a10 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
18a20 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
18a30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
18a40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18a50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e  E_OK ){.      un
18a60 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
18a70 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  d(pBt);.    }.  
18a80 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46  }while( (rc&0xFF
18a90 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  )==SQLITE_BUSY &
18aa0 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
18ab0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
18ac0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74   &&.          bt
18ad0 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
18ae0 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20  dler(pBt) );..  
18af0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18b00 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  K ){.    if( p->
18b10 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
18b20 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ONE ){.      pBt
18b30 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b  ->nTransaction++
18b40 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
18b50 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
18b60 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  HE.      if( p->
18b70 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
18b80 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c      assert( p->l
18b90 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26  ock.pBtree==p &&
18ba0 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d   p->lock.iTable=
18bb0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =1 );.        p-
18bc0 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45  >lock.eLock = RE
18bd0 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  AD_LOCK;.       
18be0 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d   p->lock.pNext =
18bf0 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
18c00 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20       pBt->pLock 
18c10 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20  = &p->lock;.    
18c20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
18c30 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
18c40 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f  = (wrflag?TRANS_
18c50 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44  WRITE:TRANS_READ
18c60 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  );.    if( p->in
18c70 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61  Trans>pBt->inTra
18c80 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
18c90 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
18ca0 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e  tion = p->inTran
18cb0 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
18cc0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
18cd0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
18ce0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
18cf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18d00 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
18d10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
18d20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
18d30 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74        pBt->pWrit
18d40 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42  er = p;.      pB
18d50 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
18d60 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  BTS_EXCLUSIVE;. 
18d70 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e       if( wrflag>
18d80 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  1 ) pBt->btsFlag
18d90 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49  s |= BTS_EXCLUSI
18da0 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  VE;.#endif..    
18db0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73    /* If the db-s
18dc0 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  ize header field
18dd0 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61   is incorrect (a
18de0 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61  s it may be if a
18df0 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63  n old.      ** c
18e00 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77  lient has been w
18e10 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
18e20 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74  ase file), updat
18e30 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a  e it now. Doing.
18e40 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f        ** this so
18e50 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e  oner rather than
18e60 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65   later means the
18e70 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63   database size c
18e80 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20  an safely .     
18e90 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20   ** re-read the 
18ea0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72  database size fr
18eb0 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73  om page 1 if a s
18ec0 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e  avepoint or tran
18ed0 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  saction.      **
18ee0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
18ef0 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e   within the tran
18f00 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
18f10 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
18f20 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65  >nPage!=get4byte
18f30 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
18f40 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  28]) ){.        
18f50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18f60 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
18f70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
18f80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18f90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
18fa0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
18fb0 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
18fc0 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
18fd0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
18fe0 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65  }.  }...trans_be
18ff0 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  gun:.  if( rc==S
19000 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
19010 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ag ){.    /* Thi
19020 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72  s call makes sur
19030 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
19040 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74   has the correct
19050 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a   number of.    *
19060 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  * open savepoint
19070 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  s. If the second
19080 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72   parameter is gr
19090 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64  eater than 0 and
190a0 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
190b0 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61  journal is not a
190c0 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65  lready open, the
190d0 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65  n it will be ope
190e0 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ned here..    */
190f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
19100 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
19110 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
19120 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69   p->db->nSavepoi
19130 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  nt);.  }..  btre
19140 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
19150 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
19160 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
19170 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
19180 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
19190 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ACUUM../*.** Set
191a0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
191b0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
191c0 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67   children of pag
191d0 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69  e pPage. Also, i
191e0 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61  f.** pPage conta
191f0 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70  ins cells that p
19200 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
19210 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20   pages, set the 
19220 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
19230 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f  ntries for the o
19240 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
19250 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   well..*/.static
19260 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72   int setChildPtr
19270 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  maps(MemPage *pP
19280 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
19290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
192b0 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a  unter variable *
192c0 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
192d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
192f0 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67   of cells in pag
19300 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  e pPage */.  int
19310 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
19320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19330 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
19340 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
19350 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
19360 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20    u8 isInitOrig 
19370 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
19380 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
19390 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61  Page->pgno;..  a
193a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
193b0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
193c0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
193d0 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
193e0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69  Page(pPage);.  i
193f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19400 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74   ){.    goto set
19410 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
19420 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20  ut;.  }.  nCell 
19430 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
19440 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
19450 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
19460 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
19470 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a  ell(pPage, i);..
19480 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66      ptrmapPutOvf
19490 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
194a0 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66  l, &rc);..    if
194b0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
194c0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
194d0 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
194e0 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  e(pCell);.      
194f0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
19500 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
19510 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
19520 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  c);.    }.  }.. 
19530 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
19540 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68  f ){.    Pgno ch
19550 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
19560 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
19570 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
19580 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  t+8]);.    ptrma
19590 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
195a0 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
195b0 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  E, pgno, &rc);. 
195c0 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74   }..set_child_pt
195d0 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61  rmaps_out:.  pPa
195e0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
195f0 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72  nitOrig;.  retur
19600 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
19610 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67  omewhere on pPag
19620 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
19630 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d  o page iFrom.  M
19640 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74  odify this point
19650 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  er so.** that it
19660 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20   points to iTo. 
19670 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20  Parameter eType 
19680 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79  describes the ty
19690 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f  pe of pointer to
196a0 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  .** be modified,
196b0 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a   as  follows:.**
196c0 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45  .** PTRMAP_BTREE
196d0 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61  :     pPage is a
196e0 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
196f0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
19700 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20  at a child .**  
19710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19720 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a   page of pPage..
19730 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
19740 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73  RFLOW1: pPage is
19750 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
19760 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
19770 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77  s at an overflow
19780 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19790 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74        page point
197a0 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20  ed to by one of 
197b0 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61  the cells on pPa
197c0 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
197d0 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67  _OVERFLOW2: pPag
197e0 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
197f0 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
19800 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  er points at the
19810 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20   next.**        
19820 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66             overf
19830 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
19840 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
19850 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  int modifyPagePo
19860 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  inter(MemPage *p
19870 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d  Page, Pgno iFrom
19880 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65  , Pgno iTo, u8 e
19890 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Type){.  assert(
198a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
198b0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
198c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
198d0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
198e0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
198f0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
19900 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
19910 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a  AP_OVERFLOW2 ){.
19920 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
19930 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  er is always the
19940 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
19950 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  f the page in th
19960 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
19970 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50   if( get4byte(pP
19980 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72  age->aData)!=iFr
19990 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  om ){.      retu
199a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
199b0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
199c0 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
199d0 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20  ->aData, iTo);. 
199e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69   }else{.    u8 i
199f0 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
19a00 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69  e->isInit;.    i
19a10 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43  nt i;.    int nC
19a20 65 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49  ell;..    btreeI
19a30 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
19a40 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67      nCell = pPag
19a50 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66  e->nCell;..    f
19a60 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
19a70 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20   i++){.      u8 
19a80 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
19a90 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
19aa0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
19ab0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
19ac0 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  {.        CellIn
19ad0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
19ae0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
19af0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
19b00 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
19b10 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
19b20 6c 6f 77 0a 20 20 20 20 20 20 20 20 20 26 26 20  low.         && 
19b30 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72  pCell+info.iOver
19b40 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61  flow+3<=pPage->a
19b50 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
19b60 50 61 67 65 0a 20 20 20 20 20 20 20 20 20 26 26  Page.         &&
19b70 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65   iFrom==get4byte
19b80 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
19b90 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20  erflow]).       
19ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
19bb0 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
19bc0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69  fo.iOverflow], i
19bd0 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
19be0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
19bf0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19c00 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
19c10 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20  e(pCell)==iFrom 
19c20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
19c30 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f  4byte(pCell, iTo
19c40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
19c50 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
19c60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
19c70 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20     if( i==nCell 
19c80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  ){.      if( eTy
19c90 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe!=PTRMAP_BTREE
19ca0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67   || .          g
19cb0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
19cc0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
19cd0 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f  Offset+8])!=iFro
19ce0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m ){.        ret
19cf0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
19d00 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
19d10 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
19d20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
19d30 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
19d40 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a  ], iTo);.    }..
19d50 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
19d60 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
19d70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
19d80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
19d90 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20  * Move the open 
19da0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
19db0 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f  bPage to locatio
19dc0 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74  n iFreePage in t
19dd0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  he .** database.
19de0 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66   The pDbPage ref
19df0 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76  erence remains v
19e00 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alid..**.** The 
19e10 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e  isCommit flag in
19e20 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
19e30 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
19e40 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a   remember that.*
19e50 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  * the journal ne
19e60 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
19e70 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61  ed before databa
19e80 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d  se page pDbPage-
19e90 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65  >pgno .** can be
19ea0 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65   written to. The
19eb0 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
19ec0 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74  ady promised not
19ed0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61   to write to tha
19ee0 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  t.** page..*/.st
19ef0 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74  atic int relocat
19f00 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
19f10 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
19f20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20    /* Btree */.  
19f30 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65  MemPage *pDbPage
19f40 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ,        /* Open
19f50 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f   page to move */
19f60 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
19f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
19f80 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65  ointer map 'type
19f90 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
19fa0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  age */.  Pgno iP
19fb0 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  trPage,         
19fc0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
19fd0 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79   'page-no' entry
19fe0 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
19ff0 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
1a000 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
1a010 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f  e location to mo
1a020 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f  ve pDbPage to */
1a030 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1a040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1a050 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73  sCommit flag pas
1a060 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61  sed to sqlite3Pa
1a070 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29  gerMovepage */.)
1a080 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74  {.  MemPage *pPt
1a090 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  rPage;   /* The 
1a0a0 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
1a0b0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
1a0c0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1a0d0 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50  o iDbPage = pDbP
1a0e0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  age->pgno;.  Pag
1a0f0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
1a100 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1a110 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  rc;..  assert( e
1a120 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1a130 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d  RFLOW2 || eType=
1a140 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1a150 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70  1 || .      eTyp
1a160 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1a170 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1a180 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61  _ROOTPAGE );.  a
1a190 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1a1a0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1a1b0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1a1c0 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d  t( pDbPage->pBt=
1a1d0 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  =pBt );..  /* Mo
1a1e0 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
1a1f0 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74  from its current
1a200 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
1a210 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
1a220 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
1a230 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
1a240 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
1a250 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
1a260 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
1a270 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
1a280 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
1a290 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
1a2a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1a2b0 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
1a2c0 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
1a2d0 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
1a2e0 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  sCommit);.  if( 
1a2f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a300 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1a310 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70    }.  pDbPage->p
1a320 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b  gno = iFreePage;
1a330 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67  ..  /* If pDbPag
1a340 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61  e was a btree-pa
1a350 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  ge, then it may 
1a360 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73  have child pages
1a370 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20   and/or cells.  
1a380 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
1a390 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
1a3a0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
1a3b0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
1a3c0 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65   these.  ** page
1a3d0 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  s need to be cha
1a3e0 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nged..  **.  ** 
1a3f0 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e  If pDbPage is an
1a400 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
1a410 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34  then the first 4
1a420 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65   bytes may store
1a430 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20   a.  ** pointer 
1a440 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  to a subsequent 
1a450 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
1a460 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
1a470 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  se, then.  ** th
1a480 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65  e pointer map ne
1a490 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
1a4a0 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71  d for the subseq
1a4b0 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1a4c0 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
1a4d0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
1a4e0 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
1a4f0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1a500 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
1a510 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65  dPtrmaps(pDbPage
1a520 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1a530 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a540 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1a550 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1a560 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20  Pgno nextOvfl = 
1a570 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65  get4byte(pDbPage
1a580 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
1a590 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b  ( nextOvfl!=0 ){
1a5a0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1a5b0 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
1a5c0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1a5d0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63  , iFreePage, &rc
1a5e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1a5f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a600 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1a610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a620 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65   }..  /* Fix the
1a630 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
1a640 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61  r on page iPtrPa
1a650 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20  ge that pointed 
1a660 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20  at iDbPage so.  
1a670 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
1a680 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20  s at iFreePage. 
1a690 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69  Also fix the poi
1a6a0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
1a6b0 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65  or.  ** iPtrPage
1a6c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1a6d0 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
1a6e0 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
1a6f0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1a700 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
1a710 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  rPage, 0);.    i
1a720 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a730 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1a740 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
1a750 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1a760 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  Write(pPtrPage->
1a770 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1a780 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a790 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
1a7a0 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1a7b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1a7c0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1a7d0 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
1a7e0 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50  r(pPtrPage, iDbP
1a7f0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1a800 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65  eType);.    rele
1a810 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
1a820 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1a830 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a840 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1a850 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
1a860 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63  e, iPtrPage, &rc
1a870 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1a880 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1a890 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
1a8a0 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
1a8b0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
1a8c0 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
1a8d0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1a8e0 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65  e(BtShared *, Me
1a8f0 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a  mPage **, Pgno *
1a900 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a  , Pgno, u8);../*
1a910 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
1a920 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20  ngle step of an 
1a930 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
1a940 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  um. If successfu
1a950 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  l, return.** SQL
1a960 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65  ITE_OK. If there
1a970 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64   is no work to d
1a980 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  o (and therefore
1a990 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a   no point in .**
1a9a0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
1a9b0 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72  nction again), r
1a9c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
1a9d0 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72  E. Or, if an err
1a9e0 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72  or .** occurs, r
1a9f0 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72  eturn some other
1aa00 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
1aa10 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
1aa20 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
1aa30 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
1aa40 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20  re-organize the 
1aa50 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20  database so .** 
1aa60 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
1aa70 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  ge of the file c
1aa80 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20  urrently in use 
1aa90 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20  is no longer in 
1aaa0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  use..**.** Param
1aab0 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65  eter nFin is the
1aac0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1aad0 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61 62   that this datab
1aae0 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69  ase would contai
1aaf0 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66  n.** were this f
1ab00 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75  unction called u
1ab10 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
1ab20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
1ab30 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69  ** If the bCommi
1ab40 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  t parameter is n
1ab50 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75  on-zero, this fu
1ab60 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
1ab70 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c  hat the .** call
1ab80 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c  er will keep cal
1ab90 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53  ling incrVacuumS
1aba0 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72  tep() until it r
1abb0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1abc0 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72  NE .** or an err
1abd0 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70  or. bCommit is p
1abe0 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20 61  assed true for a
1abf0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e  n auto-vacuum-on
1ac00 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72  -commit .** oper
1ac10 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20  ation, or false 
1ac20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  for an increment
1ac30 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74  al vacuum..*/.st
1ac40 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63  atic int incrVac
1ac50 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64  uumStep(BtShared
1ac60 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e   *pBt, Pgno nFin
1ac70 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20  , Pgno iLastPg, 
1ac80 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20  int bCommit){.  
1ac90 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20  Pgno nFreeList; 
1aca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1acb0 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69  ber of pages sti
1acc0 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ll on the free-l
1acd0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ist */.  int rc;
1ace0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1acf0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1ad00 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1ad10 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e  assert( iLastPg>
1ad20 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21  nFin );..  if( !
1ad30 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1ad40 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69  t, iLastPg) && i
1ad50 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f  LastPg!=PENDING_
1ad60 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1ad70 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  {.    u8 eType;.
1ad80 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
1ad90 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
1ada0 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
1adb0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1adc0 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
1add0 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  FreeList==0 ){. 
1ade0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1adf0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
1ae00 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1ae10 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  et(pBt, iLastPg,
1ae20 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
1ae30 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1ae40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ae50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ae60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79     }.    if( eTy
1ae70 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
1ae80 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74  AGE ){.      ret
1ae90 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1aea0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
1aeb0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1aec0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
1aed0 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  {.      if( bCom
1aee0 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
1aef0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
1af00 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69  page from the fi
1af10 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  les free-list. T
1af20 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
1af30 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
1af40 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e  f bCommit is non
1af50 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
1af60 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
1af70 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
1af80 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
1af90 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
1afa0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1afb0 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
1afc0 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
1afd0 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
1afe0 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
1aff0 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
1b000 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1b010 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
1b020 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
1b030 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
1b040 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
1b050 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
1b060 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
1b070 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41  Pg, iLastPg, BTA
1b080 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20  LLOC_EXACT);.   
1b090 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1b0a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b0b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1b0c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b0d0 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
1b0e0 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  ==iLastPg );.   
1b0f0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1b100 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
1b110 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
1b120 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
1b130 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
1b140 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65  /* Index of free
1b150 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c   page to move pL
1b160 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20  astPg to */.    
1b170 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74    MemPage *pLast
1b180 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f  Pg;.      u8 eMo
1b190 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  de = BTALLOC_ANY
1b1a0 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61  ;   /* Mode para
1b1b0 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
1b1c0 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
1b1d0 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61  .      Pgno iNea
1b1e0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
1b1f0 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d   /* nearby param
1b200 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74  eter for allocat
1b210 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a  eBtreePage() */.
1b220 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
1b230 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
1b240 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c  astPg, &pLastPg,
1b250 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1b260 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b270 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1b280 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
1b290 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20    /* If bCommit 
1b2a0 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f  is zero, this lo
1b2b0 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20  op runs exactly 
1b2c0 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c  once and page pL
1b2d0 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69  astPg.      ** i
1b2e0 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74  s swapped with t
1b2f0 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61  he first free pa
1b300 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68  ge pulled off th
1b310 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20  e free list..   
1b320 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
1b330 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
1b340 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  , if bCommit is 
1b350 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
1b360 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
1b370 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
1b380 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
1b390 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
1b3a0 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
1b3b0 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
1b3c0 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
1b3d0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
1b3e0 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1b3f0 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   ){.        eMod
1b400 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a  e = BTALLOC_LE;.
1b410 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20          iNear = 
1b420 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nFin;.      }.  
1b430 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
1b440 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
1b450 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
1b460 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1b470 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
1b480 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72   &iFreePg, iNear
1b490 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20  , eMode);.      
1b4a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b4b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1b4c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
1b4d0 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  stPg);.         
1b4e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b4f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
1b500 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
1b510 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  g);.      }while
1b520 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72  ( bCommit && iFr
1b530 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20  eePg>nFin );.   
1b540 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
1b550 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  Pg<iLastPg );.  
1b560 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20      .      rc = 
1b570 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
1b580 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65  , pLastPg, eType
1b590 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65  , iPtrPage, iFre
1b5a0 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20  ePg, bCommit);. 
1b5b0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1b5c0 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
1b5d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b5e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1b5f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1b600 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1b610 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1b620 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69      do {.      i
1b630 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77  LastPg--;.    }w
1b640 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50  hile( iLastPg==P
1b650 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1b660 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f  (pBt) || PTRMAP_
1b670 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
1b680 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d  tPg) );.    pBt-
1b690 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
1b6a0 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
1b6b0 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a   = iLastPg;.  }.
1b6c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b6d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
1b6e0 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
1b6f0 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72   by the first ar
1b700 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74  gument is an aut
1b710 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1b720 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73  e.** nOrig pages
1b730 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e   in size contain
1b740 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20 70  ing nFree free p
1b750 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65  ages. Return the
1b760 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69   expected .** si
1b770 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1b780 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c  se in pages foll
1b790 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61  owing an auto-va
1b7a0 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  cuum operation..
1b7b0 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66  */.static Pgno f
1b7c0 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61  inalDbSize(BtSha
1b7d0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
1b7e0 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65  Orig, Pgno nFree
1b7f0 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b  ){.  int nEntry;
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b810 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b820 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65  f entries on one
1b830 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a   ptrmap page */.
1b840 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20    Pgno nPtrmap; 
1b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b860 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
1b870 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62  trMap pages to b
1b880 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e  e freed */.  Pgn
1b890 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
1b8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b8b0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
1b8c0 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d  .  nEntry = pBt-
1b8d0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20  >usableSize/5;. 
1b8e0 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
1b8f0 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
1b900 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
1b910 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79  )+nEntry)/nEntry
1b920 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67  ;.  nFin = nOrig
1b930 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d   - nFree - nPtrm
1b940 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e  ap;.  if( nOrig>
1b950 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1b960 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50  E(pBt) && nFin<P
1b970 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1b980 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69  (pBt) ){.    nFi
1b990 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  n--;.  }.  while
1b9a0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
1b9b0 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46  pBt, nFin) || nF
1b9c0 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  in==PENDING_BYTE
1b9d0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1b9e0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20    nFin--;.  }.. 
1b9f0 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a   return nFin;.}.
1ba00 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
1ba10 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
1ba20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
1ba30 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
1ba40 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
1ba50 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
1ba60 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
1ba70 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
1ba80 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
1ba90 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
1baa0 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
1bab0 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
1bac0 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
1bad0 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
1bae0 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
1baf0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
1bb00 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
1bb10 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a  rror occurred,.*
1bb20 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1bb30 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1bb40 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  se an SQLite err
1bb50 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74  or code. .*/.int
1bb60 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
1bb70 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  rVacuum(Btree *p
1bb80 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1bb90 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1bba0 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
1bbb0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1bbc0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1bbd0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1bbe0 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e  ANS_WRITE && p->
1bbf0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1bc00 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70  RITE );.  if( !p
1bc10 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1bc20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1bc30 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  E_DONE;.  }else{
1bc40 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20  .    Pgno nOrig 
1bc50 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
1bc60 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20  (pBt);.    Pgno 
1bc70 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
1bc80 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1bc90 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50  Data[36]);.    P
1bca0 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c  gno nFin = final
1bcb0 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
1bcc0 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20  g, nFree);..    
1bcd0 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29  if( nOrig<nFin )
1bce0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1bcf0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1bd00 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1bd10 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
1bd20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
1bd30 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1bd40 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1bd50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1bd60 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
1bd70 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
1bd80 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  Bt);.        rc 
1bd90 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
1bda0 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69  (pBt, nFin, nOri
1bdb0 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  g, 0);.      }. 
1bdc0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1bdd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1bde0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1bdf0 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
1be00 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1be10 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1be20 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1be30 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
1be40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
1be50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1be60 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1be70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1be80 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1be90 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1bea0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1beb0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1bec0 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
1bed0 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
1bee0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
1bef0 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  ** is committed 
1bf00 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1bf10 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  um database..**.
1bf20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
1bf30 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
1bf40 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65  n *pnTrunc is se
1bf50 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
1bf60 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20  of pages.** the 
1bf70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
1bf80 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
1bf90 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  d to during the 
1bfa0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20  commit process. 
1bfb0 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74  .** i.e. the dat
1bfc0 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72  abase has been r
1bfd0 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68  eorganized so th
1bfe0 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  at only the firs
1bff0 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61  t *pnTrunc.** pa
1c000 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a  ges are in use..
1c010 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
1c020 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42  toVacuumCommit(B
1c030 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
1c040 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1c050 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
1c060 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
1c070 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20  er;.  VVA_ONLY( 
1c080 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74  int nRef = sqlit
1c090 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
1c0a0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73  pPager) );..  as
1c0b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1c0c0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1c0d0 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69  tex) );.  invali
1c0e0 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
1c0f0 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73  ache(pBt);.  ass
1c100 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  ert(pBt->autoVac
1c110 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74  uum);.  if( !pBt
1c120 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a  ->incrVacuum ){.
1c130 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20      Pgno nFin;  
1c140 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c150 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
1c160 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f  abase after auto
1c170 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20  vacuuming */.   
1c180 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20   Pgno nFree;    
1c190 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c1a0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1c1b0 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  eelist initially
1c1c0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72   */.    Pgno iFr
1c1d0 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ee;        /* Th
1c1e0 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62  e next page to b
1c1f0 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50  e freed */.    P
1c200 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20  gno nOrig;      
1c210 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69    /* Database si
1c220 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  ze before freein
1c230 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20  g */..    nOrig 
1c240 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
1c250 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50  (pBt);.    if( P
1c260 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1c270 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69  , nOrig) || nOri
1c280 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
1c290 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1c2a0 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20     /* It is not 
1c2b0 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61  possible to crea
1c2c0 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f  te a database fo
1c2d0 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61  r which the fina
1c2e0 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  l page.      ** 
1c2f0 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e  is either a poin
1c300 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20  ter-map page or 
1c310 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65  the pending-byte
1c320 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20   page. If one.  
1c330 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e      ** is encoun
1c340 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69  tered, this indi
1c350 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e  cates corruption
1c360 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1c370 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1c380 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1c390 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20   }..    nFree = 
1c3a0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
1c3b0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1c3c0 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69  );.    nFin = fi
1c3d0 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
1c3e0 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20  Orig, nFree);.  
1c3f0 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67    if( nFin>nOrig
1c400 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1c410 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1c420 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69     if( nFin<nOri
1c430 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  g ){.      rc = 
1c440 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
1c450 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Bt, 0, 0);.    }
1c460 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e  .    for(iFree=n
1c470 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e  Orig; iFree>nFin
1c480 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1c490 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20  K; iFree--){.   
1c4a0 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
1c4b0 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
1c4c0 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20  , iFree, 1);.   
1c4d0 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d   }.    if( (rc==
1c4e0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72  SQLITE_DONE || r
1c4f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
1c500 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
1c510 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1c520 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
1c530 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1c540 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1c550 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1c560 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[32], 0);.    
1c570 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1c580 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1c590 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  6], 0);.      pu
1c5a0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1c5b0 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
1c5c0 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74  nFin);.      pBt
1c5d0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
1c5e0 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  1;.      pBt->nP
1c5f0 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  age = nFin;.    
1c600 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
1c610 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c620 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1c630 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
1c640 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
1c650 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65  rt( nRef>=sqlite
1c660 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1c670 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
1c680 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20  rn rc;.}..#else 
1c690 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /* ifndef SQLITE
1c6a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1c6b0 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74   */.# define set
1c6c0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20  ChildPtrmaps(x) 
1c6d0 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
1c6e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1c6f0 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
1c700 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74  rst phase of a t
1c710 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e  wo-phase commit.
1c720 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1c730 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62  * causes a rollb
1c740 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  ack journal to b
1c750 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74  e created (if it
1c760 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
1c770 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20  y exist).** and 
1c780 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65  populated with e
1c790 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f  nough informatio
1c7a0 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70  n so that if a p
1c7b0 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73  ower loss occurs
1c7c0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1c7d0 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
1c7e0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
1c7f0 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e   state by playin
1c800 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f  g back.** the jo
1c810 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65  urnal.  Then the
1c820 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1c830 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75   journal are flu
1c840 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74  shed out to.** t
1c850 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20  he disk.  After 
1c860 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
1c870 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20  afely on oxide, 
1c880 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  the changes to t
1c890 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61  he.** database a
1c8a0 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
1c8b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c8c0 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f  e and flushed to
1c8d0 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68   oxide..** At th
1c8e0 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61  e end of this ca
1c8f0 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ll, the rollback
1c900 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65   journal still e
1c910 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  xists on the.** 
1c920 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20  disk and we are 
1c930 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c  still holding al
1c940 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20  l locks, so the 
1c950 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1c960 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  not.** committed
1c970 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74  .  See sqlite3Bt
1c980 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1c990 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f  o() for the seco
1c9a0 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a  nd phase of the.
1c9b0 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  ** commit proces
1c9c0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  s..**.** This ca
1c9d0 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ll is a no-op if
1c9e0 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
1c9f0 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74  ction is current
1ca00 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74  ly active on pBt
1ca10 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1ca20 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  e, sync the data
1ca30 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
1ca40 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61  e btree pBt. zMa
1ca50 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  ster points to.*
1ca60 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  * the name of a 
1ca70 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1ca80 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
1ca90 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
1caa0 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
1cab0 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  l journal file, 
1cac0 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69  or is NULL, indi
1cad0 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72  cating no master
1cae0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
1caf0 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61  * (single databa
1cb00 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
1cb10 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
1cb20 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1cb30 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73  master journal s
1cb40 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61  hould already ha
1cb50 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74  ve been.** creat
1cb60 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69  ed, populated wi
1cb70 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  th this journal 
1cb80 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63  pointer and sync
1cb90 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
1cba0 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72  * Once this is r
1cbb0 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72  outine has retur
1cbc0 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68  ned, the only th
1cbd0 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20  ing required to 
1cbe0 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72  commit.** the wr
1cbf0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1cc00 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
1cc10 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c  e file is to del
1cc20 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
1cc30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1cc40 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
1cc50 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e  ne(Btree *p, con
1cc60 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
1cc70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1cc80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
1cc90 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1cca0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
1ccb0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1ccc0 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
1ccd0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1cce0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ccf0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1cd00 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
1cd10 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
1cd20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43  rc = autoVacuumC
1cd30 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20  ommit(pBt);.    
1cd40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1cd50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
1cd60 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1cd70 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
1cd80 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1cd90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
1cda0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29  t->bDoTruncate )
1cdb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1cdc0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
1cdd0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
1cde0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1cdf0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  }.#endif.    rc 
1ce00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
1ce10 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
1ce20 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  ->pPager, zMaste
1ce30 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
1ce40 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1ce50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1ce60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1ce70 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1ce80 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72  ed from both Btr
1ce90 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1cea0 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c  () and BtreeRoll
1ceb0 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65  back().** at the
1cec0 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61   conclusion of a
1ced0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
1cee0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
1cef0 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
1cf00 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
1cf10 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1cf20 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  >pBt;.  sqlite3 
1cf30 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61  *db = p->db;.  a
1cf40 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1cf50 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
1cf60 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
1cf70 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1cf80 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72  UUM.  pBt->bDoTr
1cf90 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64  uncate = 0;.#end
1cfa0 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  if.  if( p->inTr
1cfb0 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  ans>TRANS_NONE &
1cfc0 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e  & db->nVdbeRead>
1cfd0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  1 ){.    /* If t
1cfe0 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61  here are other a
1cff0 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
1d000 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
1d010 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20  this database.  
1d020 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77    ** handle, dow
1d030 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64  ngrade to a read
1d040 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
1d050 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61  n. The other sta
1d060 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d  tements.    ** m
1d070 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ay still be read
1d080 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ing from the dat
1d090 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64  abase.  */.    d
1d0a0 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
1d0b0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
1d0c0 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72  (p);.    p->inTr
1d0d0 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ans = TRANS_READ
1d0e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1d0f0 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
1d100 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20  had any kind of 
1d110 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
1d120 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20  , decrement the 
1d130 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
1d140 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  ion count of the
1d150 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49   shared btree. I
1d160 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1d170 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20  n count .    ** 
1d180 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74  reaches 0, set t
1d190 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
1d1a0 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54  to TRANS_NONE. T
1d1b0 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  he unlockBtreeIf
1d1c0 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20  Unused().    ** 
1d1d0 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20  call below will 
1d1e0 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
1d1f0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  .  */.    if( p-
1d200 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
1d210 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c  NONE ){.      cl
1d220 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
1d230 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
1d240 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
1d250 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20  saction--;.     
1d260 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
1d270 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
1d280 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
1d290 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
1d2a0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NONE;.      }.  
1d2b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
1d2c0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
1d2d0 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f  saction state to
1d2e0 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20   TRANS_NONE and 
1d2f0 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20  unlock the .    
1d300 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73  ** pager if this
1d310 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
1d320 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
1d330 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
1d340 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72    */.    p->inTr
1d350 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
1d360 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  ;.    unlockBtre
1d370 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1d380 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
1d390 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  grity(p);.}../*.
1d3a0 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72  ** Commit the tr
1d3b0 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e  ansaction curren
1d3c0 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  tly in progress.
1d3d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1d3e0 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ine implements t
1d3f0 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
1d400 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d  of a 2-phase com
1d410 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c  mit.  The.** sql
1d420 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1d430 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e  haseOne() routin
1d440 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
1d450 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c   phase and shoul
1d460 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20  d.** be invoked 
1d470 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
1d480 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
1d490 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  The sqlite3Btree
1d4a0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
1d4b0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20  .** routine did 
1d4c0 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  all the work of 
1d4d0 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74  writing informat
1d4e0 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20  ion out to disk 
1d4f0 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65  and flushing the
1d500 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20  .** contents so 
1d510 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72  that they are wr
1d520 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64  itten onto the d
1d530 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c  isk platter.  Al
1d540 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  l this.** routin
1d550 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64  e has to do is d
1d560 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74  elete or truncat
1d570 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65  e or zero the he
1d580 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74  ader in the.** t
1d590 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1d5a0 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65  nal (which cause
1d5b0 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
1d5c0 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64  n to commit) and
1d5d0 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a  .** drop locks..
1d5e0 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
1d5f0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
1d600 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  rs while the pag
1d610 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74 65  er layer is atte
1d620 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69  mpting to .** fi
1d630 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72  nalize the under
1d640 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69  lying journal fi
1d650 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  le, this functio
1d660 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  n returns an err
1d670 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70  or and.** the up
1d680 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61  per layer will a
1d690 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
1d6a0 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  k. However, if t
1d6b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1d6c0 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  nt.** is non-zer
1d6d0 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72  o then this b-tr
1d6e0 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ee transaction i
1d6f0 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  s part of a mult
1d700 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73  i-file .** trans
1d710 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
1d720 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61  case, the transa
1d730 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
1d740 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64  y been committed
1d750 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e   .** (by deletin
1d760 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  g a master journ
1d770 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65  al file) and the
1d780 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e   caller will ign
1d790 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  ore this .** fun
1d7a0 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f  ctions return co
1d7b0 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20  de. So, even if 
1d7c0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1d7d0 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  in the pager lay
1d7e0 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65  er,.** reset the
1d7f0 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20   b-tree objects 
1d800 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74  internal state t
1d810 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
1d820 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61  the write.** tra
1d830 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65  nsaction has bee
1d840 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69  n closed. This i
1d850 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 73  s quite safe, as
1d860 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20   the pager will 
1d870 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69  have.** transiti
1d880 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f  oned to the erro
1d890 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54  r state..**.** T
1d8a0 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
1d8b0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
1d8c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1d8d0 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
1d8e0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
1d8f0 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
1d900 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
1d910 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
1d920 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1d930 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65  mitPhaseTwo(Btre
1d940 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e  e *p, int bClean
1d950 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  up){..  if( p->i
1d960 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
1d970 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  NE ) return SQLI
1d980 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33  TE_OK;.  sqlite3
1d990 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1d9a0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1d9b0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
1d9c0 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72   handle has a wr
1d9d0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1d9e0 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65  open, commit the
1d9f0 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a   shared-btrees .
1da00 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1da10 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61   and set the sha
1da20 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
1da30 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20  NS_READ..  */.  
1da40 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1da50 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
1da60 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42     int rc;.    B
1da70 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1da80 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
1da90 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
1daa0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
1dab0 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TE );.    assert
1dac0 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pBt->nTransact
1dad0 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  ion>0 );.    rc 
1dae0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
1daf0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
1db00 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
1db10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1db20 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20   && bCleanup==0 
1db30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1db40 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1db50 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1db60 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61      }.    p->iDa
1db70 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a  taVersion--;  /*
1db80 20 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20   Compensate for 
1db90 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
1dba0 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70  sion++; */.    p
1dbb0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1dbc0 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
1dbd0 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61      btreeClearHa
1dbe0 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
1dbf0 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
1dc00 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
1dc10 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1dc20 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
1dc30 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1dc40 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65  ** Do both phase
1dc50 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a  s of a commit..*
1dc60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1dc70 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a  eeCommit(Btree *
1dc80 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
1dc90 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1dca0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r(p);.  rc = sql
1dcb0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1dcc0 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20  haseOne(p, 0);. 
1dcd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dce0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1dcf0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1dd00 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b  tPhaseTwo(p, 0);
1dd10 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
1dd20 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1dd30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1dd40 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1dd50 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74  sets the state t
1dd60 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61  o CURSOR_FAULT a
1dd70 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  nd the error.** 
1dd80 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20  code to errCode 
1dd90 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72  for every cursor
1dda0 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64   on any BtShared
1ddb0 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
1ddc0 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20  references.  Or 
1ddd0 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  if the writeOnly
1dde0 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
1ddf0 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20  1, then only.** 
1de00 74 72 69 70 20 77 72 69 74 65 20 63 75 72 73 6f  trip write curso
1de10 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61  rs and leave rea
1de20 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e  d cursors unchan
1de30 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ged..**.** Every
1de40 20 63 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e   cursor is a can
1de50 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 72 69  didate to be tri
1de60 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pped, including 
1de70 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20  cursors.** that 
1de80 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20  belong to other 
1de90 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1dea0 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e  ions that happen
1deb0 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e   to be.** sharin
1dec0 67 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68  g the cache with
1ded0 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54   pBtree..**.** T
1dee0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73  his routine gets
1def0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
1df00 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20  ollback occurs. 
1df10 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  If the writeOnly
1df20 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
1df30 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
1df40 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62  e-cursors need b
1df50 65 20 74 72 69 70 70 65 64 20 2d 20 72 65 61 64  e tripped - read
1df60 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73  -only.** cursors
1df70 20 73 61 76 65 20 74 68 65 69 72 20 63 75 72 72   save their curr
1df80 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f  ent positions so
1df90 20 74 68 61 74 20 74 68 65 79 20 6d 61 79 20 63   that they may c
1dfa0 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c  ontinue .** foll
1dfb0 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  owing the rollba
1dfc0 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65  ck. Or, if write
1dfd0 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61  Only is false, a
1dfe0 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a  ll cursors are .
1dff0 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67  ** tripped. In g
1e000 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c  eneral, writeOnl
1e010 79 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  y is false if th
1e020 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
1e030 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  ing.** rolled ba
1e040 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20  ck modified the 
1e050 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
1e060 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d   In this case b-
1e070 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67  tree root.** pag
1e080 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20  es may be moved 
1e090 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  or deleted from 
1e0a0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 74  the database alt
1e0b0 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a  ogether, making.
1e0c0 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72  ** it unsafe for
1e0d0 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f   read cursors to
1e0e0 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a   continue..**.**
1e0f0 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   If the writeOnl
1e100 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 61  y flag is true a
1e110 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  nd an error is e
1e120 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65  ncountered while
1e130 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20   .** saving the 
1e140 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
1e150 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   of a read-only 
1e160 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73  cursor, all curs
1e170 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69  ors, .** includi
1e180 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73  ng all read-curs
1e190 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64 2e  ors are tripped.
1e1a0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1e1b0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1e1c0 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69  successful, or i
1e1d0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1e1e0 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e  s while.** savin
1e1f0 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74  g a cursor posit
1e200 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ion, an SQLite e
1e210 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e  rror code..*/.in
1e220 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  t sqlite3BtreeTr
1e230 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72  ipAllCursors(Btr
1e240 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20  ee *pBtree, int 
1e250 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69  errCode, int wri
1e260 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  teOnly){.  BtCur
1e270 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63  sor *p;.  int rc
1e280 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1e290 20 61 73 73 65 72 74 28 20 28 77 72 69 74 65 4f   assert( (writeO
1e2a0 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f  nly==0 || writeO
1e2b0 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f  nly==1) && BTCF_
1e2c0 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a  WriteFlag==1 );.
1e2d0 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
1e2e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1e2f0 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
1e300 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d     for(p=pBtree-
1e310 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
1e320 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
1e330 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1e340 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20    if( writeOnly 
1e350 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  && (p->curFlags 
1e360 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
1e370 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1e380 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
1e390 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
1e3a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61           rc = sa
1e3b0 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
1e3c0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  (p);.          i
1e3d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e3e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e3f0 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72  (void)sqlite3Btr
1e400 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1e410 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b  (pBtree, rc, 0);
1e420 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1e430 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
1e440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e450 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1e460 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1e470 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20  Cursor(p);.     
1e480 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
1e490 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20  URSOR_FAULT;.   
1e4a0 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74       p->skipNext
1e4b0 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
1e4c0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
1e4d0 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20  0; i<=p->iPage; 
1e4e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 65  i++){.        re
1e4f0 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50  leasePage(p->apP
1e500 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  age[i]);.       
1e510 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20   p->apPage[i] = 
1e520 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1e530 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1e540 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1e550 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1e560 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
1e570 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
1e580 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  on in progress..
1e590 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64  **.** If tripCod
1e5a0 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  e is not SQLITE_
1e5b0 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20  OK then cursors 
1e5c0 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61  will be invalida
1e5d0 74 65 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a  ted (tripped)..*
1e5e0 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72  * Only write cur
1e5f0 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64  sors are tripped
1e600 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
1e610 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75   true but all cu
1e620 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69  rsors are.** tri
1e630 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
1e640 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79  y is false.  Any
1e650 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a   attempt to use.
1e660 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63 75 72  ** a tripped cur
1e670 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  sor will result 
1e680 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
1e690 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
1e6a0 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1e6b0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1e6c0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
1e6d0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1e6e0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
1e6f0 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
1e700 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
1e710 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1e720 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
1e730 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  *p, int tripCode
1e740 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29  , int writeOnly)
1e750 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
1e760 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1e770 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
1e780 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65  *pPage1;..  asse
1e790 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31  rt( writeOnly==1
1e7a0 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30   || writeOnly==0
1e7b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72   );.  assert( tr
1e7c0 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41  ipCode==SQLITE_A
1e7d0 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c  BORT_ROLLBACK ||
1e7e0 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
1e7f0 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65  E_OK );.  sqlite
1e800 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1e810 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d    if( tripCode==
1e820 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e830 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d   rc = tripCode =
1e840 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
1e850 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
1e860 69 66 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e  if( rc ) writeOn
1e870 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ly = 0;.  }else{
1e880 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1e890 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  _OK;.  }.  if( t
1e8a0 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69  ripCode ){.    i
1e8b0 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  nt rc2 = sqlite3
1e8c0 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
1e8d0 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c  ors(p, tripCode,
1e8e0 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20   writeOnly);.   
1e8f0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1e900 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65  ITE_OK || (write
1e910 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d  Only==0 && rc2==
1e920 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20  SQLITE_OK) );.  
1e930 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
1e940 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
1e950 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65  .  }.  btreeInte
1e960 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28  grity(p);..  if(
1e970 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1e980 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1e990 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73  int rc2;..    as
1e9a0 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
1e9b0 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
1e9c0 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
1e9d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
1e9e0 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
1e9f0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
1ea00 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
1ea10 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
1ea20 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
1ea30 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
1ea40 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
1ea50 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
1ea60 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
1ea70 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50  * call btreeGetP
1ea80 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
1ea90 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
1eaa0 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
1eab0 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
1eac0 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
1ead0 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67   if( btreeGetPag
1eae0 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
1eaf0 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, 0)==SQLITE_OK
1eb00 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
1eb10 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
1eb20 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
1eb30 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73  Data);.      tes
1eb40 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20  tcase( nPage==0 
1eb50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  );.      if( nPa
1eb60 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50  ge==0 ) sqlite3P
1eb70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1eb80 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
1eb90 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1eba0 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  se( pBt->nPage!=
1ebb0 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70  nPage );.      p
1ebc0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
1ebd0 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  e;.      release
1ebe0 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
1ebf0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1ec00 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
1ec10 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a  s(pBt, 1)==0 );.
1ec20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1ec30 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
1ec40 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
1ec50 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
1ec60 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1ec70 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1ec80 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1ec90 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1eca0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ecb0 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
1ecc0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
1ecd0 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
1ece0 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c  ction can be rol
1ecf0 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65  led.** back inde
1ed00 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
1ed10 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
1ed20 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  n. You must star
1ed30 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
1ed40 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74  .** before start
1ed50 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
1ed60 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
1ed70 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
1ed80 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
1ed90 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20  .** if the main 
1eda0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
1edb0 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
1edc0 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  k..**.** Stateme
1edd0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
1ede0 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
1edf0 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
1ee00 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
1ee10 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
1ee20 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
1ee30 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
1ee40 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
1ee50 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
1ee60 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
1ee70 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
1ee80 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
1ee90 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
1eea0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1eeb0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1eec0 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
1eed0 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
1eee0 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65  n..**.** A state
1eef0 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63  ment sub-transac
1ef00 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
1ef10 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d  ted as an anonym
1ef20 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54  ous savepoint. T
1ef30 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73  he.** value pass
1ef40 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1ef50 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
1ef60 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1ef70 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a  f savepoints,.**
1ef80 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
1ef90 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  ew anonymous sav
1efa0 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20  epoint, open on 
1efb0 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e  the B-Tree. i.e.
1efc0 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
1efd0 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70   no active savep
1efe0 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  oints and no oth
1eff0 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  er statement-tra
1f000 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a  nsactions open,.
1f010 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73  ** iStatement is
1f020 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f   1. This anonymo
1f030 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  us savepoint can
1f040 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20   be released or 
1f050 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75  rolled back.** u
1f060 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
1f070 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29  BtreeSavepoint()
1f080 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
1f090 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
1f0a0 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
1f0b0 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74  , int iStatement
1f0c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1f0d0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1f0e0 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
1f0f0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1f100 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
1f110 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1f120 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
1f130 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1f140 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30  TS_READ_ONLY)==0
1f150 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1f160 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
1f170 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
1f180 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  nt>p->db->nSavep
1f190 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  oint );.  assert
1f1a0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1f1b0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1f1c0 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65  E );.  /* At the
1f1d0 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20   pager level, a 
1f1e0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1f1f0 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70  ction is a savep
1f200 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61  oint with.  ** a
1f210 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
1f220 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69  than all savepoi
1f230 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c  nts created expl
1f240 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a  icitly using.  *
1f250 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
1f260 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  . It is illegal 
1f270 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65  to open, release
1f280 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79   or rollback any
1f290 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70  .  ** such savep
1f2a0 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20  oints while the 
1f2b0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1f2c0 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
1f2d0 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a  is active..  */.
1f2e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f2f0 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
1f300 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53  (pBt->pPager, iS
1f310 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c  tatement);.  sql
1f320 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1f330 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1f340 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  }../*.** The sec
1f350 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
1f360 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  this function, o
1f370 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56  p, is always SAV
1f380 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a  EPOINT_ROLLBACK.
1f390 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  ** or SAVEPOINT_
1f3a0 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75  RELEASE. This fu
1f3b0 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65  nction either re
1f3c0 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20  leases or rolls 
1f3d0 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65  back the.** save
1f3e0 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64  point identified
1f3f0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53   by parameter iS
1f400 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64  avepoint, depend
1f410 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  ing on the value
1f420 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a   .** of op..**.*
1f430 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76  * Normally, iSav
1f440 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
1f450 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
1f460 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72  to zero. However
1f470 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41  , if op is.** SA
1f480 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1f490 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e  , then iSavepoin
1f4a0 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31  t may also be -1
1f4b0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
1f4c0 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
1f4d0 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  of the entire tr
1f4e0 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f  ansaction are ro
1f4f0 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
1f500 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  is different.** 
1f510 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72  from a normal tr
1f520 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
1f530 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20  ck, as no locks 
1f540 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64  are released and
1f550 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
1f560 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e  ion remains open
1f570 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f580 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42  BtreeSavepoint(B
1f590 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  tree *p, int op,
1f5a0 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
1f5b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1f5c0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
1f5d0 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
1f5e0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1f5f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1f600 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
1f610 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
1f620 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
1f630 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
1f640 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  LBACK );.    ass
1f650 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
1f660 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e  =0 || (iSavepoin
1f670 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56  t==-1 && op==SAV
1f680 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
1f690 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
1f6a0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1f6b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f6c0 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
1f6d0 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
1f6e0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  avepoint);.    i
1f6f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f700 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53   ){.      if( iS
1f710 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70  avepoint<0 && (p
1f720 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1f730 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1f740 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  TY)!=0 ){.      
1f750 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30    pBt->nPage = 0
1f760 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f770 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1f780 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74  (pBt);.      pBt
1f790 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  ->nPage = get4by
1f7a0 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61  te(28 + pBt->pPa
1f7b0 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ge1->aData);..  
1f7c0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1f7d0 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69  ase size was wri
1f7e0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66  tten into the of
1f7f0 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68  fset 28 of the h
1f800 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  eader.      ** w
1f810 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
1f820 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20  ion started, so 
1f830 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
1f840 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74   value at offset
1f850 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20  .      ** 28 is 
1f860 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20  nonzero. */.    
1f870 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
1f880 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Page>0 );.    }.
1f890 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1f8a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
1f8b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f8c0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1f8d0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1f8e0 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
1f8f0 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
1f900 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
1f910 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
1f920 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
1f930 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1f940 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
1f950 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
1f960 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
1f970 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1f980 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
1f990 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
1f9a0 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
1f9b0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
1f9c0 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
1f9d0 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
1f9e0 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
1f9f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1fa00 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
1fa10 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
1fa20 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
1fa30 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
1fa40 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
1fa50 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1fa60 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
1fa70 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
1fa80 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
1fa90 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
1faa0 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
1fab0 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
1fac0 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
1fad0 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
1fae0 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
1faf0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
1fb00 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
1fb10 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
1fb20 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
1fb30 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
1fb40 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
1fb50 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
1fb60 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
1fb70 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
1fb80 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
1fb90 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
1fba0 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
1fbb0 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
1fbc0 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
1fbd0 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
1fbe0 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
1fbf0 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
1fc00 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
1fc10 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
1fc20 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
1fc30 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
1fc40 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
1fc50 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
1fc60 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
1fc70 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
1fc80 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
1fc90 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
1fca0 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
1fcb0 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
1fcc0 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
1fcd0 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
1fce0 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
1fcf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1fd00 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
1fd10 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
1fd20 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
1fd30 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
1fd40 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
1fd50 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
1fd60 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
1fd70 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
1fd80 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
1fd90 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
1fda0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
1fdb0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
1fdc0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1fdd0 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e  rZero() has been
1fde0 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43   called.** on pC
1fdf0 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ur to initialize
1fe00 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63   the memory spac
1fe10 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  e prior to invok
1fe20 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1fe30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fe40 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
1fe50 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
1fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
1fe80 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
1fe90 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1feb0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
1fec0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
1fed0 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
1fee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fef0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1ff00 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1ff10 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1ff20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1ff30 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1ff40 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1ff50 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1ff60 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
1ff70 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff90 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
1ffa0 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
1ffb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1ffc0 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
1ffd0 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1ffe0 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   b-tree handle *
1fff0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
20000 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
20010 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
20020 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
20030 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20   wrFlag==1 );.. 
20040 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
20050 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
20060 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
20070 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
20080 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
20090 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
200a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
200b0 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
200c0 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
200d0 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
200e0 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
200f0 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
20100 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
20110 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
20120 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
20130 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
20140 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
20150 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
20160 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61  eyInfo!=0, wrFla
20170 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  g+1) );.  assert
20180 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
20190 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
201a0 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
201b0 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
201c0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
201d0 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
201e0 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
201f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
20200 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
20210 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
20220 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
20230 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
20240 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
20250 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
20260 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
20270 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e  Data );..  if( N
20280 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20 28  EVER(wrFlag && (
20290 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
202a0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
202b0 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
202c0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
202d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 72 46 6c  ;.  }.  if( wrFl
202e0 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61  ag ){.    alloca
202f0 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
20300 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
20310 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  TmpSpace==0 ) re
20320 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
20330 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  M;.  }.  if( iTa
20340 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
20350 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
20360 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
20370 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  wrFlag==0 );.   
20380 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d   iTable = 0;.  }
20390 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
203a0 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
203b0 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
203c0 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
203d0 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
203e0 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
203f0 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
20400 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
20410 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
20420 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
20430 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
20440 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
20450 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
20460 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
20470 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
20480 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
20490 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
204a0 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d  ag==0 || wrFlag=
204b0 3d 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20  =BTCF_WriteFlag 
204c0 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  );.  pCur->curFl
204d0 61 67 73 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20  ags = wrFlag;.  
204e0 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
204f0 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  t->pCursor;.  if
20500 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
20510 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  .    pCur->pNext
20520 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a  ->pPrev = pCur;.
20530 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73    }.  pBt->pCurs
20540 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
20550 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
20560 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65  OR_INVALID;.  re
20570 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20580 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
20590 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
205a0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
205b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
205d0 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
205e0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20600 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
20610 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
20620 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
20630 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
20640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20650 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
20660 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
20670 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
20680 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
20690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206a0 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
206b0 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
206c0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
206d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
206f0 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72  Write new cursor
20700 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
20710 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
20720 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
20730 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
20740 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c  (p, iTable, wrFl
20750 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
20760 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ur);.  sqlite3Bt
20770 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
20780 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20790 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
207a0 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
207b0 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
207c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
207d0 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
207e0 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
207f0 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
20800 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
20810 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
20820 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
20830 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
20840 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
20850 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
20860 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
20870 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
20880 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
20890 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
208a0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
208b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
208c0 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
208d0 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73   return ROUND8(s
208e0 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
208f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
20900 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61  alize memory tha
20910 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  t will be conver
20920 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72  ted into a BtCur
20930 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  sor object..**.*
20940 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70  * The simple app
20950 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64  roach here would
20960 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20   be to memset() 
20970 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63  the entire objec
20980 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42  t.** to zero.  B
20990 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20  ut it turns out 
209a0 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b  that the apPage[
209b0 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72  ] and aiIdx[] ar
209c0 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e  rays.** do not n
209d0 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64  eed to be zeroed
209e0 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61   and they are la
209f0 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  rge, so we can s
20a00 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20  ave a lot.** of 
20a10 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70  run-time by skip
20a20 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
20a30 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65  ization of those
20a40 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f   elements..*/.vo
20a50 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
20a60 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73  ursorZero(BtCurs
20a70 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  or *p){.  memset
20a80 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28  (p, 0, offsetof(
20a90 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29  BtCursor, iPage)
20aa0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
20ab0 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
20ac0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
20ad0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20ae0 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
20af0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
20b00 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
20b10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
20b20 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
20b30 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
20b40 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
20b50 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
20b60 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
20b70 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
20b80 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
20b90 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
20ba0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
20bb0 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69  Btree);.    sqli
20bc0 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
20bd0 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69  sor(pCur);.    i
20be0 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29  f( pCur->pPrev )
20bf0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50  {.      pCur->pP
20c00 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
20c10 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
20c20 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  lse{.      pBt->
20c30 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
20c40 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
20c50 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
20c60 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
20c70 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
20c80 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  Cur->pPrev;.    
20c90 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
20ca0 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
20cb0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
20cc0 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
20cd0 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  age[i]);.    }. 
20ce0 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
20cf0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
20d00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
20d10 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a  ur->aOverflow);.
20d20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66      /* sqlite3_f
20d30 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20  ree(pCur); */.  
20d40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
20d50 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
20d60 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20d70 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
20d80 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75  ke sure the BtCu
20d90 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74  rsor* given in t
20da0 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  he argument has 
20db0 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72  a valid.** BtCur
20dc0 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75  sor.info structu
20dd0 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  re.  If it is no
20de0 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c  t already valid,
20df0 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61   call.** btreePa
20e00 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c  rseCell() to fil
20e10 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42  l it in..**.** B
20e20 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20  tCursor.info is 
20e30 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69  a cache of the i
20e40 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
20e50 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a  e current cell..
20e60 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61  ** Using this ca
20e70 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20  che reduces the 
20e80 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
20e90 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  to btreeParseCel
20ea0 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d  l()..**.** 2007-
20eb0 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73  06-25:  There is
20ec0 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76   a bug in some v
20ed0 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20  ersions of MSVC 
20ee0 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a  that cause the.*
20ef0 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72  * compiler to cr
20f00 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c  ash when getCell
20f10 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d  Info() is implem
20f20 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f  ented as a macro
20f30 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69  ..** But there i
20f40 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20  s a measureable 
20f50 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20  speed advantage 
20f60 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63  to using the mac
20f70 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68  ro on gcc.** (wh
20f80 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72  en less compiler
20f90 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c   optimizations l
20fa0 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61  ike -Os or -O0 a
20fb0 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a  re used and the.
20fc0 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e  ** compiler is n
20fd0 6f 74 20 64 6f 69 6e 67 20 61 67 67 72 65 73 73  ot doing aggress
20fe0 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20  ive inlining.)  
20ff0 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c  So we use a real
21000 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
21010 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72   MSVC and a macr
21020 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67  o for everything
21030 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23   else.  Ticket #
21040 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  2457..*/.#ifndef
21050 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63   NDEBUG.  static
21060 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
21070 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
21080 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
21090 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  fo info;.    int
210a0 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
210b0 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Page;.    memset
210c0 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
210d0 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74  f(info));.    bt
210e0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
210f0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
21100 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  , pCur->aiIdx[iP
21110 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  age], &info);.  
21120 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
21130 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26  T_DB || memcmp(&
21140 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66  info, &pCur->inf
21150 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  o, sizeof(info))
21160 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  ==0 );.  }.#else
21170 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72  .  #define asser
21180 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e  tCellInfo(x).#en
21190 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f  dif.#ifdef _MSC_
211a0 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61 20 72  VER.  /* Use a r
211b0 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20  eal function in 
211c0 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f  MSVC to work aro
211d0 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68 61 74  und bugs in that
211e0 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20   compiler. */.  
211f0 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 43  static void getC
21200 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
21210 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69 66 28   *pCur){.    if(
21220 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
21230 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  e==0 ){.      in
21240 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
21250 69 50 61 67 65 3b 0a 20 20 20 20 20 20 62 74 72  iPage;.      btr
21260 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
21270 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
21280 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
21290 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  e],&pCur->info);
212a0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72  .      pCur->cur
212b0 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61  Flags |= BTCF_Va
212c0 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 7d 65 6c  lidNKey;.    }el
212d0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
212e0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
212f0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20      }.  }.#else 
21300 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56  /* if not _MSC_V
21310 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61  ER */.  /* Use a
21320 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74   macro in all ot
21330 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f  her compilers so
21340 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69   that the functi
21350 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f  on is inlined */
21360 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c  .#define getCell
21370 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20 20  Info(pCur)      
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213b0 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  \.  if( pCur->in
213c0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20  fo.nSize==0 ){  
213d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21400 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65   \.    int iPage
21410 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20   = pCur->iPage; 
21420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21450 20 20 5c 0a 20 20 20 20 62 74 72 65 65 50 61 72    \.    btreePar
21460 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
21470 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d  age[iPage],pCur-
21480 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70  >aiIdx[iPage],&p
21490 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20  Cur->info);     
214a0 20 20 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 63     \.    pCur->c
214b0 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
214c0 56 61 6c 69 64 4e 4b 65 79 3b 20 20 20 20 20 20  ValidNKey;      
214d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214f0 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20      \.  }else{  
21500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21540 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72       \.    asser
21550 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
21560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21590 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64        \.  }.#end
215a0 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a  if /* _MSC_VER *
215b0 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  /..#ifndef NDEBU
215c0 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72  G  /* The next r
215d0 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79  outine used only
215e0 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
215f0 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f   statements */./
21600 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
21610 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74   if the given Bt
21620 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  Cursor is valid.
21630 20 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72    A valid cursor
21640 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20   is one.** that 
21650 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
21660 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69  nting to a row i
21670 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20  n a (non-empty) 
21680 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69  table..** This i
21690 73 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e  s a verification
216a0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
216b0 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
216c0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
216d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
216e0 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
216f0 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  id(BtCursor *pCu
21700 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r){.  return pCu
21710 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  r && pCur->eStat
21720 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b  e==CURSOR_VALID;
21730 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45  .}.#endif /* NDE
21740 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  BUG */../*.** Se
21750 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
21760 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
21770 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  er needed to hol
21780 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  d the value of.*
21790 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68  * the key for th
217a0 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e  e current entry.
217b0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
217c0 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a  is not pointing.
217d0 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e  ** to a valid en
217e0 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73  try, *pSize is s
217f0 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20  et to 0. .**.** 
21800 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68  For a table with
21810 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67   the INTKEY flag
21820 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69   set, this routi
21830 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b  ne returns the k
21840 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f  ey.** itself, no
21850 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
21860 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79  bytes in the key
21870 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
21880 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e  er must position
21890 20 74 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f   the cursor prio
218a0 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
218b0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a  is routine..** .
218c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
218d0 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74  cannot fail.  It
218e0 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
218f0 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a  SQLITE_OK.  .*/.
21900 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
21910 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72  KeySize(BtCursor
21920 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69   *pCur, i64 *pSi
21930 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ze){.  assert( c
21940 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
21950 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
21960 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
21970 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
21980 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
21990 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d  Cur);.  *pSize =
219a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
219b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
219c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
219d0 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65  et *pSize to the
219e0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
219f0 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20   of data in the 
21a00 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72  entry the.** cur
21a10 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  sor currently po
21a20 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54  ints to..**.** T
21a30 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67  he caller must g
21a40 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
21a50 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  e cursor is poin
21a60 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55  ting to a non-NU
21a70 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72  LL.** valid entr
21a80 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  y.  In other wor
21a90 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  ds, the calling 
21aa0 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67  procedure must g
21ab0 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74  uarantee.** that
21ac0 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
21ad0 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43  Cursor.eState==C
21ae0 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a  URSOR_VALID..**.
21af0 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f  ** Failure is no
21b00 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 54 68 69  t possible.  Thi
21b10 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79  s function alway
21b20 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  s returns SQLITE
21b30 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74  _OK..** It might
21b40 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20 62 65   just as well be
21b50 20 61 20 70 72 6f 63 65 64 75 72 65 20 28 72 65   a procedure (re
21b60 74 75 72 6e 69 6e 67 20 76 6f 69 64 29 20 62 75  turning void) bu
21b70 74 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a  t we continue.**
21b80 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 69 6e   to return an in
21b90 74 65 67 65 72 20 72 65 73 75 6c 74 20 63 6f 64  teger result cod
21ba0 65 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c  e for historical
21bb0 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74   reasons..*/.int
21bc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
21bd0 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  aSize(BtCursor *
21be0 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65  pCur, u32 *pSize
21bf0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
21c00 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
21c10 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
21c20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
21c30 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
21c40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
21c50 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21c60 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d  e]->intKeyLeaf==
21c70 31 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  1 );.  getCellIn
21c80 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69  fo(pCur);.  *pSi
21c90 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
21ca0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75  nPayload;.  retu
21cb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
21cc0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
21cd0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
21ce0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
21cf0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
21d00 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f   (parameter.** o
21d10 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74  vfl), this funct
21d20 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61  ion finds the pa
21d30 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
21d40 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
21d50 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
21d60 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  t of overflow pa
21d70 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ges. If possible
21d80 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75  , it uses the au
21d90 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69  to-vacuum.** poi
21da0 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e  nter-map data in
21db0 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67  stead of reading
21dc0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
21dd0 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20  page ovfl to do 
21de0 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  so. .**.** If an
21df0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
21e00 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
21e10 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
21e20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a  Otherwise:.**.**
21e30 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
21e40 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65   of the next ove
21e50 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
21e60 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73  e linked list is
21e70 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20   .** written to 
21e80 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70  *pPgnoNext. If p
21e90 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20  age ovfl is the 
21ea0 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73  last page in its
21eb0 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74   linked .** list
21ec0 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  , *pPgnoNext is 
21ed0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a  set to zero. .**
21ee0 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73  .** If ppPage is
21ef0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61   not NULL, and a
21f00 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
21f10 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
21f20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
21f30 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  * to page number
21f40 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69   pOvfl was obtai
21f50 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  ned, then *ppPag
21f60 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  e is set to poin
21f70 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66  t to that.** ref
21f80 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68  erence. It is th
21f90 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
21fa0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
21fb0 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
21fc0 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61  ge().** on *ppPa
21fd0 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72  ge to free the r
21fe0 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20  eference. In no 
21ff0 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62  reference was ob
22000 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a  tained (because.
22010 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
22020 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f  ap was used to o
22030 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20  btain the value 
22040 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c  for *pPgnoNext),
22050 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65   then.** *ppPage
22060 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
22070 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
22080 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
22090 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
220a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
220b0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
220c0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76  ile */.  Pgno ov
220d0 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fl,             
220e0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
220f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
22100 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61  umber */.  MemPa
22110 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
22120 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
22130 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28  MemPage handle (
22140 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a  may be NULL) */.
22150 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78    Pgno *pPgnoNex
22160 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
22170 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72  * OUT: Next over
22180 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
22190 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65   */.){.  Pgno ne
221a0 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  xt = 0;.  MemPag
221b0 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
221c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
221d0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  OK;..  assert( s
221e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
221f0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
22200 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e  .  assert(pPgnoN
22210 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ext);..#ifndef S
22220 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
22230 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74  ACUUM.  /* Try t
22240 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20  o find the next 
22250 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
22260 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20  flow list using 
22270 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63  the.  ** autovac
22280 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  uum pointer-map 
22290 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61  pages. Guess tha
222a0 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  t the next page 
222b0 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65  in .  ** the ove
222c0 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61  rflow list is pa
222d0 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b  ge number (ovfl+
222e0 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73  1). If that gues
222f0 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75  s turns .  ** ou
22300 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66  t to be wrong, f
22310 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64  all back to load
22320 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20  ing the data of 
22330 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  page .  ** numbe
22340 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d  r ovfl to determ
22350 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ine the next pag
22360 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20  e number..  */. 
22370 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
22380 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
22390 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20   pgno;.    Pgno 
223a0 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b  iGuess = ovfl+1;
223b0 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a  .    u8 eType;..
223c0 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
223d0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47  P_ISPAGE(pBt, iG
223e0 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d  uess) || iGuess=
223f0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
22400 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
22410 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d   iGuess++;.    }
22420 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73  ..    if( iGuess
22430 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  <=btreePagecount
22440 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
22450 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
22460 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70  t, iGuess, &eTyp
22470 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20  e, &pgno);.     
22480 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22490 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52  OK && eType==PTR
224a0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
224b0 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
224c0 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
224d0 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63  uess;.        rc
224e0 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
224f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22500 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
22510 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72  rt( next==0 || r
22520 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
22530 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
22540 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
22550 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
22560 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65  Bt, ovfl, &pPage
22570 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20 3f 20  , (ppPage==0) ? 
22580 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
22590 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73  LY : 0);.    ass
225a0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
225b0 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29  OK || pPage==0 )
225c0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
225d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
225e0 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65   next = get4byte
225f0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
22600 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
22610 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
22620 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
22630 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
22640 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
22650 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
22660 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
22670 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  rn (rc==SQLITE_D
22680 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ONE ? SQLITE_OK 
22690 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
226a0 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61  Copy data from a
226b0 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67   buffer to a pag
226c0 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67  e, or from a pag
226d0 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  e to a buffer..*
226e0 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73  *.** pPayload is
226f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
22700 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74  ta stored on dat
22710 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
22720 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ge..** If argume
22730 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c  nt eOp is false,
22740 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65   then nByte byte
22750 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  s of data are co
22760 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61  pied.** from pPa
22770 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66  yload to the buf
22780 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62  fer pointed at b
22790 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69  y pBuf. If eOp i
227a0 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
227b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
227c0 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
227d0 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79   pDbPage and nBy
227e0 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  te bytes.** of d
227f0 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66  ata are copied f
22800 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
22810 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e  Buf to pPayload.
22820 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
22830 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
22840 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69  success, otherwi
22850 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  se an error code
22860 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22870 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76  copyPayload(.  v
22880 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20  oid *pPayload,  
22890 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
228a0 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61  ter to page data
228b0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
228c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
228d0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
228e0 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
228f0 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
22900 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22910 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
22920 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20  /.  int eOp,    
22930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22940 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20   0 -> copy from 
22950 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20  page, 1 -> copy 
22960 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50  to page */.  DbP
22970 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20  age *pDbPage    
22980 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
22990 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f  ontaining pPaylo
229a0 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65  ad */.){.  if( e
229b0 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  Op ){.    /* Cop
229c0 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66  y data from buff
229d0 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72  er to page (a wr
229e0 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ite operation) *
229f0 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
22a00 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
22a10 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
22a20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22a30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
22a40 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d   rc;.    }.    m
22a50 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
22a60 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
22a70 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
22a80 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  py data from pag
22a90 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72  e to buffer (a r
22aa0 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ead operation) *
22ab0 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  /.    memcpy(pBu
22ac0 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79  f, pPayload, nBy
22ad0 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  te);.  }.  retur
22ae0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
22af0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
22b00 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
22b10 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
22b20 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
22b30 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
22b40 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
22b50 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
22b60 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65 20 65  inting to. The e
22b70 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  Op.** argument i
22b80 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
22b90 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
22ba0 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61 74 69    0: The operati
22bb0 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 50 6f  on is a read. Po
22bc0 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
22bd0 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20  low cache..**   
22be0 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  1: The operation
22bf0 20 69 73 20 61 20 77 72 69 74 65 2e 20 50 6f 70   is a write. Pop
22c00 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
22c10 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 32  ow cache..**   2
22c20 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
22c30 69 73 20 61 20 72 65 61 64 2e 20 44 6f 20 6e 6f  is a read. Do no
22c40 74 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  t populate the o
22c50 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
22c60 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
22c70 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20  "amt" bytes are 
22c80 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
22c90 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66  beginning at "of
22ca0 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69  fset"..** Data i
22cb0 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f  s read to or fro
22cc0 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
22cd0 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  f..**.** The con
22ce0 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20  tent being read 
22cf0 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74  or written might
22d00 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
22d10 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62  ain page.** or b
22d20 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20  e scattered out 
22d30 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  on multiple over
22d40 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  flow pages..**.*
22d50 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
22d60 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73   cursor entry us
22d70 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  es one or more o
22d80 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 6e  verflow pages an
22d90 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20 61 72 67  d the.** eOp arg
22da0 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 32 2c 20  ument is not 2, 
22db0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  this function ma
22dc0 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  y allocate space
22dd0 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20   for and lazily 
22de0 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 73 20 74 68  .** populates th
22df0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
22e00 6c 69 73 74 20 63 61 63 68 65 20 61 72 72 61 79  list cache array
22e10 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72   (BtCursor.aOver
22e20 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65  flow). .** Subse
22e30 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
22e40 74 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61  this cache to ma
22e50 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
22e60 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
22e70 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63  t .** more effic
22e80 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
22e90 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
22ea0 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
22eb0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
22ec0 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e   it may be.** in
22ed0 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d  validated if som
22ee0 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77  e other cursor w
22ef0 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d  rites to the sam
22f00 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a  e table, or if.*
22f10 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
22f20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65  moved to a diffe
22f30 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69  rent row. Additi
22f40 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d  onally, in auto-
22f50 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20  vacuum.** mode, 
22f60 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76  the following ev
22f70 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64  ents may invalid
22f80 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ate an overflow 
22f90 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
22fa0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e  .**.**   * An in
22fb0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
22fc0 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69  ,.**   * A commi
22fd0 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d  t in auto_vacuum
22fe0 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a  ="full" mode,.**
22ff0 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20     * Creating a 
23000 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69  table (may requi
23010 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65  re moving an ove
23020 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a  rflow page)..*/.
23030 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73  static int acces
23040 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  sPayload(.  BtCu
23050 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
23060 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
23070 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
23080 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
23090 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20  32 offset,      
230a0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
230b0 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e  ding this far in
230c0 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  to payload */.  
230d0 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20  u32 amt,        
230e0 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69       /* Read thi
230f0 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a  s many bytes */.
23100 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
23110 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20  *pBuf, /* Write 
23120 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74  the bytes into t
23130 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20  his buffer */ . 
23140 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
23150 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
23160 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
23170 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
23180 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
23190 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
231a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
231b0 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
231c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
231d0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
231e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f  [pCur->iPage]; /
231f0 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20  * Btree page of 
23200 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f  current entry */
23210 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
23220 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20   = pCur->pBt;   
23230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23240 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72  * Btree this cur
23250 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  sor belongs to *
23260 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
23270 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
23280 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65 64 20  READ.  unsigned 
23290 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70 42 75  char * const pBu
232a0 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20  fStart = pBuf;. 
232b0 20 69 6e 74 20 62 45 6e 64 3b 20 20 20 20 20 20   int bEnd;      
232c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
232e0 75 65 20 69 66 20 72 65 61 64 69 6e 67 20 74 6f  ue if reading to
232f0 20 65 6e 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a   end of data */.
23300 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
23310 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ( pPage );.  ass
23320 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
23330 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
23340 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23350 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
23360 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
23370 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
23380 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
23390 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
233a0 72 74 28 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66  rt( eOp!=2 || of
233b0 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a  fset==0 );    /*
233c0 20 41 6c 77 61 79 73 20 73 74 61 72 74 20 66 72   Always start fr
233d0 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72  om beginning for
233e0 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65   eOp==2 */..  ge
233f0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
23400 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
23410 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
23420 64 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  d;.#ifdef SQLITE
23430 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
23440 5f 52 45 41 44 0a 20 20 62 45 6e 64 20 3d 20 6f  _READ.  bEnd = o
23450 66 66 73 65 74 2b 61 6d 74 3d 3d 70 43 75 72 2d  ffset+amt==pCur-
23460 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a  >info.nPayload;.
23470 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
23480 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
23490 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
234a0 61 64 20 29 3b 0a 0a 20 20 69 66 28 20 26 61 50  ad );..  if( &aP
234b0 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
234c0 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61  o.nLocal] > &pPa
234d0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75  ge->aData[pBt->u
234e0 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20  sableSize] ){.  
234f0 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72    /* Trying to r
23500 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73  ead or write pas
23510 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
23520 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f   data is an erro
23530 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  r */.    return 
23540 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
23550 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  KPT;.  }..  /* C
23560 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73  heck if data mus
23570 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65  t be read/writte
23580 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74  n to/from the bt
23590 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e  ree page itself.
235a0 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
235b0 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  <pCur->info.nLoc
235c0 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  al ){.    int a 
235d0 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61  = amt;.    if( a
235e0 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e  +offset>pCur->in
235f0 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
23600 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66     a = pCur->inf
23610 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65  o.nLocal - offse
23620 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
23630 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
23640 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c  Payload[offset],
23650 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 20 26   pBuf, a, (eOp &
23660 20 30 78 30 31 29 2c 20 70 50 61 67 65 2d 3e 70   0x01), pPage->p
23670 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66  DbPage);.    off
23680 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75  set = 0;.    pBu
23690 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20  f += a;.    amt 
236a0 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -= a;.  }else{. 
236b0 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75     offset -= pCu
236c0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
236d0 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d    }...  if( rc==
236e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
236f0 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  >0 ){.    const 
23700 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70  u32 ovflSize = p
23710 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
23720 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f   4;  /* Bytes co
23730 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70  ntent per ovfl p
23740 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  age */.    Pgno 
23750 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e  nextPage;..    n
23760 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
23770 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  te(&aPayload[pCu
23780 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29  r->info.nLocal])
23790 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
237a0 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
237b0 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65  low[] has not be
237c0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c  en allocated, al
237d0 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20  locate it now.. 
237e0 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f     ** Except, do
237f0 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f   not allocate aO
23800 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f  verflow[] for eO
23810 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  p==2..    **.   
23820 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f   ** The aOverflo
23830 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a  w[] array is siz
23840 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20  ed at one entry 
23850 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f  for each overflo
23860 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  w page.    ** in
23870 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
23880 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75  ain. The page nu
23890 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
238a0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
238b0 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64  is.    ** stored
238c0 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d   in aOverflow[0]
238d0 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f  , etc. A value o
238e0 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72  f 0 in the aOver
238f0 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20  flow[] array.   
23900 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79   ** means "not y
23910 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63  et known" (the c
23920 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70  ache is lazily p
23930 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a  opulated)..    *
23940 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 21 3d 32  /.    if( eOp!=2
23950 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
23960 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
23970 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Ovfl)==0 ){.    
23980 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
23990 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
239a0 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
239b0 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
239c0 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
239d0 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d   if( nOvfl>pCur-
239e0 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20  >nOvflAlloc ){. 
239f0 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65         Pgno *aNe
23a00 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74  w = (Pgno*)sqlit
23a10 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e3Realloc(.     
23a20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
23a30 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a  erflow, nOvfl*2*
23a40 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20  sizeof(Pgno).   
23a50 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
23a60 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
23a70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
23a80 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
23a90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23aa0 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c       pCur->nOvfl
23ab0 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b  Alloc = nOvfl*2;
23ac0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
23ad0 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65  >aOverflow = aNe
23ae0 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
23af0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
23b00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23b10 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
23b20 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20  Cur->aOverflow, 
23b30 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28  0, nOvfl*sizeof(
23b40 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  Pgno));.        
23b50 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
23b60 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  = BTCF_ValidOvfl
23b70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23b80 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
23b90 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
23ba0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
23bb0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
23bc0 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  he.    ** entry 
23bd0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
23be0 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
23bf0 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
23c00 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  kip.    ** direc
23c10 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  tly to it..    *
23c20 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  /.    if( (pCur-
23c30 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
23c40 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20  _ValidOvfl)!=0. 
23c50 20 20 20 20 26 26 20 70 43 75 72 2d 3e 61 4f 76      && pCur->aOv
23c60 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76  erflow[offset/ov
23c70 66 6c 53 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20  flSize].    ){. 
23c80 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66       iIdx = (off
23c90 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set/ovflSize);. 
23ca0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
23cb0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
23cc0 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66  iIdx];.      off
23cd0 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
23ce0 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a  flSize);.    }..
23cf0 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53      for( ; rc==S
23d00 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
23d10 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69  0 && nextPage; i
23d20 49 64 78 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f  Idx++){..      /
23d30 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70  * If required, p
23d40 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
23d50 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
23d60 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ache. */.      i
23d70 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  f( (pCur->curFla
23d80 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
23d90 76 66 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  vfl)!=0 ){.     
23da0 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d     assert(!pCur-
23db0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
23dc0 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
23dd0 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
23de0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43  age);.        pC
23df0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
23e00 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
23e10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
23e20 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53  f( offset>=ovflS
23e30 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
23e40 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f  * The only reaso
23e50 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  n to read this p
23e60 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e  age is to obtain
23e70 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
23e80 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20    ** number for 
23e90 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
23ea0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
23eb0 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20  ain. The page.  
23ec0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73        ** data is
23ed0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53   not required. S
23ee0 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c  o first try to l
23ef0 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c  ookup the overfl
23f00 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ow.        ** pa
23f10 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69  ge-list cache, i
23f20 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c  f any, then fall
23f30 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74   back to the get
23f40 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20  OverflowPage(). 
23f50 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
23f60 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  on..        **. 
23f70 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74         ** Note t
23f80 68 61 74 20 74 68 65 20 61 4f 76 65 72 66 6c 6f  hat the aOverflo
23f90 77 5b 5d 20 61 72 72 61 79 20 6d 75 73 74 20 62  w[] array must b
23fa0 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 63 61  e allocated beca
23fb0 75 73 65 20 65 4f 70 21 3d 32 0a 20 20 20 20 20  use eOp!=2.     
23fc0 20 20 20 2a 2a 20 68 65 72 65 2e 20 20 49 66 20     ** here.  If 
23fd0 65 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66  eOp==2, then off
23fe0 73 65 74 3d 3d 30 20 61 6e 64 20 74 68 69 73 20  set==0 and this 
23ff0 62 72 61 6e 63 68 20 69 73 20 6e 65 76 65 72 20  branch is never 
24000 74 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a  taken..        *
24010 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
24020 28 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20  ( eOp!=2 );.    
24030 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
24040 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
24050 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20  F_ValidOvfl );. 
24060 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
24070 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d  Cur->pBtree->db=
24080 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20  =pBt->db );.    
24090 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
240a0 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20  verflow[iIdx+1] 
240b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  ){.          nex
240c0 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
240d0 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b  verflow[iIdx+1];
240e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
240f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67            rc = g
24100 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
24110 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c  Bt, nextPage, 0,
24120 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20   &nextPage);.   
24130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f       }.        o
24140 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a  ffset -= ovflSiz
24150 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
24160 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20          /* Need 
24170 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
24180 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63  e properly. It c
24190 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20  ontains some of 
241a0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  the.        ** r
241b0 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61  ange of data tha
241c0 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20  t is being read 
241d0 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74  (eOp==0) or writ
241e0 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20  ten (eOp!=0)..  
241f0 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20        */.#ifdef 
24200 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
24210 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20  ERFLOW_READ.    
24220 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
24230 20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20   *fd;.#endif.   
24240 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74       int a = amt
24250 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 20  ;.        if( a 
24260 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53  + offset > ovflS
24270 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
24280 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20   a = ovflSize - 
24290 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  offset;.        
242a0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
242b0 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
242c0 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a  _READ.        /*
242d0 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c   If all the foll
242e0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
242f0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
24300 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20     **   1) this 
24310 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74  is a read operat
24320 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20  ion, and .      
24330 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69    **   2) data i
24340 73 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20  s required from 
24350 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69  the start of thi
24360 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  s overflow page,
24370 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
24380 20 20 33 29 20 74 68 65 20 64 61 74 61 62 61 73    3) the databas
24390 65 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64  e is file-backed
243a0 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
243b0 20 20 20 34 29 20 74 68 65 72 65 20 69 73 20 6e     4) there is n
243c0 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61  o open write-tra
243d0 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20  nsaction, and.  
243e0 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68        **   5) th
243f0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
24400 74 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  t a WAL database
24410 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36  ,.        **   6
24420 29 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20  ) all data from 
24430 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
24440 67 20 72 65 61 64 2e 0a 20 20 20 20 20 20 20 20  g read..        
24450 2a 2a 20 20 20 37 29 20 61 74 20 6c 65 61 73 74  **   7) at least
24460 20 34 20 62 79 74 65 73 20 68 61 76 65 20 61 6c   4 bytes have al
24470 72 65 61 64 79 20 62 65 65 6e 20 72 65 61 64 20  ready been read 
24480 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  into the output 
24490 62 75 66 66 65 72 20 0a 20 20 20 20 20 20 20 20  buffer .        
244a0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  **.        ** th
244b0 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20 72  en data can be r
244c0 65 61 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f  ead directly fro
244d0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
244e0 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ile into the.   
244f0 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62       ** output b
24500 75 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67  uffer, bypassing
24510 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
24520 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73  altogether. This
24530 20 73 70 65 65 64 73 0a 20 20 20 20 20 20 20 20   speeds.        
24540 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61  ** up loading la
24550 72 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74  rge records that
24560 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66   span many overf
24570 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20  low pages..     
24580 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
24590 28 20 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20  ( (eOp&0x01)==0 
245a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245c0 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20       /* (1) */. 
245d0 20 20 20 20 20 20 20 20 26 26 20 6f 66 66 73 65          && offse
245e0 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  t==0            
245f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24610 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (2) */.        
24620 20 26 26 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d   && (bEnd || a==
24630 6f 76 66 6c 53 69 7a 65 29 20 20 20 20 20 20 20  ovflSize)       
24640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24650 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f         /* (6) */
24660 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74  .         && pBt
24670 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
24680 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20  =TRANS_READ     
24690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246a0 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20  /* (4) */.      
246b0 20 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69     && (fd = sqli
246c0 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74  te3PagerFile(pBt
246d0 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74  ->pPager))->pMet
246e0 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20  hods     /* (3) 
246f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  */.         && p
24700 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
24710 61 5b 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20  a[19]==0x01     
24720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24730 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20    /* (5) */.    
24740 20 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34       && &pBuf[-4
24750 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20 20  ]>=pBufStart    
24760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 37             /* (7
24780 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a  ) */.        ){.
24790 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61            u8 aSa
247a0 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  ve[4];.         
247b0 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70   u8 *aWrite = &p
247c0 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20  Buf[-4];.       
247d0 20 20 20 61 73 73 65 72 74 28 20 61 57 72 69 74     assert( aWrit
247e0 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20  e>=pBufStart ); 
247f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24800 20 20 20 20 20 20 20 20 2f 2a 20 68 65 6e 63 65          /* hence
24810 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (7) */.        
24820 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20    memcpy(aSave, 
24830 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20  aWrite, 4);.    
24840 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24850 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72  e3OsRead(fd, aWr
24860 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70  ite, a+4, (i64)p
24870 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65  Bt->pageSize*(ne
24880 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20  xtPage-1));.    
24890 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
248a0 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65   get4byte(aWrite
248b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
248c0 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76  cpy(aWrite, aSav
248d0 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  e, 4);.        }
248e0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20  else.#endif..   
248f0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
24900 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
24910 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
24920 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
24930 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
24940 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62  , nextPage, &pDb
24950 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Page,.          
24960 20 20 20 20 28 28 65 4f 70 26 30 78 30 31 29 3d      ((eOp&0x01)=
24970 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  =0 ? PAGER_GET_R
24980 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20  EADONLY : 0).   
24990 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
249a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
249b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
249c0 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20       aPayload = 
249d0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
249e0 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
249f0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
24a00 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50  ge = get4byte(aP
24a10 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20  ayload);.       
24a20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61       rc = copyPa
24a30 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
24a40 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c  offset+4], pBuf,
24a50 20 61 2c 20 28 65 4f 70 26 30 78 30 31 29 2c 20   a, (eOp&0x01), 
24a60 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
24a70 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
24a80 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
24a90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  ;.            of
24aa0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
24ab0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
24ac0 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61          amt -= a
24ad0 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b  ;.        pBuf +
24ae0 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = a;.      }.   
24af0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
24b00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
24b10 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  mt>0 ){.    retu
24b20 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
24b30 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
24b40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24b50 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
24b60 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  he key associate
24b70 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
24b80 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
24b90 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
24ba0 20 62 65 20 74 72 61 6e 73 66 65 72 72 65 64 20   be transferred 
24bb0 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
24bc0 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
24bd0 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
24be0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
24bf0 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74  er must ensure t
24c00 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e  hat pCur is poin
24c10 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20  ting to a valid 
24c20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61  row.** in the ta
24c30 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ble..**.** Retur
24c40 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
24c50 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
24c60 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
24c70 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
24c80 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
24c90 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
24ca0 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
24cb0 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
24cc0 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
24cd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24ce0 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f  BtreeKey(BtCurso
24cf0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
24d00 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
24d10 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73  id *pBuf){.  ass
24d20 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
24d30 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
24d40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
24d50 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
24d60 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
24d70 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
24d80 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
24d90 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
24da0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24db0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
24dc0 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
24dd0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
24de0 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ell );.  return 
24df0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
24e00 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
24e10 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
24e20 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  )pBuf, 0);.}../*
24e30 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
24e40 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69   the data associ
24e50 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
24e60 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
24e70 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
24e80 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
24e90 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
24ea0 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
24eb0 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
24ec0 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
24ed0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
24ee0 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
24ef0 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
24f00 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
24f10 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
24f20 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
24f30 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
24f40 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
24f50 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
24f60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
24f70 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f  treeData(BtCurso
24f80 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
24f90 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
24fa0 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
24fb0 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51   rc;..#ifndef SQ
24fc0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
24fd0 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e  OB.  if ( pCur->
24fe0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
24ff0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  NVALID ){.    re
25000 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52  turn SQLITE_ABOR
25010 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  T;.  }.#endif.. 
25020 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
25030 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
25040 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
25050 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
25060 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
25070 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25080 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25090 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
250a0 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
250b0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
250c0 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
250d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
250e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
250f0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
25100 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
25110 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25120 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
25130 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
25140 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
25150 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a   amt, pBuf, 0);.
25160 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
25170 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
25180 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
25190 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
251a0 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79  n from the entry
251b0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43   that the .** pC
251c0 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
251d0 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70  nting to.  The p
251e0 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65  ointer is to the
251f0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a   beginning of.**
25200 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65   the key if inde
25210 78 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d  x btrees (pPage-
25220 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20  >intKey==0) and 
25230 69 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a  is the data for.
25240 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20  ** table btrees 
25250 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  (pPage->intKey==
25260 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1). The number o
25270 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
25280 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61  able.** key/data
25290 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
252a0 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
252b0 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
252c0 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  alue.** returned
252d0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76   will not be a v
252e0 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
252f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25300 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
25310 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
25320 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
25330 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
25340 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
25350 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
25360 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
25370 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
25380 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
25390 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
253a0 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
253b0 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
253c0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
253d0 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
253e0 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
253f0 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
25400 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
25410 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
25420 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
25430 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
25440 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74   reassemble.** t
25450 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
25460 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
25470 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
25480 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
25490 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
254a0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
254b0 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
254c0 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
254d0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
254e0 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
254f0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
25500 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
25510 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
25520 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
25530 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
25540 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50  nst void *fetchP
25550 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
25560 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
25570 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
25580 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
25590 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
255a0 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20   *pAmt          
255b0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
255c0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
255d0 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f  le bytes here */
255e0 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43  .){.  assert( pC
255f0 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  ur!=0 && pCur->i
25600 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
25610 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25620 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  age]);.  assert(
25630 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
25640 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
25650 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
25660 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
25670 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
25680 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
25690 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
256a0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
256b0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
256c0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
256d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
256e0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
256f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
25700 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20  r->info.nSize>0 
25710 29 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 70 43 75  );.  *pAmt = pCu
25720 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
25730 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
25740 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
25750 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  oad;.}.../*.** F
25760 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
25770 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
25780 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72   point to, retur
25790 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74  n as.** many byt
257a0 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72  es of the key or
257b0 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61   data as are ava
257c0 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  ilable on the lo
257d0 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  cal.** b-tree pa
257e0 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  ge.  Write the n
257f0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
25800 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70  le bytes into *p
25810 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Amt..**.** The p
25820 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
25830 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54  is ephemeral.  T
25840 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20  he key/data may 
25850 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65  move.** or be de
25860 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e  stroyed on the n
25870 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20  ext call to any 
25880 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a  Btree routine,.*
25890 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c  * including call
258a0 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72  s from other thr
258b0 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65  eads against the
258c0 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20   same cache..** 
258d0 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f  Hence, a mutex o
258e0 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  n the BtShared s
258f0 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72  hould be held pr
25900 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a  ior to calling.*
25910 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
25920 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
25930 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20  ines is used to 
25940 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73  get quick access
25950 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61   to key and data
25960 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** in the commo
25970 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20  n case where no 
25980 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
25990 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73  re used..*/.cons
259a0 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
259b0 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43  treeKeyFetch(BtC
259c0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
259d0 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72   *pAmt){.  retur
259e0 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  n fetchPayload(p
259f0 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f  Cur, pAmt);.}.co
25a00 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
25a10 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28  3BtreeDataFetch(
25a20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
25a30 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65  u32 *pAmt){.  re
25a40 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61  turn fetchPayloa
25a50 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d  d(pCur, pAmt);.}
25a60 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
25a70 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
25a80 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
25a90 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20  e.  The newPgno 
25aa0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a  argument is the.
25ab0 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
25ac0 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
25ad0 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a   to move to..**.
25ae0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
25af0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
25b00 43 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70  CORRUPT if the p
25b10 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73  age-header flags
25b20 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65   field of.** the
25b30 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
25b40 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
25b50 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  he flags field o
25b60 66 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e  f the parent (i.
25b70 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b  e..** if an intk
25b80 65 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20  ey page appears 
25b90 74 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74  to be the parent
25ba0 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79   of a non-intkey
25bb0 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63   page, or.** vic
25bc0 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61  e-versa)..*/.sta
25bd0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68  tic int moveToCh
25be0 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ild(BtCursor *pC
25bf0 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29  ur, u32 newPgno)
25c00 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
25c10 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  t i = pCur->iPag
25c20 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  e;.  MemPage *pN
25c30 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72  ewPage;.  BtShar
25c40 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
25c50 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
25c60 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
25c70 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
25c80 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
25c90 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
25ca0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
25cb0 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52  ->iPage<BTCURSOR
25cc0 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20  _MAX_DEPTH );.  
25cd0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
25ce0 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  age>=0 );.  if( 
25cf0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54  pCur->iPage>=(BT
25d00 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
25d10 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
25d20 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
25d30 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20  _BKPT;.  }.  rc 
25d40 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
25d50 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26  (pBt, newPgno, &
25d60 70 4e 65 77 50 61 67 65 2c 0a 20 20 20 20 20 20  pNewPage,.      
25d70 20 20 20 20 20 20 20 20 20 28 70 43 75 72 2d 3e           (pCur->
25d80 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
25d90 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20  WriteFlag)==0 ? 
25da0 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
25db0 4c 59 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 72  LY : 0);.  if( r
25dc0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
25dd0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b   pCur->apPage[i+
25de0 31 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20  1] = pNewPage;. 
25df0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31   pCur->aiIdx[i+1
25e00 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  ] = 0;.  pCur->i
25e10 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d  Page++;..  pCur-
25e20 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
25e30 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
25e40 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
25e50 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
25e60 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 70 4e 65  Ovfl);.  if( pNe
25e70 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c  wPage->nCell<1 |
25e80 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b  | pNewPage->intK
25e90 65 79 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  ey!=pCur->apPage
25ea0 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  [i]->intKey ){. 
25eb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25ec0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
25ed0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
25ee0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a  TE_OK;.}..#if 0.
25ef0 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
25f00 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
25f10 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
25f20 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
25f30 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
25f40 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
25f50 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
25f60 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
25f70 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
25f80 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
25f90 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
25fa0 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
25fb0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
25fc0 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
25fd0 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
25fe0 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
25ff0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
26000 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
26010 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
26020 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
26030 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
26040 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
26050 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73  o iChild){.  ass
26060 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65  ert( iIdx<=pPare
26070 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69  nt->nCell );.  i
26080 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74  f( iIdx==pParent
26090 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61  ->nCell ){.    a
260a0 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
260b0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
260c0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
260d0 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29  et+8])==iChild )
260e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
260f0 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
26100 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
26110 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64  , iIdx))==iChild
26120 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
26130 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  #  define assert
26140 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c  ParentIndex(x,y,
26150 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  z) .#endif../*.*
26160 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
26170 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65  r up to the pare
26180 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  nt page..**.** p
26190 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
261a0 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65  to the cell inde
261b0 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  x that contains 
261c0 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  the pointer.** t
261d0 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  o the page we ar
261e0 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20  e coming from.  
261f0 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  If we are coming
26200 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67   from the.** rig
26210 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61  ht-most child pa
26220 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64  ge then pCur->id
26230 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20  x is set to one 
26240 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65  more than.** the
26250 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e   largest cell in
26260 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
26270 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74  oid moveToParent
26280 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
26290 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
262a0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
262b0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
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 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
262e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
262f0 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  age>0 );.  asser
26300 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
26310 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
26320 0a 20 20 2f 2a 20 55 50 44 41 54 45 3a 20 49 74  .  /* UPDATE: It
26330 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73   is actually pos
26340 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 6f  sible for the co
26350 6e 64 69 74 69 6f 6e 20 74 65 73 74 65 64 20 62  ndition tested b
26360 79 20 74 68 65 20 61 73 73 65 72 74 0a 20 20 2a  y the assert.  *
26370 2a 20 62 65 6c 6f 77 20 74 6f 20 62 65 20 75 6e  * below to be un
26380 74 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61  true if the data
26390 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72  base file is cor
263a0 72 75 70 74 2e 20 54 68 69 73 20 63 61 6e 20 6f  rupt. This can o
263b0 63 63 75 72 20 69 66 0a 20 20 2a 2a 20 6f 6e 65  ccur if.  ** one
263c0 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 64 69   cursor has modi
263d0 66 69 65 64 20 70 61 67 65 20 70 50 61 72 65 6e  fied page pParen
263e0 74 20 77 68 69 6c 65 20 61 20 72 65 66 65 72 65  t while a refere
263f0 6e 63 65 20 74 6f 20 69 74 20 69 73 20 68 65 6c  nce to it is hel
26400 64 20 0a 20 20 2a 2a 20 62 79 20 61 20 73 65 63  d .  ** by a sec
26410 6f 6e 64 20 63 75 72 73 6f 72 2e 20 57 68 69 63  ond cursor. Whic
26420 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  h can only happe
26430 6e 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61  n if a single pa
26440 67 65 20 69 73 20 6c 69 6e 6b 65 64 0a 20 20 2a  ge is linked.  *
26450 2a 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e  * into more than
26460 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75   one b-tree stru
26470 63 74 75 72 65 20 69 6e 20 61 20 63 6f 72 72 75  cture in a corru
26480 70 74 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f  pt database.  */
26490 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 50  .#if 0.  assertP
264a0 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20  arentIndex(.    
264b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
264c0 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
264d0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
264e0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
264f0 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
26500 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67  pCur->iPage]->pg
26510 6e 6f 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20  no.  );.#endif. 
26520 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d   testcase( pCur-
26530 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
26540 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70  ge-1] > pCur->ap
26550 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
26560 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  -1]->nCell );.. 
26570 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
26580 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
26590 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d  iPage]);.  pCur-
265a0 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72  >iPage--;.  pCur
265b0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
265c0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
265d0 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
265e0 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
265f0 64 4f 76 66 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dOvfl);.}../*.**
26600 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
26610 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
26620 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74   root page of it
26630 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  s b-tree structu
26640 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
26650 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72   table has a vir
26660 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20  tual root page, 
26670 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
26680 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e  is moved to poin
26690 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74  t.** to the virt
266a0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ual root page in
266b0 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74  stead of the act
266c0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41  ual root page. A
266d0 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20   table has a.** 
266e0 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
266f0 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61  e when the actua
26700 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74  l root page cont
26710 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e  ains no cells an
26720 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63  d a .** single c
26730 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20  hild page. This 
26740 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
26750 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72  with the table r
26760 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e  ooted at page 1.
26770 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d  .**.** If the b-
26780 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69  tree structure i
26790 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72  s empty, the cur
267a0 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74  sor state is set
267b0 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49   to .** CURSOR_I
267c0 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73  NVALID. Otherwis
267d0 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  e, the cursor is
267e0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
267f0 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65   the first.** ce
26800 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68  ll located on th
26810 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75  e root (or virtu
26820 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e  al root) page an
26830 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  d the cursor sta
26840 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  te.** is set to 
26850 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a  CURSOR_VALID..**
26860 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
26870 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63  tion returns suc
26880 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61  cessfully, it ma
26890 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61  y be assumed tha
268a0 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65  t the.** page-he
268b0 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63  ader flags indic
268c0 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69  ate that the [vi
268d0 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65  rtual] root-page
268e0 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64   is the expected
268f0 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74   .** kind of b-t
26900 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69  ree page (i.e. i
26910 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  f when opening t
26920 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61  he cursor the ca
26930 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20  ller did not.** 
26940 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
26950 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20  o structure the 
26960 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65  flags byte is se
26970 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30  t to 0x05 or 0x0
26980 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67  D,.** indicating
26990 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c   a table b-tree,
269a0 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65   or if the calle
269b0 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20  r did specify a 
269c0 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75  KeyInfo .** stru
269d0 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
269e0 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
269f0 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64  x02 or 0x0A, ind
26a00 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78  icating an index
26a10 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a  .** b-tree)..*/.
26a20 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
26a30 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  oRoot(BtCursor *
26a40 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
26a50 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72   *pRoot;.  int r
26a60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
26a70 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
26a80 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
26a90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
26aa0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43  RSOR_INVALID < C
26ab0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
26ac0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
26ad0 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20  URSOR_VALID   < 
26ae0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
26af0 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
26b00 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e  CURSOR_FAULT   >
26b10 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
26b20 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
26b30 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
26b40 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b  R_REQUIRESEEK ){
26b50 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
26b60 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
26b70 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ULT ){.      ass
26b80 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
26b90 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ext!=SQLITE_OK )
26ba0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
26bb0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
26bc0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
26bd0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
26be0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  (pCur);.  }..  i
26bf0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
26c00 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  0 ){.    while( 
26c10 70 43 75 72 2d 3e 69 50 61 67 65 20 29 20 72 65  pCur->iPage ) re
26c20 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
26c30 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26c40 67 65 2d 2d 5d 29 3b 0a 20 20 7d 65 6c 73 65 20  ge--]);.  }else 
26c50 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  if( pCur->pgnoRo
26c60 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75  ot==0 ){.    pCu
26c70 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
26c80 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
26c90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26ca0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
26cb0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
26cc0 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ge(pCur->pBtree-
26cd0 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  >pBt, pCur->pgno
26ce0 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50  Root, &pCur->apP
26cf0 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20  age[0],.        
26d00 20 20 20 20 20 20 20 20 20 28 70 43 75 72 2d 3e           (pCur->
26d10 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
26d20 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20  WriteFlag)==0 ? 
26d30 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
26d40 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28  LY : 0);.    if(
26d50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26d60 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
26d70 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
26d80 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74  VALID;.      ret
26d90 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
26da0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
26db0 30 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d  0;.  }.  pRoot =
26dc0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
26dd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ;.  assert( pRoo
26de0 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70  t->pgno==pCur->p
26df0 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a  gnoRoot );..  /*
26e00 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e   If pCur->pKeyIn
26e10 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  fo is not NULL, 
26e20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
26e30 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73  that opened this
26e40 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70   cursor.  ** exp
26e50 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74  ected to open it
26e60 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   on an index b-t
26e70 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ree. Otherwise, 
26e80 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20  if pKeyInfo is. 
26e90 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61   ** NULL, the ca
26ea0 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74  ller expects a t
26eb0 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20  able b-tree. If 
26ec0 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
26ed0 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72  case,.  ** retur
26ee0 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  n an SQLITE_CORR
26ef0 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a  UPT error. .  **
26f00 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65  .  ** Earlier ve
26f10 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
26f20 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
26f30 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f  is test could no
26f40 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74  t fail.  ** if t
26f50 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73  he root page was
26f60 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20   already loaded 
26f70 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
26f80 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69  on was called (i
26f90 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72  .e..  ** if pCur
26fa0 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74  ->iPage>=0). But
26fb0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20   this is not so 
26fc0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
26fd0 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20  is corrupted .  
26fe0 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ** in such a way
26ff0 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74   that page pRoot
27000 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20   is linked into 
27010 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20  a second b-tree 
27020 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20  table .  ** (or 
27030 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20  the freelist).  
27040 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  */.  assert( pRo
27050 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c  ot->intKey==1 ||
27060 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
27070 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  0 );.  if( pRoot
27080 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28  ->isInit==0 || (
27090 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
270a0 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  0)!=pRoot->intKe
270b0 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
270c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
270d0 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72  KPT;.  }..  pCur
270e0 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
270f0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
27100 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
27110 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
27120 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
27130 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
27140 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28  lidOvfl);..  if(
27150 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20   pRoot->nCell>0 
27160 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
27170 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
27180 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ID;.  }else if( 
27190 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a  !pRoot->leaf ){.
271a0 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65      Pgno subpage
271b0 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d  ;.    if( pRoot-
271c0 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72  >pgno!=1 ) retur
271d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
271e0 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61  _BKPT;.    subpa
271f0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
27200 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
27210 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
27220 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
27230 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
27240 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
27250 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
27260 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bpage);.  }else{
27270 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
27280 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
27290 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ID;.  }.  return
272a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
272b0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
272c0 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  wn to the left-m
272d0 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
272e0 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e  eneath the.** en
272f0 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20  try to which it 
27300 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
27310 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
27320 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
27330 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
27340 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
27350 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20   - the first.** 
27360 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
27370 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
27380 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
27390 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
273a0 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
273b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
273c0 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
273d0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
273e0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
273f0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
27400 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
27410 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
27420 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
27430 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
27440 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
27450 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27460 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
27470 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
27480 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
27490 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
274a0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
274b0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
274c0 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  age, pCur->aiIdx
274d0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b  [pCur->iPage]));
274e0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
274f0 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
27500 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
27510 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
27520 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
27530 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
27540 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
27550 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
27560 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
27570 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
27580 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
27590 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
275a0 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
275b0 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
275c0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
275d0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
275e0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
275f0 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
27600 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
27610 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
27620 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
27630 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
27640 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
27650 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
27660 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
27670 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
27680 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
27690 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
276a0 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
276b0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
276c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
276d0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
276e0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
276f0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
27700 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27710 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
27720 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
27730 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
27740 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
27750 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
27760 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
27770 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28  D );.  while( !(
27780 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
27790 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
277a0 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
277b0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
277c0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
277d0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
277e0 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ]);.    pCur->ai
277f0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
27800 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
27810 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
27820 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
27830 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
27840 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
27850 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
27860 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67  r->iPage] = pPag
27870 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73  e->nCell-1;.  as
27880 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
27890 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61  .nSize==0 );.  a
278a0 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
278b0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
278c0 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20  lidNKey)==0 );. 
278d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
278e0 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  K;.}../* Move th
278f0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
27900 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
27910 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
27920 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
27930 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
27940 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
27950 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
27960 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
27970 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
27980 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
27990 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
279a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
279b0 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72  BtreeFirst(BtCur
279c0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
279d0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
279e0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
279f0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
27a00 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
27a10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
27a20 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
27a30 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
27a40 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
27a50 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
27a60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27a70 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
27a80 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
27a90 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73  LID ){.      ass
27aa0 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
27ab0 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
27ac0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27ad0 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
27ae0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
27af0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27b00 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
27b10 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27b20 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
27b30 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
27b40 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
27b50 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
27b60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
27b70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
27b80 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
27b90 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
27ba0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
27bb0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
27bc0 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
27bd0 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
27be0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
27bf0 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
27c00 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
27c10 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
27c20 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
27c30 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
27c40 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
27c50 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
27c60 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
27c70 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74  t rc;. .  assert
27c80 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
27c90 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
27ca0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
27cb0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
27cc0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
27cd0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
27ce0 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79  e cursor already
27cf0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
27d00 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20  ast entry, this 
27d10 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
27d20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49   if( CURSOR_VALI
27d30 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
27d40 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
27d50 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74  gs & BTCF_AtLast
27d60 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53  )!=0 ){.#ifdef S
27d70 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
27d80 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  /* This block se
27d90 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29  rves to assert()
27da0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
27db0 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69   really does poi
27dc0 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  nt .    ** to th
27dd0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
27de0 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20  the b-tree. */. 
27df0 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66     int ii;.    f
27e00 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72  or(ii=0; ii<pCur
27e10 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a  ->iPage; ii++){.
27e20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
27e30 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70  ur->aiIdx[ii]==p
27e40 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d  Cur->apPage[ii]-
27e50 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a  >nCell );.    }.
27e60 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
27e70 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
27e80 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  age]==pCur->apPa
27e90 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
27ea0 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20  >nCell-1 );.    
27eb0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
27ec0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27ed0 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69  ]->leaf );.#endi
27ee0 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
27ef0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72  ITE_OK;.  }..  r
27f00 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
27f10 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
27f20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27f30 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
27f40 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
27f50 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
27f60 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
27f70 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
27f80 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27f90 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
27fa0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
27fb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27fc0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
27fd0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
27fe0 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  LID );.      *pR
27ff0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
28000 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
28010 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
28020 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28030 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
28040 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
28050 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20  TCF_AtLast;.    
28060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28070 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
28080 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b  &= ~BTCF_AtLast;
28090 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20  .      }.   .   
280a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
280b0 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
280c0 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
280d0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
280e0 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65  n entry near the
280f0 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69   key .** specifi
28100 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72  ed by pIdxKey or
28110 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72   intKey.   Retur
28120 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65  n a success code
28130 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b  ..**.** For INTK
28140 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69  EY tables, the i
28150 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20  ntKey parameter 
28160 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65  is used.  pIdxKe
28170 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55  y .** must be NU
28180 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74  LL.  For index t
28190 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69  ables, pIdxKey i
281a0 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65  s used and intKe
281b0 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e  y.** is ignored.
281c0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61  .**.** If an exa
281d0 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20  ct match is not 
281e0 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
281f0 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
28200 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e  .** left pointin
28210 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65  g at a leaf page
28220 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c   which would hol
28230 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69  d the entry if i
28240 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  t.** were presen
28250 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  t.  The cursor m
28260 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ight point to an
28270 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65   entry that come
28280 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61  s.** before or a
28290 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  fter the key..**
282a0 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69  .** An integer i
282b0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
282c0 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68  pRes which is th
282d0 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63  e result of.** c
282e0 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79  omparing the key
282f0 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20   with the entry 
28300 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72  to which the cur
28310 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74  sor is .** point
28320 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e  ing.  The meanin
28330 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  g of the integer
28340 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
28350 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c   *pRes is as fol
28360 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
28370 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
28380 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
28390 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
283a0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
283b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
283c0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e   smaller than in
283d0 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20  tKey/pIdxKey or 
283e0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
283f0 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
28400 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
28410 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
28420 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
28430 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
28440 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
28450 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
28460 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
28470 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
28480 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
28490 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
284a0 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78  ches intKey/pIdx
284b0 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
284c0 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
284d0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
284e0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
284f0 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
28510 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b  larger than intK
28520 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
28530 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
28540 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
28550 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
28560 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur,          /* 
28570 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65  The cursor to be
28580 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61   moved */.  Unpa
28590 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
285a0 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64  Key, /* Unpacked
285b0 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
285c0 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20  i64 intKey,     
285d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
285e0 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69  table key */.  i
285f0 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20  nt biasRight,   
28600 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
28610 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61  ue, bias the sea
28620 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20  rch to the high 
28630 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  end */.  int *pR
28640 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
28650 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
28660 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
28670 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
28680 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78   RecordCompare x
28690 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a  RecordCompare;..
286a0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
286b0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
286c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
286d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
286e0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
286f0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
28700 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20  ssert( pRes );. 
28710 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65   assert( (pIdxKe
28720 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b  y==0)==(pCur->pK
28730 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20  eyInfo==0) );.. 
28740 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
28750 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73  r is already pos
28760 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70  itioned at the p
28770 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69  oint we are tryi
28780 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20  ng.  ** to move 
28790 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  to, then just re
287a0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
287b0 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20  ng any work */. 
287c0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
287d0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
287e0 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
287f0 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e  gs & BTCF_ValidN
28800 4b 65 79 29 21 3d 30 0a 20 20 20 26 26 20 70 43  Key)!=0.   && pC
28810 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
28820 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20  ntKey .  ){.    
28830 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
28840 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
28850 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
28860 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
28870 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
28880 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
28890 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
288a0 61 73 74 29 21 3d 30 20 26 26 20 70 43 75 72 2d  ast)!=0 && pCur-
288b0 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65  >info.nKey<intKe
288c0 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
288d0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
288e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
288f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
28900 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78  pIdxKey ){.    x
28910 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
28920 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43  sqlite3VdbeFindC
28930 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b  ompare(pIdxKey);
28940 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72  .    pIdxKey->er
28950 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61  rCode = 0;.    a
28960 73 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e  ssert( pIdxKey->
28970 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20  default_rc==1 . 
28980 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
28990 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
289a0 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  0 .         || p
289b0 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
289c0 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20  rc==-1.    );.  
289d0 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f  }else{.    xReco
289e0 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f  rdCompare = 0; /
289f0 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69  * All keys are i
28a00 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a  ntegers */.  }..
28a10 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
28a20 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
28a30 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
28a40 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
28a50 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
28a60 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
28a70 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28a80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28a90 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
28aa0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
28ab0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73  pCur->iPage]->is
28ac0 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
28ad0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
28ae0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
28af0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
28b00 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
28b10 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43  ll>0 );.  if( pC
28b20 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
28b30 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
28b40 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
28b50 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28b60 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
28b70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28b80 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
28b90 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
28ba0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
28bb0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28bc0 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
28bd0 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a  y || pIdxKey );.
28be0 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
28bf0 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78  nt lwr, upr, idx
28c00 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68  , c;.    Pgno ch
28c10 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67  ldPg;.    MemPag
28c20 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
28c30 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28c40 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43  age];.    u8 *pC
28c50 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
28c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28c70 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72   Pointer to curr
28c80 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67  ent cell in pPag
28c90 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61  e */..    /* pPa
28ca0 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62  ge->nCell must b
28cb0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  e greater than z
28cc0 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20  ero. If this is 
28cd0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  the root-page.  
28ce0 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20    ** the cursor 
28cf0 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  would have been 
28d00 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e  INVALID above an
28d10 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c  d this for(;;) l
28d20 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72  oop.    ** not r
28d30 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e  un. If this is n
28d40 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ot the root-page
28d50 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54  , then the moveT
28d60 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65  oChild() routine
28d70 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61  .    ** would ha
28d80 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65 63  ve already detec
28d90 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f  ted db corruptio
28da0 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50  n. Similarly, pP
28db0 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  age must.    ** 
28dc0 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e  be the right kin
28dd0 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  d (index or tabl
28de0 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  e) of b-tree pag
28df0 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20  e. Otherwise.   
28e00 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c   ** a moveToChil
28e10 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f  d() or moveToRoo
28e20 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68  t() call would h
28e30 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72  ave detected cor
28e40 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  ruption.  */.   
28e50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
28e60 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61  nCell>0 );.    a
28e70 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
28e80 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d  tKey==(pIdxKey==
28e90 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20  0) );.    lwr = 
28ea0 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61  0;.    upr = pPa
28eb0 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
28ec0 20 61 73 73 65 72 74 28 20 62 69 61 73 52 69 67   assert( biasRig
28ed0 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67  ht==0 || biasRig
28ee0 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78  ht==1 );.    idx
28ef0 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52   = upr>>(1-biasR
28f00 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20  ight); /* idx = 
28f10 62 69 61 73 52 69 67 68 74 20 3f 20 75 70 72 20  biasRight ? upr 
28f20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a  : (lwr+upr)/2; *
28f30 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  /.    pCur->aiId
28f40 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
28f50 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69   (u16)idx;.    i
28f60 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  f( xRecordCompar
28f70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  e==0 ){.      fo
28f80 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69  r(;;){.        i
28f90 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  64 nCellKey;.   
28fa0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
28fb0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
28fc0 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ) + pPage->child
28fd0 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
28fe0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
28ff0 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  eyLeaf ){.      
29000 20 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20      while( 0x80 
29010 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b  <= *(pCell++) ){
29020 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
29030 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61   pCell>=pPage->a
29040 44 61 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e  DataEnd ) return
29050 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
29060 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
29070 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
29080 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43      getVarint(pC
29090 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c  ell, (u64*)&nCel
290a0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  lKey);.        i
290b0 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b  f( nCellKey<intK
290c0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
290d0 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
290e0 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
290f0 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72  pr ){ c = -1; br
29100 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d  eak; }.        }
29110 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65  else if( nCellKe
29120 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y>intKey ){.    
29130 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
29140 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
29150 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20   lwr>upr ){ c = 
29160 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20  +1; break; }.   
29170 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29180 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
29190 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  ellKey==intKey )
291a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
291b0 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
291c0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
291d0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
291e0 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
291f0 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  ey;.          pC
29200 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
29210 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
29220 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  x;.          if(
29230 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
29240 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 77 72  .            lwr
29250 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20   = idx;.        
29260 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
29270 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20  next_layer;.    
29280 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29290 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
292a0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
292b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
292c0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
292d0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
292e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
292f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
29300 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30  sert( lwr+upr>=0
29310 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20   );.        idx 
29320 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20  = (lwr+upr)>>1; 
29330 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75   /* idx = (lwr+u
29340 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20  pr)/2; */.      
29350 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
29360 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
29370 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20      int nCell;. 
29380 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
29390 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
293a0 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  dx) + pPage->chi
293b0 6c 64 50 74 72 53 69 7a 65 3b 0a 0a 20 20 20 20  ldPtrSize;..    
293c0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
293d0 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67  um supported pag
293e0 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20  e-size is 65536 
293f0 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e  bytes. This mean
29400 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
29410 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * the maximum nu
29420 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62  mber of record b
29430 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61  ytes stored on a
29440 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20  n index B-Tree. 
29450 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
29460 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38  s less than 1638
29470 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20  4 bytes and may 
29480 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32  be stored as a 2
29490 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  -byte.        **
294a0 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e   varint. This in
294b0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
294c0 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  d to attempt to 
294d0 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20  avoid parsing . 
294e0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e         ** the en
294f0 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65  tire cell by che
29500 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61  cking for the ca
29510 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65  ses where the re
29520 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20  cord is .       
29530 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72   ** stored entir
29540 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62  ely within the b
29550 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e  -tree page by in
29560 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72  specting the fir
29570 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32  st .        ** 2
29580 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
29590 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ll..        */. 
295a0 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70         nCell = p
295b0 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Cell[0];.       
295c0 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67   if( nCell<=pPag
295d0 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  e->max1bytePaylo
295e0 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ad ){.          
295f0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72  /* This branch r
29600 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72  uns if the recor
29610 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  d-size field of 
29620 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20  the cell is a.  
29630 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c          ** singl
29640 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  e byte varint an
29650 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74  d the record fit
29660 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
29670 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20  e main.         
29680 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e   ** b-tree page.
29690 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74    */.          t
296a0 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e  estcase( pCell+n
296b0 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61  Cell+1==pPage->a
296c0 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20  DataEnd );.     
296d0 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
296e0 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28  Compare(nCell, (
296f0 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c  void*)&pCell[1],
29700 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
29710 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70     }else if( !(p
29720 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20  Cell[1] & 0x80) 
29730 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e  .          && (n
29740 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30  Cell = ((nCell&0
29750 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c  x7f)<<7) + pCell
29760 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  [1])<=pPage->max
29770 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b  Local.        ){
29780 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
29790 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69  e record-size fi
297a0 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20  eld is a 2 byte 
297b0 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
297c0 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20  ecord .         
297d0 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c   ** fits entirel
297e0 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d  y on the main b-
297f0 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
29800 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
29810 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32  e( pCell+nCell+2
29820 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  ==pPage->aDataEn
29830 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  d );.          c
29840 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
29850 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29  e(nCell, (void*)
29860 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b  &pCell[2], pIdxK
29870 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
29880 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
29890 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77   The record flow
298a0 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20  s over onto one 
298b0 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
298c0 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20   pages. In.     
298d0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73       ** this cas
298e0 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c  e the whole cell
298f0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72   needs to be par
29900 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c  sed, a buffer al
29910 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20  located.        
29920 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50    ** and accessP
29930 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f  ayload() used to
29940 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65   retrieve the re
29950 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20  cord into the.  
29960 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65          ** buffe
29970 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63  r before VdbeRec
29980 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e  ordCompare() can
29990 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20   be called. */. 
299a0 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70           void *p
299b0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
299c0 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43     u8 * const pC
299d0 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20  ellBody = pCell 
299e0 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  - pPage->childPt
299f0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  rSize;.         
29a00 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
29a10 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42  tr(pPage, pCellB
29a20 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  ody, &pCur->info
29a30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65  );.          nCe
29a40 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e  ll = (int)pCur->
29a50 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20  info.nKey;.     
29a60 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
29a70 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e  sqlite3Malloc( n
29a80 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  Cell );.        
29a90 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
29aa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
29ab0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
29ac0 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
29ad0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
29ae0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
29af0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
29b00 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29b10 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
29b20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63           rc = ac
29b30 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
29b40 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73  , 0, nCell, (uns
29b50 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c  igned char*)pCel
29b60 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20 20 20  lKey, 2);.      
29b70 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
29b80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29b90 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
29ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
29bb0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
29bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
29bd0 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
29be0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
29bf0 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78  , pCellKey, pIdx
29c00 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
29c10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
29c20 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
29c30 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
29c40 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ( .            (
29c50 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
29c60 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  !=SQLITE_CORRUPT
29c70 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20   || c==0).      
29c80 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e     && (pIdxKey->
29c90 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
29ca0 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70  NOMEM || pCur->p
29cb0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Btree->db->mallo
29cc0 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20  cFailed).       
29cd0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
29ce0 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c<0 ){.         
29cf0 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
29d00 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
29d10 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>0 ){.         
29d20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
29d30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29d40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
29d50 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
29d60 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
29d70 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
29d80 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
29d90 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
29da0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
29db0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  idx;.          i
29dc0 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43  f( pIdxKey->errC
29dd0 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ode ) rc = SQLIT
29de0 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  E_CORRUPT;.     
29df0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
29e00 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
29e10 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c   }.        if( l
29e20 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a  wr>upr ) break;.
29e30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29e40 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20  lwr+upr>=0 );.  
29e50 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72        idx = (lwr
29e60 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64  +upr)>>1;  /* id
29e70 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20  x = (lwr+upr)/2 
29e80 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
29e90 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
29ea0 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67  ==upr+1 || (pPag
29eb0 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
29ec0 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20  age->leaf) );.  
29ed0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
29ee0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69  >isInit );.    i
29ef0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
29f00 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
29f10 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
29f20 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
29f30 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29f40 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
29f50 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
29f60 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
29f70 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70  16)idx;.      *p
29f80 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72  Res = c;.      r
29f90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
29fa0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
29fb0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d  _finish;.    }.m
29fc0 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72  oveto_next_layer
29fd0 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70  :.    if( lwr>=p
29fe0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
29ff0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
2a000 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2a010 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2a020 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
2a030 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
2a040 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
2a050 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
2a060 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  r));.    }.    p
2a070 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2a080 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c  >iPage] = (u16)l
2a090 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  wr;.    rc = mov
2a0a0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63  eToChild(pCur, c
2a0b0 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20  hldPg);.    if( 
2a0c0 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  rc ) break;.  }.
2a0d0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20  moveto_finish:. 
2a0e0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2a0f0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
2a100 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2a110 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2a120 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72  _ValidOvfl);.  r
2a130 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2a140 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
2a150 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2a160 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
2a170 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
2a180 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
2a190 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
2a1a0 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
2a1b0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
2a1c0 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
2a1d0 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
2a1e0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2a1f0 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
2a200 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
2a210 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
2a220 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
2a230 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
2a240 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2a250 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2a260 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
2a270 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
2a280 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
2a290 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
2a2a0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2a2b0 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
2a2c0 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
2a2d0 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
2a2e0 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
2a2f0 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
2a300 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
2a310 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
2a320 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
2a330 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
2a340 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
2a350 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
2a360 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
2a370 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
2a380 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
2a390 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
2a3a0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
2a3b0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
2a3c0 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
2a3d0 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
2a3e0 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
2a3f0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
2a400 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
2a410 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
2a420 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
2a430 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
2a440 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a  set *pRes=1..**.
2a450 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72  ** The main entr
2a460 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74  y point is sqlit
2a470 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20  e3BtreeNext().  
2a480 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20  That routine is 
2a490 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72  optimized.** for
2a4a0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2a4b0 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65   of merely incre
2a4c0 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c  menting the cell
2a4d0 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f   counter BtCurso
2a4e0 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68  r.aiIdx.** to th
2a4f0 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74  e next cell on t
2a500 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
2a510 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62    The (slower) b
2a520 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65  treeNext() helpe
2a530 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  r.** routine is 
2a540 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69  called when it i
2a550 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d  s necessary to m
2a560 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65  ove to a differe
2a570 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f  nt page or.** to
2a580 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
2a590 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  sor..**.** The c
2a5a0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
2a5b0 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74  will set *pRes t
2a5c0 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69  o 0 or 1.  The i
2a5d0 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c  nitial *pRes val
2a5e0 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20  ue.** will be 1 
2a5f0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65  if the cursor be
2a600 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72  ing stepped corr
2a610 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
2a620 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69  L index and.** i
2a630 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  f this routine c
2a640 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73  ould have been s
2a650 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53  kipped if that S
2a660 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  QL index had bee
2a670 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e  n.** a unique in
2a680 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20  dex.  Otherwise 
2a690 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
2a6a0 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74  have set *pRes t
2a6b0 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20  o zero..** Zero 
2a6c0 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  is the common ca
2a6d0 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d  se. The btree im
2a6e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
2a6f0 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a  free to use the.
2a700 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  ** initial *pRes
2a710 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74   value as a hint
2a720 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66   to improve perf
2a730 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65  ormance, but the
2a740 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69   current.** SQLi
2a750 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  te btree impleme
2a760 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ntation does not
2a770 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65  . (Note that the
2a780 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a   comdb2 btree.**
2a790 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2a7a0 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69  does use this hi
2a7b0 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f  nt, however.).*/
2a7c0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
2a7d0 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65  OINLINE int btre
2a7e0 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
2a7f0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2a800 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
2a810 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
2a820 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2a830 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2a840 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2a850 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2a860 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2a870 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2a880 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2a890 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b  ert( *pRes==0 );
2a8a0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2a8b0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2a8c0 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
2a8d0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2a8e0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
2a8f0 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  l)==0 );.    rc 
2a900 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
2a910 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
2a920 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2a930 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2a940 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2a950 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
2a960 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2a970 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ate ){.      *pR
2a980 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  es = 1;.      re
2a990 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2a9a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
2a9b0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a  ur->skipNext ){.
2a9c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2a9d0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2a9e0 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
2a9f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2aa00 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20  _SKIPNEXT );.   
2aa10 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2aa20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2aa30 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2aa40 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20  skipNext>0 ){.  
2aa50 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2aa60 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
2aa70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2aa80 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2aa90 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2aaa0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2aab0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2aac0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2aad0 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b  age];.  idx = ++
2aae0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2aaf0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
2ab00 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2ab10 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t );..  /* If th
2ab20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2ab30 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69  is corrupt, it i
2ab40 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  s possible for t
2ab50 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20  he value of idx 
2ab60 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61  .  ** to be inva
2ab70 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63  lid here. This c
2ab80 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66  an only occur if
2ab90 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72   a second cursor
2aba0 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74   modifies.  ** t
2abb0 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75  he page while cu
2abc0 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c  rsor pCur is hol
2abd0 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65  ding a reference
2abe0 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61   to it. Which ca
2abf0 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70  n.  ** only happ
2ac00 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61  en if the databa
2ac10 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e  se is corrupt in
2ac20 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74   such a way as t
2ac30 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20  o link the.  ** 
2ac40 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74  page into more t
2ac50 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73  han one b-tree s
2ac60 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74  tructure. */.  t
2ac70 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61  estcase( idx>pPa
2ac80 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
2ac90 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e  if( idx>=pPage->
2aca0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28  nCell ){.    if(
2acb0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2acc0 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
2acd0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
2ace0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2acf0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2ad00 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
2ad10 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2ad20 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  n rc;.      retu
2ad30 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
2ad40 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
2ad50 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28     do{.      if(
2ad60 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2ad70 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
2ad80 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
2ad90 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2ada0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2adb0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2adc0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2add0 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
2ade0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
2adf0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2ae00 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2ae10 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43  ;.    }while( pC
2ae20 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2ae30 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e  iPage]>=pPage->n
2ae40 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20  Cell );.    if( 
2ae50 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
2ae60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
2ae70 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
2ae80 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
2ae90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
2aea0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2aeb0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
2aec0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2aed0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2aee0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2aef0 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2af00 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2af10 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  }.}.int sqlite3B
2af20 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
2af30 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2af40 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  es){.  MemPage *
2af50 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
2af60 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2af70 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2af80 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
2af90 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
2afa0 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29  =0 || *pRes==1 )
2afb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2afc0 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2afd0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2afe0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2aff0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2b000 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
2b010 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2b020 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2b030 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a  _ValidOvfl);.  *
2b040 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRes = 0;.  if( 
2b050 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2b060 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74  RSOR_VALID ) ret
2b070 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43  urn btreeNext(pC
2b080 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 70 50 61  ur, pRes);.  pPa
2b090 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2b0a0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2b0b0 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 61    if( (++pCur->a
2b0c0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2b0d0 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ])>=pPage->nCell
2b0e0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   ){.    pCur->ai
2b0f0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2b100 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62  --;.    return b
2b110 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
2b120 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Res);.  }.  if( 
2b130 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2b140 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b150 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
2b160 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c    return moveToL
2b170 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
2b180 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70   }.}../*.** Step
2b190 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2b1a0 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70  he back to the p
2b1b0 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e  revious entry in
2b1c0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2b1d0 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
2b1e0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
2b1f0 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
2b200 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
2b210 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
2b220 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
2b230 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
2b240 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
2b250 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
2b260 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
2b270 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  ..**.** The main
2b280 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20   entry point is 
2b290 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2b2a0 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f  ious().  That ro
2b2b0 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a  utine is optimiz
2b2c0 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ed.** for the co
2b2d0 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72  mmon case of mer
2b2e0 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67  ely decrementing
2b2f0 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65   the cell counte
2b300 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  r BtCursor.aiIdx
2b310 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69  .** to the previ
2b320 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20  ous cell on the 
2b330 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54  current page.  T
2b340 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65  he (slower) btre
2b350 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68  ePrevious().** h
2b360 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73  elper routine is
2b370 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
2b380 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
2b390 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
2b3a0 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74  ent page.** or t
2b3b0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
2b3c0 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rsor..**.** The 
2b3d0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2b3e0 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20   will set *pRes 
2b3f0 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20  to 0 or 1.  The 
2b400 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
2b410 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31  lue.** will be 1
2b420 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62   if the cursor b
2b430 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72  eing stepped cor
2b440 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53  responds to an S
2b450 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20  QL index and.** 
2b460 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
2b470 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
2b480 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20  skipped if that 
2b490 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
2b4a0 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69  en.** a unique i
2b4b0 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65  ndex.  Otherwise
2b4c0 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
2b4d0 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20   have set *pRes 
2b4e0 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f  to zero..** Zero
2b4f0 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   is the common c
2b500 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69  ase. The btree i
2b510 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
2b520 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65   free to use the
2b530 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  .** initial *pRe
2b540 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e  s value as a hin
2b550 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72  t to improve per
2b560 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68  formance, but th
2b570 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c  e current.** SQL
2b580 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
2b590 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
2b5a0 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68  t. (Note that th
2b5b0 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a  e comdb2 btree.*
2b5c0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
2b5d0 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68   does use this h
2b5e0 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a  int, however.).*
2b5f0 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
2b600 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72  NOINLINE int btr
2b610 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
2b620 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2b630 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
2b640 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2b650 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2b660 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2b670 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2b680 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
2b690 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
2b6a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2b6b0 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2b6c0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2b6d0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2b6e0 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
2b6f0 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43  >curFlags & (BTC
2b700 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
2b710 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c  lidOvfl|BTCF_Val
2b720 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20  idNKey))==0 );. 
2b730 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2b740 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
2b750 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2b760 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2b770 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73   ){.    rc = res
2b780 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
2b790 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
2b7a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2b7b0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2b7c0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
2b7d0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
2b7e0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
2b7f0 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
2b800 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
2b810 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2b820 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
2b830 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  kipNext ){.     
2b840 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2b850 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2b860 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
2b870 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
2b880 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43  NEXT );.      pC
2b890 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2b8a0 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20  SOR_VALID;.     
2b8b0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2b8c0 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ext<0 ){.       
2b8d0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2b8e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
2b8f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2b900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
2b910 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
2b920 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
2b930 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2b940 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2b950 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2b960 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
2b970 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2b980 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
2b990 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2b9a0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63  ->iPage];.    rc
2b9b0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2b9c0 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69  Cur, get4byte(fi
2b9d0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
2b9e0 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x)));.    if( rc
2b9f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2ba00 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
2ba10 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
2ba20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
2ba30 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2ba40 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b  ur->iPage]==0 ){
2ba50 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2ba60 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
2ba70 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2ba80 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2ba90 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
2baa0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
2bab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2bac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
2bad0 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
2bae0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
2baf0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
2bb00 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nSize==0 );.    
2bb10 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2bb20 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f  urFlags & (BTCF_
2bb30 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
2bb40 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b  alidOvfl))==0 );
2bb50 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ..    pCur->aiId
2bb60 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
2bb70 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
2bb80 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2bb90 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
2bba0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
2bbb0 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
2bbc0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2bbd0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
2bbe0 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
2bbf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bc00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2bc10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2bc20 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
2bc30 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
2bc40 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
2bc50 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
2bc60 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2bc70 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2bc80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
2bc90 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2bca0 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52   *pRes==0 || *pR
2bcb0 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  es==1 );.  asser
2bcc0 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
2bcd0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
2bce0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2bcf0 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20  ID );.  *pRes = 
2bd00 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
2bd10 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
2bd20 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f  Last|BTCF_ValidO
2bd30 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  vfl|BTCF_ValidNK
2bd40 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ey);.  pCur->inf
2bd50 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69  o.nSize = 0;.  i
2bd60 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
2bd70 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20  =CURSOR_VALID.  
2bd80 20 7c 7c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b   || pCur->aiIdx[
2bd90 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a  pCur->iPage]==0.
2bda0 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61     || pCur->apPa
2bdb0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2bdc0 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20  >leaf==0.  ){.  
2bdd0 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 72    return btreePr
2bde0 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
2bdf0 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  s);.  }.  pCur->
2be00 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2be10 65 5d 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53  e]--;.  return S
2be20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2be30 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
2be40 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
2be50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2be60 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
2be70 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
2be80 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
2be90 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
2bea0 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
2beb0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
2bec0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
2bed0 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
2bee0 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
2bef0 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
2bf00 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
2bf10 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
2bf20 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
2bf30 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
2bf40 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
2bf50 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
2bf60 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
2bf70 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2bf80 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
2bf90 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
2bfa0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
2bfb0 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
2bfc0 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e  ror.  *ppPage an
2bfd0 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64  d *pPgno are und
2bfe0 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76  efined in the ev
2bff0 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
2c000 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b  .** Do not invok
2c010 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
2c020 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65  ref() on *ppPage
2c030 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
2c040 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
2c050 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
2c060 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
2c070 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f   0, then an effo
2c080 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
2c090 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
2c0a0 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
2c0b0 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
2c0c0 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
2c0d0 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
2c0e0 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
2c0f0 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
2c100 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
2c110 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2c120 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
2c130 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
2c140 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
2c150 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
2c160 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d   the eMode param
2c170 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f  eter is BTALLOC_
2c180 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65  EXACT and the ne
2c190 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73  arby page exists
2c1a0 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
2c1b0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
2c1c0 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
2c1d0 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
2c1e0 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64  ned.  If.** eMod
2c1f0 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20  e is BTALLOC_LT 
2c200 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65  then the page re
2c210 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c  turned will be l
2c220 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
2c230 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69  l.** to nearby i
2c240 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20  f any such page 
2c250 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64  exists.  If eMod
2c260 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  e is BTALLOC_ANY
2c270 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61   then there.** a
2c280 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f  re no restrictio
2c290 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65  ns on which page
2c2a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
2c2b0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
2c2c0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
2c2d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
2c2e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
2c2f0 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
2c300 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
2c310 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65   /* Store pointe
2c320 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  r to the allocat
2c330 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  ed page here */.
2c340 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20    Pgno *pPgno,  
2c350 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
2c360 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
2c370 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  r here */.  Pgno
2c380 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20   nearby,        
2c390 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
2c3a0 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69   a page near thi
2c3b0 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d  s one */.  u8 eM
2c3c0 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
2c3d0 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41    /* BTALLOC_EXA
2c3e0 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20  CT, BTALLOC_LT, 
2c3f0 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a  or BTALLOC_ANY *
2c400 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
2c410 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
2c420 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f  ;.  u32 n;     /
2c430 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2c440 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
2c450 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20  t */.  u32 k;   
2c460 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
2c470 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
2c480 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
2c490 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
2c4a0 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
2c4b0 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
2c4c0 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d  nk = 0;.  Pgno m
2c4d0 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f  xPage;     /* To
2c4e0 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
2c4f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2c500 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2c510 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2c520 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2c530 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42  assert( eMode==B
2c540 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e  TALLOC_ANY || (n
2c550 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74  earby>0 && IfNot
2c560 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f  OmitAV(pBt->auto
2c570 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50  Vacuum)) );.  pP
2c580 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
2c590 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62  e1;.  mxPage = b
2c5a0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
2c5b0 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  t);.  /* EVIDENC
2c5c0 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32  E-OF: R-05119-02
2c5d0 36 33 37 20 54 68 65 20 34 2d 62 79 74 65 20 62  637 The 4-byte b
2c5e0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
2c5f0 72 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20  r at offset 36. 
2c600 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65   ** stores store
2c610 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
2c620 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
2c630 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a  he freelist. */.
2c640 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26    n = get4byte(&
2c650 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
2c660 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  ]);.  testcase( 
2c670 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20  n==mxPage-1 );. 
2c680 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29   if( n>=mxPage )
2c690 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2c6a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2c6b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20  ;.  }.  if( n>0 
2c6c0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
2c6d0 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65  are pages on the
2c6e0 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73   freelist.  Reus
2c6f0 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  e one of those p
2c700 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e  ages. */.    Pgn
2c710 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38  o iTrunk;.    u8
2c720 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
2c730 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d   /* If the free-
2c740 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61  list must be sea
2c750 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62  rched for 'nearb
2c760 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f  y' */.    .    /
2c770 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  * If eMode==BTAL
2c780 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20  LOC_EXACT and a 
2c790 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69  query of the poi
2c7a0 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
2c7b0 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70  shows that the p
2c7c0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
2c7d0 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65  somewhere on the
2c7e0 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
2c7f0 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69  .    ** the enti
2c800 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20  re-list will be 
2c810 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61  searched for tha
2c820 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23  t page..    */.#
2c830 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c840 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2c850 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
2c860 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20  LLOC_EXACT ){.  
2c870 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d      if( nearby<=
2c880 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
2c890 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
2c8a0 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72      assert( near
2c8b0 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  by>0 );.        
2c8c0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
2c8d0 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20  oVacuum );.     
2c8e0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
2c8f0 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26  t(pBt, nearby, &
2c900 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20  eType, 0);.     
2c910 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2c920 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69  rn rc;.        i
2c930 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
2c940 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
2c950 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
2c960 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
2c970 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2c980 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54  se if( eMode==BT
2c990 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20  ALLOC_LE ){.    
2c9a0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
2c9b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
2c9c0 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
2c9d0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63   the free-list c
2c9e0 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69  ount by 1. Set i
2c9f0 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64  Trunk to the ind
2ca00 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ex of the.    **
2ca10 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74   first free-list
2ca20 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72   trunk page. iPr
2ca30 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69  evTrunk is initi
2ca40 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  ally 1..    */. 
2ca50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2ca60 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
2ca70 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2ca80 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2ca90 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  rc;.    put4byte
2caa0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2cab0 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20  36], n-1);..    
2cac0 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68  /* The code with
2cad0 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  in this loop is 
2cae0 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66  run only once if
2caf0 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74   the 'searchList
2cb00 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  ' variable.    *
2cb10 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f  * is not true. O
2cb20 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e  therwise, it run
2cb30 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
2cb40 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68  trunk-page on th
2cb50 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69  e.    ** free-li
2cb60 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67  st until the pag
2cb70 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  e 'nearby' is lo
2cb80 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54  cated (eMode==BT
2cb90 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20  ALLOC_EXACT).   
2cba0 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70   ** or until a p
2cbb0 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e  age less than 'n
2cbc0 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
2cbd0 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
2cbe0 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20  C_LT).    */.   
2cbf0 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
2cc00 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
2cc10 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
2cc20 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
2cc30 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
2cc40 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54   R-01506-11053 T
2cc50 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72  he first integer
2cc60 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74   on a freelist t
2cc70 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20  runk page.      
2cc80 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65    ** is the page
2cc90 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
2cca0 65 78 74 20 66 72 65 65 6c 69 73 74 20 74 72 75  ext freelist tru
2ccb0 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  nk page in the l
2ccc0 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a  ist or.        *
2ccd0 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69  * zero if this i
2cce0 73 20 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c  s the last freel
2ccf0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
2cd00 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  */.        iTrun
2cd10 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
2cd20 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
2cd30 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
2cd40 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
2cd50 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34  DENCE-OF: R-5984
2cd60 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62 79  1-13798 The 4-by
2cd70 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
2cd80 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
2cd90 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  32.        ** st
2cda0 6f 72 65 73 20 74 68 65 20 70 61 67 65 20 6e 75  ores the page nu
2cdb0 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
2cdc0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 72  t page of the fr
2cdd0 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20  eelist, or zero 
2cde0 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  if.        ** th
2cdf0 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d  e freelist is em
2ce00 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  pty. */.        
2ce10 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
2ce20 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2ce30 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
2ce40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2ce50 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
2ce60 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e  .      if( iTrun
2ce70 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  k>mxPage ){.    
2ce80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ce90 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2cea0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ceb0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
2cec0 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
2ced0 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
2cee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2cef0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70   rc ){.        p
2cf00 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
2cf10 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2cf20 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2cf30 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
2cf40 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20   pTrunk!=0 );.  
2cf50 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75      assert( pTru
2cf60 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a  nk->aData!=0 );.
2cf70 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
2cf80 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34  E-OF: R-13523-04
2cf90 33 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69  394 The second i
2cfa0 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65  nteger on a free
2cfb0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a  list trunk page.
2cfc0 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
2cfd0 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  number of leaf p
2cfe0 61 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  age pointers to 
2cff0 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20  follow. */.     
2d000 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   k = get4byte(&p
2d010 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
2d020 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30  ;.      if( k==0
2d030 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20   && !searchList 
2d040 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2d050 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c  e trunk has no l
2d060 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69  eaves and the li
2d070 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  st is not being 
2d080 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20  searched. .     
2d090 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74     ** So extract
2d0a0 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
2d0b0 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69  itself and use i
2d0c0 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a  t as the newly .
2d0d0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63          ** alloc
2d0e0 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20  ated page */.   
2d0f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
2d100 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20  evTrunk==0 );.  
2d110 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2d120 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
2d130 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2d140 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
2d150 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2d160 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2d170 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2d180 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
2d190 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65  runk;.        me
2d1a0 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
2d1b0 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
2d1c0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2d1d0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
2d1e0 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
2d1f0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
2d200 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2d210 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
2d220 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
2d230 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
2d240 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d  , n-1));.      }
2d250 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29  else if( k>(u32)
2d260 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
2d270 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20  /4 - 2) ){.     
2d280 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b     /* Value of k
2d290 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
2d2a0 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
2d2b0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
2d2c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2d2d0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2d2e0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2d2f0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e  ocate_page;.#ifn
2d300 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2d310 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
2d320 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63   }else if( searc
2d330 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20  hList .         
2d340 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69     && (nearby==i
2d350 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b  Trunk || (iTrunk
2d360 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65  <nearby && eMode
2d370 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a  ==BTALLOC_LE)) .
2d380 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2d390 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
2d3a0 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
2d3b0 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
2d3c0 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
2d3d0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
2d3e0 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
2d3f0 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
2d400 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
2d410 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a      */.        *
2d420 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
2d430 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
2d440 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
2d450 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
2d460 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2d470 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2d480 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
2d490 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2d4a0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
2d4b0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2d4c0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
2d4d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
2d4e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
2d4f0 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
2d500 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
2d510 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
2d520 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
2d530 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2d540 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2d550 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2d560 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2d570 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
2d580 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2d590 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2d5a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d5b0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2d5c0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2d5d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2d5e0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2d5f0 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
2d600 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
2d610 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2d620 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d630 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d640 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
2d650 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
2d660 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
2d670 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
2d680 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
2d690 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
2d6a0 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
2d6b0 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
2d6c0 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
2d6d0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
2d6e0 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
2d6f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2d700 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
2d710 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
2d720 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
2d730 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
2d740 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
2d750 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
2d760 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  wTrunk>mxPage ){
2d770 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63   .            rc
2d780 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2d790 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
2d7a0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2d7b0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2d7c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d7d0 20 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77    testcase( iNew
2d7e0 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
2d7f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2d800 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2d810 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
2d820 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  ewTrunk, 0);.   
2d830 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2d840 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d850 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2d860 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2d870 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d880 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2d890 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
2d8a0 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  wTrunk->pDbPage)
2d8b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2d8c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d8d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
2d8e0 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
2d8f0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
2d900 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2d910 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2d920 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
2d930 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
2d940 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
2d950 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2d960 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
2d970 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
2d980 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
2d990 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
2d9a0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
2d9b0 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
2d9c0 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
2d9d0 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
2d9e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
2d9f0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
2da00 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
2da10 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
2da20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2da30 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2da40 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
2da50 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
2da60 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2da70 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
2da80 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
2da90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2daa0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2dab0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2dac0 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
2dad0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
2dae0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2daf0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2db00 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2db10 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2db20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
2db30 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
2db40 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
2db50 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
2db60 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2db70 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
2db80 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
2db90 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
2dba0 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
2dbb0 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
2dbc0 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64  gno, n-1));.#end
2dbd0 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  if.      }else i
2dbe0 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( k>0 ){.      
2dbf0 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c    /* Extract a l
2dc00 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75  eaf from the tru
2dc10 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  nk */.        u3
2dc20 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20  2 closest;.     
2dc30 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20     Pgno iPage;. 
2dc40 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
2dc50 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54  char *aData = pT
2dc60 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20  runk->aData;.   
2dc70 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e       if( nearby>
2dc80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
2dc90 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  32 i;.          
2dca0 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
2dcb0 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65         if( eMode
2dcc0 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
2dcd0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2dce0 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
2dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50                iP
2dd00 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
2dd10 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20  aData[8+i*4]);. 
2dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2dd30 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29   iPage<=nearby )
2dd40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2dd50 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
2dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
2dd70 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2dd80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2dd90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
2dda0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2ddb0 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20   int dist;.     
2ddc0 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71         dist = sq
2ddd0 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65  lite3AbsInt32(ge
2dde0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
2ddf0 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20  ) - nearby);.   
2de00 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
2de10 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
2de20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
2de30 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e  2 = sqlite3AbsIn
2de40 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44  t32(get4byte(&aD
2de50 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
2de60 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20  arby);.         
2de70 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74       if( d2<dist
2de80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2de90 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
2dea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2deb0 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20   dist = d2;.    
2dec0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ded0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dee0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2def0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
2df00 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
2df10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
2df20 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
2df30 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
2df40 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *4]);.        te
2df50 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
2df60 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
2df70 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67   if( iPage>mxPag
2df80 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
2df90 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2dfa0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2dfb0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2dfc0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2dfd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
2dfe0 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
2dff0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
2e000 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
2e010 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50  .         || (iP
2e020 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28  age==nearby || (
2e030 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20  iPage<nearby && 
2e040 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2e050 45 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a  E)) .        ){.
2e060 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f            int no
2e070 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20  Content;.       
2e080 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67     *pPgno = iPag
2e090 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  e;.          TRA
2e0a0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2e0b0 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
2e0c0 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
2e0d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e0e0 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
2e0f0 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
2e100 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
2e110 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
2e120 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
2e130 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
2e140 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2e150 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
2e160 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2e170 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
2e180 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2e190 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2e1a0 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20  if( closest<k-1 
2e1b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
2e1c0 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63  emcpy(&aData[8+c
2e1d0 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74  losest*4], &aDat
2e1e0 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20  a[4+k*4], 4);.  
2e1f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e200 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44      put4byte(&aD
2e210 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
2e220 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e          noConten
2e230 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73  t = !btreeGetHas
2e240 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50  Content(pBt, *pP
2e250 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54 5f  gno)? PAGER_GET_
2e260 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20  NOCONTENT : 0;. 
2e270 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
2e280 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2e290 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
2e2a0 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  noContent);.    
2e2b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2e2c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e2d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2e2e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
2e2f0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
2e300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2e310 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e330 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
2e340 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2e350 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e360 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  }.          sear
2e370 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
2e380 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2e390 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2e3a0 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
2e3b0 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
2e3c0 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73  0;.    }while( s
2e3d0 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d  earchList );.  }
2e3e0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
2e3f0 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20  re are no pages 
2e400 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  on the freelist,
2e410 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77   so append a new
2e420 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20   page to the.   
2e430 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61   ** database ima
2e440 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ge..    **.    *
2e450 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20  * Normally, new 
2e460 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  pages allocated 
2e470 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61  by this block ca
2e480 6e 20 62 65 20 72 65 71 75 65 73 74 65 64 20 66  n be requested f
2e490 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  rom the.    ** p
2e4a0 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
2e4b0 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
2e4c0 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20   flag set. This 
2e4d0 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67  prevents the pag
2e4e0 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  er.    ** from t
2e4f0 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68  rying to read th
2e500 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20  e pages content 
2e510 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76  from disk. Howev
2e520 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a  er, if the.    *
2e530 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  * current transa
2e540 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
2e550 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72  y run one or mor
2e560 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  e incremental-va
2e570 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70  cuum.    ** step
2e580 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  s, then the page
2e590 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f   we are about to
2e5a0 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f   allocate may co
2e5b0 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20  ntain content.  
2e5c0 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71    ** that is req
2e5d0 75 69 72 65 64 20 69 6e 20 74 68 65 20 65 76 65  uired in the eve
2e5e0 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  nt of a rollback
2e5f0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
2e600 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65  do.    ** not se
2e610 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74  t the no-content
2e620 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73   flag. This caus
2e630 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
2e640 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  load and journal
2e650 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72  .    ** the curr
2e660 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
2e670 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74   before overwrit
2e680 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20  ing it..    **. 
2e690 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
2e6a0 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e  the pager will n
2e6b0 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65  ot actually atte
2e6c0 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a  mpt to load or j
2e6d0 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63  ournal .    ** c
2e6e0 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70  ontent for any p
2e6f0 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20  age that really 
2e700 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74 68  does lie past th
2e710 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
2e720 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
2e730 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68  e on disk. So th
2e740 65 20 65 66 66 65 63 74 73 20 6f 66 20 64 69 73  e effects of dis
2e750 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f  abling the no-co
2e760 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69  ntent optimizati
2e770 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61  on.    ** here a
2e780 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74  re confined to t
2e790 68 6f 73 65 20 70 61 67 65 73 20 74 68 61 74 20  hose pages that 
2e7a0 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  lie between the 
2e7b0 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  end of the.    *
2e7c0 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
2e7d0 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20   and the end of 
2e7e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e7f0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  e..    */.    in
2e800 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  t bNoContent = (
2e810 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  0==IfNotOmitAV(p
2e820 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29  Bt->bDoTruncate)
2e830 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  )? PAGER_GET_NOC
2e840 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72  ONTENT:0;..    r
2e850 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2e860 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
2e870 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
2e880 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2e890 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50   rc;.    pBt->nP
2e8a0 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  age++;.    if( p
2e8b0 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
2e8c0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2e8d0 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b  ) ) pBt->nPage++
2e8e0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
2e8f0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2e900 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
2e910 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
2e920 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
2e930 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20  pBt->nPage) ){. 
2e940 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
2e950 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
2e960 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
2e970 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
2e980 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
2e990 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
2e9a0 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
2e9b0 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
2e9c0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
2e9d0 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
2e9e0 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
2e9f0 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
2ea00 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
2ea10 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
2ea20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
2ea30 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  e *pPg = 0;.    
2ea40 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2ea50 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
2ea60 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
2ea70 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70  -map page)\n", p
2ea80 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20  Bt->nPage));.   
2ea90 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
2eaa0 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42  nPage!=PENDING_B
2eab0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
2eac0 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
2ead0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 42  eGetPage(pBt, pB
2eae0 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20  t->nPage, &pPg, 
2eaf0 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
2eb00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2eb10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2eb20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2eb30 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
2eb40 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
2eb50 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
2eb60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2eb70 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2eb80 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
2eb90 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ge++;.      if( 
2eba0 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
2ebb0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2ebc0 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65  t) ){ pBt->nPage
2ebd0 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
2ebe0 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  if.    put4byte(
2ebf0 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70  28 + (u8*)pBt->p
2ec00 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42  Page1->aData, pB
2ec10 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a  t->nPage);.    *
2ec20 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61  pPgno = pBt->nPa
2ec30 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ge;..    assert(
2ec40 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
2ec50 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2ec60 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
2ec70 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
2ec80 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e  Pgno, ppPage, bN
2ec90 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  oContent);.    i
2eca0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2ecb0 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
2ecc0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
2ecd0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
2ece0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2ecf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ed00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
2ed10 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
2ed20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2ed30 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
2ed40 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67  of file\n", *pPg
2ed50 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  no));.  }..  ass
2ed60 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
2ed70 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2ed80 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f  Bt) );..end_allo
2ed90 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c  cate_page:.  rel
2eda0 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
2edb0 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
2edc0 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69  pPrevTrunk);.  i
2edd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ede0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
2edf0 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
2ee00 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
2ee10 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20  pDbPage)>1 ){.  
2ee20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2ee30 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
2ee40 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
2ee50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ee60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2ee70 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67     }.    (*ppPag
2ee80 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  e)->isInit = 0;.
2ee90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
2eea0 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
2eeb0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
2eec0 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33  TE_OK || sqlite3
2eed0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2eee0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
2eef0 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  age) );.  return
2ef00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2ef10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
2ef20 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20  sed to add page 
2ef30 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  iPage to the dat
2ef40 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d  abase file free-
2ef50 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20  list. .** It is 
2ef60 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
2ef70 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
2ef80 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74  eady a part of t
2ef90 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
2efa0 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61  .** The value pa
2efb0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2efc0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
2efd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2efe0 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20  optional..** If 
2eff0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65  the caller happe
2f000 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69  ns to have a poi
2f010 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
2f020 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  age object .** c
2f030 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
2f040 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79  page iPage handy
2f050 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74  , it may pass it
2f060 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76   as the second v
2f070 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  alue. .** Otherw
2f080 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ise, it may pass
2f090 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
2f0a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d  a pointer to a M
2f0b0 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73  emPage object is
2f0c0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
2f0d0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
2f0e0 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  ** its reference
2f0f0 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c   count is not al
2f100 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
2f110 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
2f120 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28  c int freePage2(
2f130 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d  BtShared *pBt, M
2f140 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65  emPage *pMemPage
2f150 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20  , Pgno iPage){. 
2f160 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
2f170 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2f180 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73       /* Free-lis
2f190 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  t trunk page */.
2f1a0 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20    Pgno iTrunk = 
2f1b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2f1c0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
2f1d0 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73  mber of free-lis
2f1e0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20  t trunk page */ 
2f1f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2f200 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
2f210 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
2f220 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
2f230 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  e 1 */.  MemPage
2f240 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
2f250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f260 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  Page being freed
2f270 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a  . May be NULL. *
2f280 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
2f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2f2b0 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
2f2c0 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
2f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2e0 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
2f2f0 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72  r of pages on fr
2f300 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
2f310 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2f320 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2f330 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2f340 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61  ( iPage>1 );.  a
2f350 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65  ssert( !pMemPage
2f360 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67   || pMemPage->pg
2f370 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20  no==iPage );..  
2f380 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a  if( pMemPage ){.
2f390 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d      pPage = pMem
2f3a0 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Page;.    sqlite
2f3b0 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d  3PagerRef(pPage-
2f3c0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c  >pDbPage);.  }el
2f3d0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  se{.    pPage = 
2f3e0 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
2f3f0 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d  pBt, iPage);.  }
2f400 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
2f410 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63   the free page c
2f420 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a  ount on pPage1 *
2f430 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
2f440 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2f450 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
2f460 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
2f470 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72  epage_out;.  nFr
2f480 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
2f490 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
2f4a0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
2f4b0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
2f4c0 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69  , nFree+1);..  i
2f4d0 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
2f4e0 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
2f4f0 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49  LETE ){.    /* I
2f500 66 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  f the secure_del
2f510 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e  ete option is en
2f520 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20  abled, then.    
2f530 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20  ** always fully 
2f540 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  overwrite delete
2f550 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
2f560 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f  th zeros..    */
2f570 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65  .    if( (!pPage
2f580 20 26 26 20 28 28 72 63 20 3d 20 62 74 72 65 65   && ((rc = btree
2f590 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
2f5a0 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21  ge, &pPage, 0))!
2f5b0 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20  =0) ).     ||   
2f5c0 20 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20           ((rc = 
2f5d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2f5e0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2f5f0 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ))!=0).    ){.  
2f600 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
2f610 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
2f620 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61   memset(pPage->a
2f630 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e  Data, 0, pPage->
2f640 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
2f650 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2f660 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
2f670 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
2f680 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  write an entry i
2f690 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
2f6a0 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  p.  ** to indica
2f6b0 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
2f6c0 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20   is free..  */. 
2f6d0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2f6e0 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50  M ){.    ptrmapP
2f6f0 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50  ut(pBt, iPage, P
2f700 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
2f710 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  0, &rc);.    if(
2f720 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
2f730 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  age_out;.  }..  
2f740 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74  /* Now manipulat
2f750 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74  e the actual dat
2f760 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20  abase free-list 
2f770 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72 65  structure. There
2f780 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f   are two.  ** po
2f790 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20  ssibilities. If 
2f7a0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
2f7b0 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79   currently empty
2f7c0 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73  , or if the firs
2f7d0 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67  t.  ** trunk pag
2f7e0 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
2f7f0 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e  st is full, then
2f800 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20   this page will 
2f810 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65  become a.  ** ne
2f820 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  w free-list trun
2f830 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73  k page. Otherwis
2f840 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d  e, it will becom
2f850 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a  e a leaf of the.
2f860 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
2f870 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75 72   page in the cur
2f880 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20  rent free-list. 
2f890 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73  This block tests
2f8a0 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70   if it.  ** is p
2f8b0 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74  ossible to add t
2f8c0 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65 77  he page as a new
2f8d0 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e   free-list leaf.
2f8e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65  .  */.  if( nFre
2f8f0 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20  e!=0 ){.    u32 
2f900 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  nLeaf;          
2f910 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
2f920 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   number of leaf 
2f930 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70  cells on trunk p
2f940 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75  age */..    iTru
2f950 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
2f960 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2f970 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
2f980 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
2f990 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
2f9a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2f9b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f9c0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2f9d0 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
2f9e0 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65  nLeaf = get4byte
2f9f0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
2fa00 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4]);.    assert(
2fa10 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2fa20 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  >32 );.    if( n
2fa30 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d  Leaf > (u32)pBt-
2fa40 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
2fa50 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  2 ){.      rc = 
2fa60 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2fa70 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
2fa80 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2fa90 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61    }.    if( nLea
2faa0 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73  f < (u32)pBt->us
2fab0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29  ableSize/4 - 8 )
2fac0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68  {.      /* In th
2fad0 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
2fae0 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75   room on the tru
2faf0 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72  nk page to inser
2fb00 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  t the page.     
2fb10 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20   ** being freed 
2fb20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20  as a new leaf.. 
2fb30 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2fb40 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74   Note that the t
2fb50 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74  runk page is not
2fb60 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74   really full unt
2fb70 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20  il it contains. 
2fb80 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
2fb90 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73  ze/4 - 2 entries
2fba0 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65  , not usableSize
2fbb0 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61  /4 - 8 entries a
2fbc0 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20  s we have.      
2fbd0 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64  ** coded.  But d
2fbe0 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65  ue to a coding e
2fbf0 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73  rror in versions
2fc00 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
2fc10 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36   to.      ** 3.6
2fc20 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69  .0, databases wi
2fc30 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  th freelist trun
2fc40 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20  k pages holding 
2fc50 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20  more than.      
2fc60 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
2fc70 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c  - 8 entries will
2fc80 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20   be reported as 
2fc90 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64  corrupt.  In ord
2fca0 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  er.      ** to m
2fcb0 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64  aintain backward
2fcc0 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
2fcd0 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69  with older versi
2fce0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20  ons of SQLite,. 
2fcf0 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20       ** we will 
2fd00 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74  continue to rest
2fd10 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20  rict the number 
2fd20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73  of entries to us
2fd30 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20  ableSize/4 - 8. 
2fd40 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e       ** for now.
2fd50 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20    At some point 
2fd60 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f  in the future (o
2fd70 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73  nce everyone has
2fd80 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20   upgraded.      
2fd90 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c  ** to 3.6.0 or l
2fda0 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20  ater) we should 
2fdb0 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20  consider fixing 
2fdc0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  the conditional 
2fdd0 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74  above.      ** t
2fde0 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69  o read "usableSi
2fdf0 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20  ze/4-2" instead 
2fe00 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  of "usableSize/4
2fe10 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  -8"..      **.  
2fe20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
2fe30 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31 31 35 37  OF: R-19920-1157
2fe40 36 20 48 6f 77 65 76 65 72 2c 20 6e 65 77 65 72  6 However, newer
2fe50 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
2fe60 69 74 65 20 73 74 69 6c 6c 0a 20 20 20 20 20 20  ite still.      
2fe70 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e 67 20 74  ** avoid using t
2fe80 68 65 20 6c 61 73 74 20 73 69 78 20 65 6e 74 72  he last six entr
2fe90 69 65 73 20 69 6e 20 74 68 65 20 66 72 65 65 6c  ies in the freel
2fea0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 61  ist trunk page a
2feb0 72 72 61 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a  rray in.      **
2fec0 20 6f 72 64 65 72 20 74 68 61 74 20 64 61 74 61   order that data
2fed0 62 61 73 65 20 66 69 6c 65 73 20 63 72 65 61 74  base files creat
2fee0 65 64 20 62 79 20 6e 65 77 65 72 20 76 65 72 73  ed by newer vers
2fef0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63  ions of SQLite c
2ff00 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 72  an be.      ** r
2ff10 65 61 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72  ead by older ver
2ff20 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e  sions of SQLite.
2ff30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2ff40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2ff50 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
2ff60 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
2ff70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ff80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34   ){.        put4
2ff90 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
2ffa0 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29  ata[4], nLeaf+1)
2ffb0 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
2ffc0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
2ffd0 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50  a[8+nLeaf*4], iP
2ffe0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
2fff0 28 20 70 50 61 67 65 20 26 26 20 28 70 42 74 2d  ( pPage && (pBt-
30000 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
30010 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d  SECURE_DELETE)==
30020 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
30030 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
30040 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
30050 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
30060 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
30070 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeSetHasContent(
30080 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  pBt, iPage);.   
30090 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45     }.      TRACE
300a0 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
300b0 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70   leaf on trunk p
300c0 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d  age %d\n",pPage-
300d0 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67  >pgno,pTrunk->pg
300e0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  no));.      goto
300f0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
30100 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
30110 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20  f control flows 
30120 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
30130 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70  hen it was not p
30140 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74  ossible to add t
30150 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  he.  ** the page
30160 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
30170 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74  a leaf page of t
30180 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69  he first trunk i
30190 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
301a0 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62  .  ** Possibly b
301b0 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d  ecause the free-
301c0 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f  list is empty, o
301d0 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75  r possibly becau
301e0 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72  se the .  ** fir
301f0 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20  st trunk in the 
30200 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
30210 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74  l. Either way, t
30220 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
30230 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  eed.  ** will be
30240 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72  come the new fir
30250 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
30260 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
30270 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
30280 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  ==0 && SQLITE_OK
30290 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65 74  !=(rc = btreeGet
302a0 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
302b0 20 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a   &pPage, 0)) ){.
302c0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
302d0 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20  e_out;.  }.  rc 
302e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
302f0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
30300 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
30310 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30320 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
30330 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74  t;.  }.  put4byt
30340 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
30350 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62  iTrunk);.  put4b
30360 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
30370 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34  a[4], 0);.  put4
30380 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
30390 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b  ata[32], iPage);
303a0 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d  .  TRACE(("FREE-
303b0 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75  PAGE: %d new tru
303c0 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e  nk page replacin
303d0 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  g %d\n", pPage->
303e0 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a  pgno, iTrunk));.
303f0 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20  .freepage_out:. 
30400 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
30410 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
30420 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  = 0;.  }.  relea
30430 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
30440 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
30450 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unk);.  return r
30460 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  c;.}.static void
30470 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67   freePage(MemPag
30480 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70  e *pPage, int *p
30490 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43  RC){.  if( (*pRC
304a0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
304b0 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50      *pRC = freeP
304c0 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c  age2(pPage->pBt,
304d0 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70   pPage, pPage->p
304e0 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  gno);.  }.}../*.
304f0 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72  ** Free any over
30500 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63  flow pages assoc
30510 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
30520 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57 72 69 74  iven Cell.  Writ
30530 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43  e the.** local C
30540 65 6c 6c 20 73 69 7a 65 20 28 74 68 65 20 6e 75  ell size (the nu
30550 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 6e  mber of bytes on
30560 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
30570 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20  ge, omitting.** 
30580 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74 6f 20 2a  overflow) into *
30590 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  pnSize..*/.stati
305a0 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28  c int clearCell(
305b0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
305c0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
305d0 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
305e0 74 61 69 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a  tains the Cell *
305f0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
30600 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20  r *pCell,    /* 
30610 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
30620 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 31 36 20  e Cell */.  u16 
30630 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
30640 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
30650 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 43 65  e size of the Ce
30660 6c 6c 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ll here */.){.  
30670 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
30680 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65  pPage->pBt;.  Ce
30690 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50  llInfo info;.  P
306a0 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20  gno ovflPgno;.  
306b0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f  int rc;.  int nO
306c0 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50  vfl;.  u32 ovflP
306d0 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65  ageSize;..  asse
306e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
306f0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
30700 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 62  t->mutex) );.  b
30710 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
30720 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
30730 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53 69 7a 65  info);.  *pnSize
30740 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
30750 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
30760 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  low==0 ){.    re
30770 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
30780 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20   /* No overflow 
30790 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69  pages. Return wi
307a0 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
307b0 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  hing */.  }.  if
307c0 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76  ( pCell+info.iOv
307d0 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65  erflow+3 > pPage
307e0 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d  ->aData+pPage->m
307f0 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72  askPage ){.    r
30800 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
30810 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43  RUPT_BKPT;  /* C
30820 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74  ell extends past
30830 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a   end of page */.
30840 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d    }.  ovflPgno =
30850 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
30860 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
30870 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
30880 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34  ->usableSize > 4
30890 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69   );.  ovflPageSi
308a0 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
308b0 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66  Size - 4;.  nOvf
308c0 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f  l = (info.nPaylo
308d0 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ad - info.nLocal
308e0 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20   + ovflPageSize 
308f0 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a  - 1)/ovflPageSiz
30900 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66  e;.  assert( ovf
30910 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66  lPgno==0 || nOvf
30920 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  l>0 );.  while( 
30930 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50  nOvfl-- ){.    P
30940 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20  gno iNext = 0;. 
30950 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
30960 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f  l = 0;.    if( o
30970 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66  vflPgno<2 || ovf
30980 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63  lPgno>btreePagec
30990 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
309a0 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61     /* 0 is not a
309b0 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
309c0 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61  er and page 1 ca
309d0 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20  nnot be an .    
309e0 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
309f0 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66  ge. Therefore if
30a00 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70   ovflPgno<2 or p
30a10 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
30a20 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  he .      ** fil
30a30 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  e the database m
30a40 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
30a50 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
30a60 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
30a70 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
30a80 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( nOvfl ){.    
30a90 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
30aa0 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  owPage(pBt, ovfl
30ab0 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69  Pgno, &pOvfl, &i
30ac0 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Next);.      if(
30ad0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
30ae0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
30af0 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76  ( pOvfl || ((pOv
30b00 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  fl = btreePageLo
30b10 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67  okup(pBt, ovflPg
30b20 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20  no))!=0) ).     
30b30 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  && sqlite3PagerP
30b40 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66  ageRefcount(pOvf
30b50 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20  l->pDbPage)!=1. 
30b60 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54     ){.      /* T
30b70 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f  here is no reaso
30b80 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f  n any cursor sho
30b90 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73  uld have an outs
30ba0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
30bb0 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  e .      ** to a
30bc0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
30bd0 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63  belonging to a c
30be0 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e  ell that is bein
30bf0 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65  g deleted/update
30c00 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69  d..      ** So i
30c10 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d  f there exists m
30c20 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66  ore than one ref
30c30 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70  erence to this p
30c40 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20  age, then it .  
30c50 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20      ** must not 
30c60 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65  really be an ove
30c70 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74  rflow page and t
30c80 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
30c90 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20   be corrupt. .  
30ca0 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c      ** It is hel
30cb0 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74  pful to detect t
30cc0 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  his before calli
30cd0 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20  ng freePage2(), 
30ce0 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65  as .      ** fre
30cf0 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72  ePage2() may zer
30d00 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  o the page conte
30d10 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65  nts if secure-de
30d20 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20  lete mode is.   
30d30 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49     ** enabled. I
30d40 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77  f this 'overflow
30d50 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74  ' page happens t
30d60 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74  o be a page that
30d70 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
30d80 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e  ller is iteratin
30d90 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69  g through or usi
30da0 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ng in some other
30db0 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20   way, this.     
30dc0 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c   ** can be probl
30dd0 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f  ematic..      */
30de0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
30df0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
30e00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30e10 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32    rc = freePage2
30e20 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66  (pBt, pOvfl, ovf
30e30 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  lPgno);.    }.. 
30e40 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a     if( pOvfl ){.
30e50 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
30e60 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70  erUnref(pOvfl->p
30e70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  DbPage);.    }. 
30e80 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
30e90 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50  rn rc;.    ovflP
30ea0 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d  gno = iNext;.  }
30eb0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
30ec0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
30ed0 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
30ee0 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
30ef0 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
30f00 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
30f10 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
30f20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
30f30 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
30f40 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
30f50 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
30f60 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
30f70 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
30f80 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
30f90 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
30fa0 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
30fb0 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
30fc0 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
30fd0 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
30fe0 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
30ff0 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
31000 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
31010 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
31020 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
31030 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
31040 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
31050 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
31060 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
31070 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
31080 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
31090 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
310a0 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f  then copied into
310b0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
310c0 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   later..*/.stati
310d0 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c  c int fillInCell
310e0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
310f0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
31100 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
31110 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
31120 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   cell */.  unsig
31130 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
31140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
31150 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
31160 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73  e cell */.  cons
31170 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
31180 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
31190 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  e key */.  const
311a0 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74   void *pData,int
311b0 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65   nData,   /* The
311c0 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
311d0 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
311e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
311f0 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f  ra zero bytes to
31200 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61   append to pData
31210 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
31220 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
31230 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
31240 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
31250 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
31260 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
31270 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
31280 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
31290 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
312a0 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
312b0 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
312c0 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
312d0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
312e0 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
312f0 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
31300 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
31310 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
31320 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
31330 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
31340 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
31350 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
31360 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
31370 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20   );..  /* pPage 
31380 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
31390 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e  ly writeable sin
313a0 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62  ce pCell might b
313b0 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
313c0 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68   buffer space th
313d0 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66  at is separate f
313e0 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75  rom the pPage bu
313f0 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61  ffer area */.  a
31400 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61  ssert( pCell<pPa
31410 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65  ge->aData || pCe
31420 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ll>=&pPage->aDat
31430 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
31440 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
31450 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
31460 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
31470 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
31480 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61   Fill in the hea
31490 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65  der. */.  nHeade
314a0 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  r = pPage->child
314b0 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c  PtrSize;.  nPayl
314c0 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
314d0 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
314e0 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a  ->intKeyLeaf ){.
314f0 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70      nHeader += p
31500 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  utVarint32(&pCel
31510 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79  l[nHeader], nPay
31520 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  load);.  }else{.
31530 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 61 74      assert( nDat
31540 61 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  a==0 );.    asse
31550 72 74 28 20 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a  rt( nZero==0 );.
31560 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d    }.  nHeader +=
31570 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
31580 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36  l[nHeader], *(u6
31590 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 0a 20 20  4*)&nKey);.  .  
315a0 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
315b0 61 79 6c 6f 61 64 20 73 69 7a 65 20 2a 2f 0a 20  ayload size */. 
315c0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
315d0 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d  ey ){.    pSrc =
315e0 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63   pData;.    nSrc
315f0 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44   = nData;.    nD
31600 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ata = 0;.  }else
31610 7b 20 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  { .    if( NEVER
31620 28 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66  (nKey>0x7fffffff
31630 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a   || pKey==0) ){.
31640 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
31650 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
31660 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79  ;.    }.    nPay
31670 6c 6f 61 64 20 3d 20 28 69 6e 74 29 6e 4b 65 79  load = (int)nKey
31680 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65  ;.    pSrc = pKe
31690 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69  y;.    nSrc = (i
316a0 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69  nt)nKey;.  }.  i
316b0 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
316c0 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
316d0 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72 20      n = nHeader 
316e0 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  + nPayload;.    
316f0 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20 29  testcase( n==3 )
31700 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
31710 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20  n==4 );.    if( 
31720 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20  n<4 ) n = 4;.   
31730 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20   *pnSize = n;.  
31740 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 50    spaceLeft = nP
31750 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50 72 69  ayload;.    pPri
31760 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65  or = pCell;.  }e
31770 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20  lse{.    int mn 
31780 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
31790 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20  l;.    n = mn + 
317a0 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20  (nPayload - mn) 
317b0 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  % (pPage->pBt->u
317c0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
317d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
317e0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
317f0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
31800 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ( n==pPage->maxL
31810 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
31820 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78  ( n > pPage->max
31830 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a  Local ) n = mn;.
31840 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
31850 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d  n;.    *pnSize =
31860 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20 34   n + nHeader + 4
31870 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 26  ;.    pPrior = &
31880 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d  pCell[nHeader+n]
31890 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64  ;.  }.  pPayload
318a0 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
318b0 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  r];..  /* At thi
318c0 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65  s point variable
318d0 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20  s should be set 
318e0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
318f0 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64  .  **   nPayload
31900 20 20 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c             Total
31910 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e   payload size in
31920 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50   bytes.  **   pP
31930 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20  ayload          
31940 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70   Begin writing p
31950 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a  ayload here.  **
31960 20 20 20 73 70 61 63 65 4c 65 66 74 20 20 20 20     spaceLeft    
31970 20 20 20 20 20 20 53 70 61 63 65 20 61 76 61 69        Space avai
31980 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61  lable at pPayloa
31990 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e  d.  If nPayload>
319a0 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20  spaceLeft,.  ** 
319b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319c0 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20       that means 
319d0 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69  content must spi
319e0 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ll into overflow
319f0 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a   pages..  **   *
31a00 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
31a10 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f    Size of the lo
31a20 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f  cal cell (not co
31a30 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20  unting overflow 
31a40 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50  pages).  **   pP
31a50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  rior            
31a60 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
31a70 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20  the pgno of the 
31a80 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
31a90 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73  age.  **.  ** Us
31aa0 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  e a call to btre
31ab0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
31ac0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
31ad0 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a  he values above.
31ae0 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74    ** were comput
31af0 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ed correctly..  
31b00 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  */.#if SQLITE_DE
31b10 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c  BUG.  {.    Cell
31b20 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 62  Info info;.    b
31b30 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
31b40 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
31b50 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
31b60 74 28 20 6e 48 65 61 64 65 72 3d 28 69 6e 74 29  t( nHeader=(int)
31b70 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d  (info.pPayload -
31b80 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61   pCell) );.    a
31b90 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79  ssert( info.nKey
31ba0 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61 73  ==nKey );.    as
31bb0 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d  sert( *pnSize ==
31bc0 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20   info.nSize );. 
31bd0 20 20 20 61 73 73 65 72 74 28 20 73 70 61 63 65     assert( space
31be0 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f  Left == info.nLo
31bf0 63 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  cal );.    asser
31c00 74 28 20 70 50 72 69 6f 72 20 3d 3d 20 26 70 43  t( pPrior == &pC
31c10 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
31c20 6f 77 5d 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ow] );.  }.#endi
31c30 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  f..  /* Write th
31c40 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74  e payload into t
31c50 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e  he local Cell an
31c60 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e 74 6f  d any extra into
31c70 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
31c80 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79  */.  while( nPay
31c90 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66  load>0 ){.    if
31ca0 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29  ( spaceLeft==0 )
31cb0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
31cc0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
31cd0 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  .      Pgno pgno
31ce0 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66  Ptrmap = pgnoOvf
31cf0 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70  l; /* Overflow p
31d00 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  age pointer-map 
31d10 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  entry page */.  
31d20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
31d30 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
31d40 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20     do{.         
31d50 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20   pgnoOvfl++;.   
31d60 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20       } while( . 
31d70 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f           PTRMAP_
31d80 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f  ISPAGE(pBt, pgno
31d90 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66  Ovfl) || pgnoOvf
31da0 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  l==PENDING_BYTE_
31db0 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20  PAGE(pBt) .     
31dc0 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65     );.      }.#e
31dd0 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20  ndif.      rc = 
31de0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
31df0 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26  e(pBt, &pOvfl, &
31e00 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76  pgnoOvfl, pgnoOv
31e10 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20  fl, 0);.#ifndef 
31e20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
31e30 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
31e40 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
31e50 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
31e60 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65  cuum, and the se
31e70 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65  cond or subseque
31e80 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  nt.      ** over
31e90 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69  flow page is bei
31ea0 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64  ng allocated, ad
31eb0 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  d an entry to th
31ec0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
31ed0 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20      ** for that 
31ee0 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20  page now. .     
31ef0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
31f00 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
31f10 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  t overflow page,
31f20 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61   then write a pa
31f30 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20  rtial entry .   
31f40 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69     ** to the poi
31f50 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20  nter-map. If we 
31f60 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f  write nothing to
31f70 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61   this pointer-ma
31f80 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a  p slot,.      **
31f90 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69   then the optimi
31fa0 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68  stic overflow ch
31fb0 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69  ain processing i
31fc0 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20  n clearCell().  
31fd0 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e      ** may misin
31fe0 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e  terpret the unin
31ff0 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73  itialized values
32000 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a   and delete the.
32010 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70        ** wrong p
32020 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61  ages from the da
32030 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f  tabase..      */
32040 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
32050 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63  autoVacuum && rc
32060 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32070 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20         u8 eType 
32080 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54  = (pgnoPtrmap?PT
32090 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50  RMAP_OVERFLOW2:P
320a0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29  TRMAP_OVERFLOW1)
320b0 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
320c0 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  Put(pBt, pgnoOvf
320d0 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74  l, eType, pgnoPt
320e0 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20  rmap, &rc);.    
320f0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
32100 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
32110 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20  age(pOvfl);.    
32120 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
32130 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72  ndif.      if( r
32140 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  c ){.        rel
32150 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
32160 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ase);.        re
32170 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
32180 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54  ..      /* If pT
32190 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
321a0 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72  zero than pPrior
321b0 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65   points into the
321c0 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 20   data area.     
321d0 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
321e0 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
321f0 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
32200 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
32210 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
32220 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
32230 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
32240 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
32250 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
32260 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69        /* If pPri
32270 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  or is part of th
32280 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
32290 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
322a0 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 20  sure pPage.     
322b0 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69   ** is still wri
322c0 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  teable */.      
322d0 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70  assert( pPrior<p
322e0 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
322f0 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61  Prior>=&pPage->a
32300 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
32310 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
32320 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
32330 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
32340 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
32350 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
32360 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b  rior, pgnoOvfl);
32370 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
32380 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
32390 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65        pToRelease
323a0 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20   = pOvfl;.      
323b0 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e  pPrior = pOvfl->
323c0 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74  aData;.      put
323d0 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29  4byte(pPrior, 0)
323e0 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64  ;.      pPayload
323f0 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61   = &pOvfl->aData
32400 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65  [4];.      space
32410 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62  Left = pBt->usab
32420 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20  leSize - 4;.    
32430 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f  }.    n = nPaylo
32440 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70  ad;.    if( n>sp
32450 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70  aceLeft ) n = sp
32460 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a  aceLeft;..    /*
32470 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
32480 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
32490 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20  pPayload points 
324a0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72  into the data ar
324b0 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  ea.    ** of pTo
324c0 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
324d0 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
324e0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
324f0 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
32500 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
32510 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
32520 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
32530 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
32540 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50  );..    /* If pP
32550 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f  ayload is part o
32560 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
32570 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
32580 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
32590 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
325a0 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
325b0 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64  assert( pPayload
325c0 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
325d0 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67   pPayload>=&pPag
325e0 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
325f0 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
32600 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
32610 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
32620 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
32630 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e  ;..    if( nSrc>
32640 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
32650 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63  >nSrc ) n = nSrc
32660 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
32670 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65  pSrc );.      me
32680 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
32690 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  Src, n);.    }el
326a0 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
326b0 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29  (pPayload, 0, n)
326c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79  ;.    }.    nPay
326d0 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70  load -= n;.    p
326e0 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20  Payload += n;.  
326f0 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20    pSrc += n;.   
32700 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20   nSrc -= n;.    
32710 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a  spaceLeft -= n;.
32720 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20      if( nSrc==0 
32730 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20  ){.      nSrc = 
32740 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72  nData;.      pSr
32750 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d  c = pData;.    }
32760 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
32770 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
32780 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32790 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  OK;.}../*.** Rem
327a0 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c  ove the i-th cel
327b0 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54  l from pPage.  T
327c0 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65  his routine effe
327d0 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a  cts pPage only..
327e0 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** The cell cont
327f0 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64  ent is not freed
32800 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e   or deallocated.
32810 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
32820 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c  that.** the cell
32830 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65   content has bee
32840 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61  n copied somepla
32850 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72  ce else.  This r
32860 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72  outine just.** r
32870 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72  emoves the refer
32880 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c  ence to the cell
32890 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a   from pPage..**.
328a0 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20  ** "sz" must be 
328b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
328c0 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e  tes in the cell.
328d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
328e0 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65  dropCell(MemPage
328f0 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78   *pPage, int idx
32900 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70  , int sz, int *p
32910 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20  RC){.  u32 pc;  
32920 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
32930 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   to cell content
32940 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64   of cell being d
32950 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a  eleted */.  u8 *
32960 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70  data;       /* p
32970 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
32980 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
32990 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65   /* Used to move
329a0 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69   bytes around wi
329b0 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  thin data[] */. 
329c0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
329d0 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
329e0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ode */.  int hdr
329f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;        /* Begi
32a00 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61  nning of the hea
32a10 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67  der.  0 most pag
32a20 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20  es.  100 page 1 
32a30 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
32a40 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
32a50 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64  rt( idx>=0 && id
32a60 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
32a70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  ;.  assert( sz==
32a80 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  cellSize(pPage, 
32a90 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  idx) );.  assert
32aa0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
32ab0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
32ac0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
32ad0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
32ae0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
32af0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
32b00 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
32b10 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26  aData;.  ptr = &
32b20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b  pPage->aCellIdx[
32b30 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67  2*idx];.  pc = g
32b40 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20  et2byte(ptr);.  
32b50 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
32b60 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61  Offset;.  testca
32b70 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65  se( pc==get2byte
32b80 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
32b90 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
32ba0 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d  +sz==pPage->pBt-
32bb0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
32bc0 20 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67   if( pc < (u32)g
32bd0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
32be0 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e  r+5]) || pc+sz >
32bf0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
32c00 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a  bleSize ){.    *
32c10 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
32c20 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
32c30 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
32c40 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67  = freeSpace(pPag
32c50 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66  e, pc, sz);.  if
32c60 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43  ( rc ){.    *pRC
32c70 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
32c80 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  n;.  }.  pPage->
32c90 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70  nCell--;.  if( p
32ca0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
32cb0 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
32cc0 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29  ta[hdr+1], 0, 4)
32cd0 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37  ;.    data[hdr+7
32ce0 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32 62  ] = 0;.    put2b
32cf0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
32d00 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  , pPage->pBt->us
32d10 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 70  ableSize);.    p
32d20 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
32d30 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
32d40 53 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68 64  Size - pPage->hd
32d50 72 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20 20  rOffset.        
32d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
32d70 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
32d80 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73  Size - 8;.  }els
32d90 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  e{.    memmove(p
32da0 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50  tr, ptr+2, 2*(pP
32db0 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78  age->nCell - idx
32dc0 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  ));.    put2byte
32dd0 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70  (&data[hdr+3], p
32de0 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
32df0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
32e00 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 2;.  }.}../*.*
32e10 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63  * Insert a new c
32e20 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20  ell on pPage at 
32e30 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20  cell index "i". 
32e40 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   pCell points to
32e50 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
32e60 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a  of the cell..**.
32e70 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  ** If the cell c
32e80 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20  ontent will fit 
32e90 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  on the page, the
32ea0 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20  n put it there. 
32eb0 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e   If it.** will n
32ec0 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b  ot fit, then mak
32ed0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
32ee0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74  cell content int
32ef0 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54  o pTemp if.** pT
32f00 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e  emp is not null.
32f10 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20    Regardless of 
32f20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20  pTemp, allocate 
32f30 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69  a new entry.** i
32f40 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  n pPage->apOvfl[
32f50 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
32f60 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
32f70 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
32f80 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
32f90 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
32fa0 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
32fb0 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
32fc0 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
32fd0 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
32fe0 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
32ff0 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
33000 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
33010 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a  incremented..*/.
33020 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65  static void inse
33030 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  rtCell(.  MemPag
33040 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50  e *pPage,   /* P
33050 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  age into which w
33060 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f  e are copying */
33070 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20  .  int i,       
33080 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
33090 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74   becomes the i-t
330a0 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61  h cell of the pa
330b0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ge */.  u8 *pCel
330c0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  l,        /* Con
330d0 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20  tent of the new 
330e0 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  cell */.  int sz
330f0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
33100 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ytes of content 
33110 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  in pCell */.  u8
33120 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20   *pTemp,        
33130 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
33140 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c  space for pCell,
33150 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
33160 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20  Pgno iChild,    
33170 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
33180 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20  , replace first 
33190 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69  4 bytes with thi
331a0 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  s value */.  int
331b0 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f   *pRC          /
331c0 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65  * Read and write
331d0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   return code fro
331e0 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  m here */.){.  i
331f0 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20  nt idx = 0;     
33200 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
33210 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74  te new cell cont
33220 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ent in data[] */
33230 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
33240 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
33250 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e  nter */.  int en
33260 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d;          /* F
33270 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
33280 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69  he last cell poi
33290 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
332a0 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20  /.  int ins;    
332b0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
332c0 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e  n data[] where n
332d0 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  ew cell pointer 
332e0 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20  is inserted */. 
332f0 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
33300 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
33310 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
33320 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
33330 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
33340 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74       /* The cont
33350 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65  ent of the whole
33360 20 70 61 67 65 20 2a 2f 0a 0a 20 20 69 66 28 20   page */..  if( 
33370 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
33380 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
33390 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  & i<=pPage->nCel
333a0 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  l+pPage->nOverfl
333b0 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow );.  assert( 
333c0 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
333d0 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20  Bt)<=10921 );.  
333e0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
333f0 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50  Cell<=MX_CELL(pP
33400 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52  age->pBt) || COR
33410 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
33420 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
33430 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65  rflow<=ArraySize
33440 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20  (pPage->apOvfl) 
33450 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72  );.  assert( Arr
33460 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70  aySize(pPage->ap
33470 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65  Ovfl)==ArraySize
33480 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20  (pPage->aiOvfl) 
33490 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
334a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
334b0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
334c0 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63  x) );.  /* The c
334d0 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  ell should norma
334e0 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72  lly be sized cor
334f0 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72  rectly.  However
33500 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a  , when moving a.
33510 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63    ** malformed c
33520 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20  ell from a leaf 
33530 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72  page to an inter
33540 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65  ior page, if the
33550 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20   cell size.  ** 
33560 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73  wanted to be les
33570 73 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74  s than 4 but got
33580 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34   rounded up to 4
33590 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68   on the leaf, th
335a0 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67  en size.  ** mig
335b0 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ht be less than 
335c0 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70  8 (leaf-size + p
335d0 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69  ointer) on the i
335e0 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48  nterior node.  H
335f0 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65  ence.  ** the te
33600 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20  rm after the || 
33610 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
33620 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20   assert(). */.  
33630 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
33640 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
33650 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20  Cell) || (sz==8 
33660 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a  && iChild>0) );.
33670 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
33680 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
33690 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
336a0 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
336b0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
336c0 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a  mp, pCell, sz);.
336d0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
336e0 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  emp;.    }.    i
336f0 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
33700 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
33710 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  l, iChild);.    
33720 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d  }.    j = pPage-
33730 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20  >nOverflow++;.  
33740 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74    assert( j<(int
33750 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )(sizeof(pPage->
33760 61 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70  apOvfl)/sizeof(p
33770 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29  Page->apOvfl[0])
33780 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
33790 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c  apOvfl[j] = pCel
337a0 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69  l;.    pPage->ai
337b0 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69  Ovfl[j] = (u16)i
337c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
337d0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
337e0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
337f0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
33800 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33810 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
33820 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
33830 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  n;.    }.    ass
33840 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
33850 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
33860 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
33870 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
33880 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c  ->aData;.    cel
33890 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
338a0 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20  >cellOffset;.   
338b0 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65   end = cellOffse
338c0 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
338d0 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65  ll;.    ins = ce
338e0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a  llOffset + 2*i;.
338f0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
33900 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
33910 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28  , &idx);.    if(
33920 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63   rc ){ *pRC = rc
33930 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20  ; return; }.    
33940 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53  /* The allocateS
33950 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67  pace() routine g
33960 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f  uarantees the fo
33970 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70  llowing two prop
33980 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66  erties.    ** if
33990 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63   it returns succ
339a0 65 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ess */.    asser
339b0 74 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20  t( idx >= end+2 
339c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
339d0 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50  dx+sz <= (int)pP
339e0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
339f0 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67  Size );.    pPag
33a00 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20  e->nCell++;.    
33a10 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
33a20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20  (u16)(2 + sz);. 
33a30 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
33a40 69 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a 29  idx], pCell, sz)
33a50 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  ;.    if( iChild
33a60 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
33a70 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69  te(&data[idx], i
33a80 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
33a90 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b    memmove(&data[
33aa0 69 6e 73 2b 32 5d 2c 20 26 64 61 74 61 5b 69 6e  ins+2], &data[in
33ab0 73 5d 2c 20 65 6e 64 2d 69 6e 73 29 3b 0a 20 20  s], end-ins);.  
33ac0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
33ad0 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20  [ins], idx);.   
33ae0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
33af0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
33b00 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
33b10 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
33b20 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
33b30 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
33b40 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
33b50 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  m ){.      /* Th
33b60 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61  e cell may conta
33b70 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
33b80 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
33b90 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20  . If so, write. 
33ba0 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72       ** the entr
33bb0 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
33bc0 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ow page into the
33bd0 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20   pointer map..  
33be0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72      */.      ptr
33bf0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
33c00 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29  age, pCell, pRC)
33c10 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
33c20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61   }.}../*.** Arra
33c30 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61  y apCell[] conta
33c40 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
33c50 6e 43 65 6c 6c 20 62 2d 74 72 65 65 20 70 61 67  nCell b-tree pag
33c60 65 20 63 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a  e cells. The .**
33c70 20 73 7a 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20   szCell[] array 
33c80 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a  contains the siz
33c90 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61  e in bytes of ea
33ca0 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75  ch cell. This fu
33cb0 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63  nction.** replac
33cc0 65 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  es the current c
33cd0 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20  ontents of page 
33ce0 70 50 67 20 77 69 74 68 20 74 68 65 20 63 6f 6e  pPg with the con
33cf0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 65 6c  tents of the cel
33d00 6c 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  l.** array..**.*
33d10 2a 20 53 6f 6d 65 20 6f 66 20 74 68 65 20 63 65  * Some of the ce
33d20 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
33d30 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65  may currently be
33d40 20 73 74 6f 72 65 64 20 69 6e 20 70 50 67 2e 20   stored in pPg. 
33d50 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
33d60 20 77 6f 72 6b 73 20 61 72 6f 75 6e 64 20 70 72   works around pr
33d70 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79  oblems caused by
33d80 20 74 68 69 73 20 62 79 20 6d 61 6b 69 6e 67 20   this by making 
33d90 61 20 63 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a  a copy of any .*
33da0 2a 20 73 75 63 68 20 63 65 6c 6c 73 20 62 65 66  * such cells bef
33db0 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20  ore overwriting 
33dc0 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
33dd0 2a 0a 2a 2a 20 54 68 65 20 4d 65 6d 50 61 67 65  *.** The MemPage
33de0 2e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20  .nFree field is 
33df0 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20 74  invalidated by t
33e00 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74  his function. It
33e10 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
33e20 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
33e30 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20  e caller to set 
33e40 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  it correctly..*/
33e50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 62  .static void reb
33e60 75 69 6c 64 50 61 67 65 28 0a 20 20 4d 65 6d 50  uildPage(.  MemP
33e70 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20  age *pPg,       
33e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
33e90 64 69 74 20 74 68 69 73 20 70 61 67 65 20 2a 2f  dit this page */
33ea0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
33eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ec0 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62     /* Final numb
33ed0 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70  er of cells on p
33ee0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
33ef0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
33f00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
33f10 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  y of cells */.  
33f20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20  u16 *szCell     
33f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f40 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c  /* Array of cell
33f50 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63   sizes */.){.  c
33f60 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
33f70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  Pg->hdrOffset;  
33f80 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
33f90 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70  t of header on p
33fa0 50 67 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  Pg */.  u8 * con
33fb0 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e  st aData = pPg->
33fc0 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
33fd0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
33fe0 61 74 61 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20  ata for pPg */. 
33ff0 20 63 6f 6e 73 74 20 69 6e 74 20 75 73 61 62 6c   const int usabl
34000 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74  eSize = pPg->pBt
34010 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
34020 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20  u8 * const pEnd 
34030 3d 20 26 61 44 61 74 61 5b 75 73 61 62 6c 65 53  = &aData[usableS
34040 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ize];.  int i;. 
34050 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20   u8 *pCellptr = 
34060 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20  pPg->aCellIdx;. 
34070 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69   u8 *pTmp = sqli
34080 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
34090 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67  e(pPg->pBt->pPag
340a0 65 72 29 3b 0a 20 20 75 38 20 2a 70 44 61 74 61  er);.  u8 *pData
340b0 3b 0a 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74  ;..  i = get2byt
340c0 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29  e(&aData[hdr+5])
340d0 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 54 6d 70  ;.  memcpy(&pTmp
340e0 5b 69 5d 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20  [i], &aData[i], 
340f0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b  usableSize - i);
34100 0a 0a 20 20 70 44 61 74 61 20 3d 20 70 45 6e 64  ..  pData = pEnd
34110 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
34120 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
34130 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65  u8 *pCell = apCe
34140 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  ll[i];.    if( p
34150 43 65 6c 6c 3e 61 44 61 74 61 20 26 26 20 70 43  Cell>aData && pC
34160 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20  ell<pEnd ){.    
34170 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b    pCell = &pTmp[
34180 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a  pCell - aData];.
34190 20 20 20 20 7d 0a 20 20 20 20 70 44 61 74 61 20      }.    pData 
341a0 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20  -= szCell[i];.  
341b0 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20    memcpy(pData, 
341c0 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d  pCell, szCell[i]
341d0 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
341e0 70 43 65 6c 6c 70 74 72 2c 20 28 70 44 61 74 61  pCellptr, (pData
341f0 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20   - aData));.    
34200 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20  pCellptr += 2;. 
34210 20 20 20 61 73 73 65 72 74 28 20 73 7a 43 65 6c     assert( szCel
34220 6c 5b 69 5d 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  l[i]==cellSizePt
34230 72 28 70 50 67 2c 20 70 43 65 6c 6c 29 20 29 3b  r(pPg, pCell) );
34240 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70  .  }..  /* The p
34250 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 20  Pg->nFree field 
34260 69 73 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72  is now set incor
34270 72 65 63 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c  rectly. The call
34280 65 72 20 77 69 6c 6c 20 66 69 78 20 69 74 2e 20  er will fix it. 
34290 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20  */.  pPg->nCell 
342a0 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e  = nCell;.  pPg->
342b0 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a  nOverflow = 0;..
342c0 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
342d0 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20  a[hdr+1], 0);.  
342e0 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
342f0 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65  hdr+3], pPg->nCe
34300 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  ll);.  put2byte(
34310 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  &aData[hdr+5], p
34320 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b 0a 20  Data - aData);. 
34330 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20   aData[hdr+7] = 
34340 30 78 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  0x00;.}../*.** A
34350 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f  rray apCell[] co
34360 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69  ntains nCell poi
34370 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20  nters to b-tree 
34380 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43  cells. Array szC
34390 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  ell.** contains 
343a0 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  the size in byte
343b0 73 20 6f 66 20 65 61 63 68 20 73 75 63 68 20 63  s of each such c
343c0 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
343d0 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 0a  on attempts to .
343e0 2a 2a 20 61 64 64 20 74 68 65 20 63 65 6c 6c 73  ** add the cells
343f0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
34400 72 72 61 79 20 74 6f 20 70 61 67 65 20 70 50 67  rray to page pPg
34410 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f 74 20 28  . If it cannot (
34420 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20  because .** the 
34430 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
34440 20 64 65 66 72 61 67 6d 65 6e 74 65 64 20 62 65   defragmented be
34450 66 6f 72 65 20 74 68 65 20 63 65 6c 6c 73 20 77  fore the cells w
34460 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65  ill fit), non-ze
34470 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  ro.** is returne
34480 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
34490 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65 20 61   the cells are a
344a0 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  dded successfull
344b0 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a 20 72 65  y, zero is.** re
344c0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72  turned..**.** Ar
344d0 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70 74 72 20  gument pCellptr 
344e0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
344f0 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
34500 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
34510 72 61 79 0a 2a 2a 20 28 70 61 72 74 20 6f 66 20  ray.** (part of 
34520 70 61 67 65 20 70 50 67 29 20 74 6f 20 70 6f 70  page pPg) to pop
34530 75 6c 61 74 65 2e 20 41 66 74 65 72 20 63 65 6c  ulate. After cel
34540 6c 20 61 70 43 65 6c 6c 5b 30 5d 20 69 73 20 77  l apCell[0] is w
34550 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a  ritten to the.**
34560 20 70 61 67 65 20 62 6f 64 79 2c 20 61 20 31 36   page body, a 16
34570 2d 62 69 74 20 6f 66 66 73 65 74 20 69 73 20 77  -bit offset is w
34580 72 69 74 74 65 6e 20 74 6f 20 70 43 65 6c 6c 70  ritten to pCellp
34590 74 72 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c 20 66  tr. And so on, f
345a0 6f 72 20 65 61 63 68 0a 2a 2a 20 63 65 6c 6c 20  or each.** cell 
345b0 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 49 74  in the array. It
345c0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
345d0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
345e0 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 0a 2a  ller to ensure.*
345f0 2a 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66  * that it is saf
34600 65 20 74 6f 20 6f 76 65 72 77 72 69 74 65 20 74  e to overwrite t
34610 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20  his part of the 
34620 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72  cell-pointer arr
34630 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  ay..**.** When t
34640 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
34650 63 61 6c 6c 65 64 2c 20 2a 70 70 44 61 74 61 20  called, *ppData 
34660 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74  points to the st
34670 61 72 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63  art of the .** c
34680 6f 6e 74 65 6e 74 20 61 72 65 61 20 6f 6e 20 70  ontent area on p
34690 61 67 65 20 70 50 67 2e 20 49 66 20 74 68 65 20  age pPg. If the 
346a0 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f 6e 74  size of the cont
346b0 65 6e 74 20 61 72 65 61 20 69 73 20 65 78 74 65  ent area is exte
346c0 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70 44 61 74 61  nded,.** *ppData
346d0 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 70   is updated to p
346e0 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
346f0 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6e  start of the con
34700 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20 62 65 66  tent area.** bef
34710 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
34720 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 61 72  *.** Finally, ar
34730 67 75 6d 65 6e 74 20 70 42 65 67 69 6e 20 70 6f  gument pBegin po
34740 69 6e 74 73 20 74 6f 20 74 68 65 20 62 79 74 65  ints to the byte
34750 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
34760 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a 20 65 6e  lowing the.** en
34770 64 20 6f 66 20 74 68 65 20 73 70 61 63 65 20 72  d of the space r
34780 65 71 75 69 72 65 64 20 62 79 20 74 68 69 73 20  equired by this 
34790 70 61 67 65 20 66 6f 72 20 74 68 65 20 63 65 6c  page for the cel
347a0 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20 28  l-pointer area (
347b0 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c 73  for.** all cells
347c0 20 2d 20 6e 6f 74 20 6a 75 73 74 20 74 68 6f 73   - not just thos
347d0 65 20 69 6e 73 65 72 74 65 64 20 62 79 20 74 68  e inserted by th
347e0 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 29 2e  e current call).
347f0 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a   If the content.
34800 2a 2a 20 61 72 65 61 20 6d 75 73 74 20 62 65 20  ** area must be 
34810 65 78 74 65 6e 64 65 64 20 74 6f 20 62 65 66 6f  extended to befo
34820 72 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  re this point in
34830 20 6f 72 64 65 72 20 74 6f 20 61 63 63 6f 6d 6f   order to accomo
34840 64 61 74 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c  date all.** cell
34850 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20 74  s in apCell[], t
34860 68 65 6e 20 74 68 65 20 63 65 6c 6c 73 20 64 6f  hen the cells do
34870 20 6e 6f 74 20 66 69 74 20 61 6e 64 20 6e 6f 6e   not fit and non
34880 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
34890 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
348a0 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61 79   pageInsertArray
348b0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67  (.  MemPage *pPg
348c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
348d0 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 61      /* Page to a
348e0 64 64 20 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a 20  dd cells to */. 
348f0 20 75 38 20 2a 70 42 65 67 69 6e 2c 20 20 20 20   u8 *pBegin,    
34900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34910 20 2f 2a 20 45 6e 64 20 6f 66 20 63 65 6c 6c 2d   /* End of cell-
34920 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
34930 0a 20 20 75 38 20 2a 2a 70 70 44 61 74 61 2c 20  .  u8 **ppData, 
34940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34950 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 61     /* IN/OUT: Pa
34960 67 65 20 63 6f 6e 74 65 6e 74 20 2d 61 72 65 61  ge content -area
34970 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38   pointer */.  u8
34980 20 2a 70 43 65 6c 6c 70 74 72 2c 20 20 20 20 20   *pCellptr,     
34990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
349a0 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c   Pointer to cell
349b0 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20 2a 2f  -pointer area */
349c0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
349d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
349e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
349f0 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20  cells to add to 
34a00 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  pPg */.  u8 **ap
34a10 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
34a20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
34a30 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  y of cells */.  
34a40 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20  u16 *szCell     
34a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a60 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c  /* Array of cell
34a70 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 69   sizes */.){.  i
34a80 6e 74 20 69 3b 0a 20 20 75 38 20 2a 61 44 61 74  nt i;.  u8 *aDat
34a90 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
34aa0 20 20 75 38 20 2a 70 44 61 74 61 20 3d 20 2a 70    u8 *pData = *p
34ab0 70 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20 69  pData;.  const i
34ac0 6e 74 20 62 46 72 65 65 6c 69 73 74 20 3d 20 61  nt bFreelist = a
34ad0 44 61 74 61 5b 31 5d 20 7c 7c 20 61 44 61 74 61  Data[1] || aData
34ae0 5b 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 43  [2];.  assert( C
34af0 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 70 50 67  ORRUPT_DB || pPg
34b00 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  ->hdrOffset==0 )
34b10 3b 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61  ;    /* Never ca
34b20 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 20 2a  lled on page 1 *
34b30 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
34b40 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
34b50 69 6e 74 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b  int sz = szCell[
34b60 69 5d 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  i];.    int rc;.
34b70 20 20 20 20 75 38 20 2a 70 53 6c 6f 74 3b 0a 20      u8 *pSlot;. 
34b80 20 20 20 69 66 28 20 62 46 72 65 65 6c 69 73 74     if( bFreelist
34b90 3d 3d 30 20 7c 7c 20 28 70 53 6c 6f 74 20 3d 20  ==0 || (pSlot = 
34ba0 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 67  pageFindSlot(pPg
34bb0 2c 20 73 7a 2c 20 26 72 63 2c 20 30 29 29 3d 3d  , sz, &rc, 0))==
34bc0 30 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74 61  0 ){.      pData
34bd0 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 20 20 69 66   -= sz;.      if
34be0 28 20 70 44 61 74 61 3c 70 42 65 67 69 6e 20 29  ( pData<pBegin )
34bf0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
34c00 20 70 53 6c 6f 74 20 3d 20 70 44 61 74 61 3b 0a   pSlot = pData;.
34c10 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
34c20 28 70 53 6c 6f 74 2c 20 61 70 43 65 6c 6c 5b 69  (pSlot, apCell[i
34c30 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 70 75 74 32  ], sz);.    put2
34c40 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28  byte(pCellptr, (
34c50 70 53 6c 6f 74 20 2d 20 61 44 61 74 61 29 29 3b  pSlot - aData));
34c60 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d  .    pCellptr +=
34c70 20 32 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 61 74   2;.  }.  *ppDat
34c80 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 72 65 74  a = pData;.  ret
34c90 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
34ca0 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63  Array apCell[] c
34cb0 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f  ontains nCell po
34cc0 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65  inters to b-tree
34cd0 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a   cells. Array sz
34ce0 43 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  Cell .** contain
34cf0 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79  s the size in by
34d00 74 65 73 20 6f 66 20 65 61 63 68 20 73 75 63 68  tes of each such
34d10 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   cell. This func
34d20 74 69 6f 6e 20 61 64 64 73 20 74 68 65 0a 2a 2a  tion adds the.**
34d30 20 73 70 61 63 65 20 61 73 73 6f 63 69 61 74 65   space associate
34d40 64 20 77 69 74 68 20 65 61 63 68 20 63 65 6c 6c  d with each cell
34d50 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 74 68   in the array th
34d60 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  at is currently 
34d70 73 74 6f 72 65 64 20 0a 2a 2a 20 77 69 74 68 69  stored .** withi
34d80 6e 20 74 68 65 20 62 6f 64 79 20 6f 66 20 70 50  n the body of pP
34d90 67 20 74 6f 20 74 68 65 20 70 50 67 20 66 72 65  g to the pPg fre
34da0 65 2d 6c 69 73 74 2e 20 54 68 65 20 63 65 6c 6c  e-list. The cell
34db0 2d 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 6f 74  -pointers and ot
34dc0 68 65 72 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66  her.** fields of
34dd0 20 74 68 65 20 70 61 67 65 20 61 72 65 20 6e 6f   the page are no
34de0 74 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  t updated..**.**
34df0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
34e00 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c  eturns the total
34e10 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
34e20 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
34e30 65 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ee-list..*/.stat
34e40 69 63 20 69 6e 74 20 70 61 67 65 46 72 65 65 41  ic int pageFreeA
34e50 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20  rray(.  MemPage 
34e60 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20  *pPg,           
34e70 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
34e80 74 6f 20 65 64 69 74 20 2a 2f 0a 20 20 69 6e 74  to edit */.  int
34e90 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   nCell,         
34ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34eb0 43 65 6c 6c 73 20 74 6f 20 64 65 6c 65 74 65 20  Cells to delete 
34ec0 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
34ed0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
34ee0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
34ef0 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20   cells */.  u16 
34f00 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20  *szCell         
34f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
34f20 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a  rray of cell siz
34f30 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20  es */.){.  u8 * 
34f40 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
34f50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a  g->aData;.  u8 *
34f60 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61   const pEnd = &a
34f70 44 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75  Data[pPg->pBt->u
34f80 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 75 38  sableSize];.  u8
34f90 20 2a 20 63 6f 6e 73 74 20 70 53 74 61 72 74 20   * const pStart 
34fa0 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 68 64  = &aData[pPg->hd
34fb0 72 4f 66 66 73 65 74 20 2b 20 38 20 2b 20 70 50  rOffset + 8 + pP
34fc0 67 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  g->childPtrSize]
34fd0 3b 0a 20 20 69 6e 74 20 6e 52 65 74 20 3d 20 30  ;.  int nRet = 0
34fe0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20  ;.  int i;.  u8 
34ff0 2a 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 69 6e  *pFree = 0;.  in
35000 74 20 73 7a 46 72 65 65 20 3d 20 30 3b 0a 0a 20  t szFree = 0;.. 
35010 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
35020 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
35030 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b  *pCell = apCell[
35040 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 65 6c  i];.    if( pCel
35050 6c 3e 3d 70 53 74 61 72 74 20 26 26 20 70 43 65  l>=pStart && pCe
35060 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  ll<pEnd ){.     
35070 20 69 6e 74 20 73 7a 20 3d 20 73 7a 43 65 6c 6c   int sz = szCell
35080 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
35090 46 72 65 65 21 3d 28 70 43 65 6c 6c 20 2b 20 73  Free!=(pCell + s
350a0 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  z) ){.        if
350b0 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20  ( pFree ){.     
350c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
350d0 65 65 3e 61 44 61 74 61 20 26 26 20 28 70 46 72  ee>aData && (pFr
350e0 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33  ee - aData)<6553
350f0 36 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  6 );.          f
35100 72 65 65 53 70 61 63 65 28 70 50 67 2c 20 28 75  reeSpace(pPg, (u
35110 31 36 29 28 70 46 72 65 65 20 2d 20 61 44 61 74  16)(pFree - aDat
35120 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20 20  a), szFree);.   
35130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
35140 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Free = pCell;.  
35150 20 20 20 20 20 20 73 7a 46 72 65 65 20 3d 20 73        szFree = s
35160 7a 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  z;.        if( p
35170 46 72 65 65 2b 73 7a 3e 70 45 6e 64 20 29 20 72  Free+sz>pEnd ) r
35180 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
35190 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
351a0 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  ree = pCell;.   
351b0 20 20 20 20 20 73 7a 46 72 65 65 20 2b 3d 20 73       szFree += s
351c0 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  z;.      }.     
351d0 20 6e 52 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20   nRet++;.    }. 
351e0 20 7d 0a 20 20 69 66 28 20 70 46 72 65 65 20 29   }.  if( pFree )
351f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
35200 72 65 65 3e 61 44 61 74 61 20 26 26 20 28 70 46  ree>aData && (pF
35210 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35  ree - aData)<655
35220 33 36 20 29 3b 0a 20 20 20 20 66 72 65 65 53 70  36 );.    freeSp
35230 61 63 65 28 70 50 67 2c 20 28 75 31 36 29 28 70  ace(pPg, (u16)(p
35240 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c 20 73  Free - aData), s
35250 7a 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  zFree);.  }.  re
35260 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn nRet;.}../*
35270 0a 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64  .** apCell[] and
35280 20 73 7a 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69   szCell[] contai
35290 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ns pointers to a
352a0 6e 64 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20  nd sizes of all 
352b0 63 65 6c 6c 73 20 69 6e 20 74 68 65 0a 2a 2a 20  cells in the.** 
352c0 70 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61  pages being bala
352d0 6e 63 65 64 2e 20 20 54 68 65 20 63 75 72 72 65  nced.  The curre
352e0 6e 74 20 70 61 67 65 2c 20 70 50 67 2c 20 68 61  nt page, pPg, ha
352f0 73 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 63 65 6c  s pPg->nCell cel
35300 6c 73 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77  ls starting.** w
35310 69 74 68 20 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d  ith apCell[iOld]
35320 2e 20 20 41 66 74 65 72 20 62 61 6c 61 6e 63 69  .  After balanci
35330 6e 67 2c 20 74 68 69 73 20 70 61 67 65 20 73 68  ng, this page sh
35340 6f 75 6c 64 20 68 6f 6c 64 20 6e 4e 65 77 20 63  ould hold nNew c
35350 65 6c 6c 73 0a 2a 2a 20 73 74 61 72 74 69 6e 67  ells.** starting
35360 20 61 74 20 61 70 43 65 6c 6c 5b 69 4e 65 77 5d   at apCell[iNew]
35370 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
35380 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65 20 6e  tine makes the n
35390 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d  ecessary adjustm
353a0 65 6e 74 73 20 74 6f 20 70 50 67 20 73 6f 20 74  ents to pPg so t
353b0 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  hat it contains.
353c0 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 63  ** the correct c
353d0 65 6c 6c 73 20 61 66 74 65 72 20 62 65 69 6e 67  ells after being
353e0 20 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a   balanced..**.**
353f0 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65 65 20   The pPg->nFree 
35400 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64  field is invalid
35410 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
35420 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 74 20  ion returns. It 
35430 69 73 20 74 68 65 0a 2a 2a 20 72 65 73 70 6f 6e  is the.** respon
35440 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
35450 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74  caller to set it
35460 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73   correctly..*/.s
35470 74 61 74 69 63 20 76 6f 69 64 20 65 64 69 74 50  tatic void editP
35480 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age(.  MemPage *
35490 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  pPg,            
354a0 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74         /* Edit t
354b0 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  his page */.  in
354c0 74 20 69 4f 6c 64 2c 20 20 20 20 20 20 20 20 20  t iOld,         
354d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
354e0 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
354f0 63 65 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f  cell currently o
35500 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  n page */.  int 
35510 69 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20 20  iNew,           
35520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
35530 6e 64 65 78 20 6f 66 20 6e 65 77 20 66 69 72 73  ndex of new firs
35540 74 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 2a  t cell on page *
35550 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20 20 20  /.  int nNew,   
35560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35570 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d      /* Final num
35580 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
35590 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
355a0 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
355b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
355c0 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20  ay of cells */. 
355d0 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20   u16 *szCell    
355e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
355f0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
35600 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20  l sizes */.){.  
35610 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61  u8 * const aData
35620 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20   = pPg->aData;. 
35630 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
35640 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
35650 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 20 3d 20  .  u8 *pBegin = 
35660 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e  &pPg->aCellIdx[n
35670 4e 65 77 20 2a 20 32 5d 3b 0a 20 20 69 6e 74 20  New * 2];.  int 
35680 6e 43 65 6c 6c 20 3d 20 70 50 67 2d 3e 6e 43 65  nCell = pPg->nCe
35690 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 65 6c  ll;       /* Cel
356a0 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 70 50 67  ls stored on pPg
356b0 20 2a 2f 0a 20 20 75 38 20 2a 70 44 61 74 61 3b   */.  u8 *pData;
356c0 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b  .  u8 *pCellptr;
356d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
356e0 69 4f 6c 64 45 6e 64 20 3d 20 69 4f 6c 64 20 2b  iOldEnd = iOld +
356f0 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 2b 20 70 50   pPg->nCell + pP
35700 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  g->nOverflow;.  
35710 69 6e 74 20 69 4e 65 77 45 6e 64 20 3d 20 69 4e  int iNewEnd = iN
35720 65 77 20 2b 20 6e 4e 65 77 3b 0a 0a 23 69 66 64  ew + nNew;..#ifd
35730 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
35740 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c    u8 *pTmp = sql
35750 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
35760 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61  ce(pPg->pBt->pPa
35770 67 65 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  ger);.  memcpy(p
35780 54 6d 70 2c 20 61 44 61 74 61 2c 20 70 50 67 2d  Tmp, aData, pPg-
35790 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
357a0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
357b0 52 65 6d 6f 76 65 20 63 65 6c 6c 73 20 66 72 6f  Remove cells fro
357c0 6d 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20  m the start and 
357d0 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20  end of the page 
357e0 2a 2f 0a 20 20 69 66 28 20 69 4f 6c 64 3c 69 4e  */.  if( iOld<iN
357f0 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ew ){.    int nS
35800 68 69 66 74 20 3d 20 70 61 67 65 46 72 65 65 41  hift = pageFreeA
35810 72 72 61 79 28 0a 20 20 20 20 20 20 20 20 70 50  rray(.        pP
35820 67 2c 20 69 4e 65 77 2d 69 4f 6c 64 2c 20 26 61  g, iNew-iOld, &a
35830 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2c 20 26 73 7a  pCell[iOld], &sz
35840 43 65 6c 6c 5b 69 4f 6c 64 5d 0a 20 20 20 20 29  Cell[iOld].    )
35850 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 50  ;.    memmove(pP
35860 67 2d 3e 61 43 65 6c 6c 49 64 78 2c 20 26 70 50  g->aCellIdx, &pP
35870 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 53 68 69  g->aCellIdx[nShi
35880 66 74 2a 32 5d 2c 20 6e 43 65 6c 6c 2a 32 29 3b  ft*2], nCell*2);
35890 0a 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20 6e 53  .    nCell -= nS
358a0 68 69 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  hift;.  }.  if( 
358b0 69 4e 65 77 45 6e 64 20 3c 20 69 4f 6c 64 45 6e  iNewEnd < iOldEn
358c0 64 20 29 7b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d  d ){.    nCell -
358d0 3d 20 70 61 67 65 46 72 65 65 41 72 72 61 79 28  = pageFreeArray(
358e0 0a 20 20 20 20 20 20 20 20 70 50 67 2c 20 69 4f  .        pPg, iO
358f0 6c 64 45 6e 64 2d 69 4e 65 77 45 6e 64 2c 20 26  ldEnd-iNewEnd, &
35900 61 70 43 65 6c 6c 5b 69 4e 65 77 45 6e 64 5d 2c  apCell[iNewEnd],
35910 20 26 73 7a 43 65 6c 6c 5b 69 4e 65 77 45 6e 64   &szCell[iNewEnd
35920 5d 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  ].    );.  }..  
35930 70 44 61 74 61 20 3d 20 26 61 44 61 74 61 5b 67  pData = &aData[g
35940 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
35950 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 5d 3b 0a  aData[hdr+5])];.
35960 20 20 69 66 28 20 70 44 61 74 61 3c 70 42 65 67    if( pData<pBeg
35970 69 6e 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61  in ) goto editpa
35980 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 41  ge_fail;..  /* A
35990 64 64 20 63 65 6c 6c 73 20 74 6f 20 74 68 65 20  dd cells to the 
359a0 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67  start of the pag
359b0 65 20 2a 2f 0a 20 20 69 66 28 20 69 4e 65 77 3c  e */.  if( iNew<
359c0 69 4f 6c 64 20 29 7b 0a 20 20 20 20 69 6e 74 20  iOld ){.    int 
359d0 6e 41 64 64 20 3d 20 4d 49 4e 28 6e 4e 65 77 2c  nAdd = MIN(nNew,
359e0 69 4f 6c 64 2d 69 4e 65 77 29 3b 0a 20 20 20 20  iOld-iNew);.    
359f0 61 73 73 65 72 74 28 20 28 69 4f 6c 64 2d 69 4e  assert( (iOld-iN
35a00 65 77 29 3c 6e 4e 65 77 20 7c 7c 20 6e 43 65 6c  ew)<nNew || nCel
35a10 6c 3d 3d 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f  l==0 || CORRUPT_
35a20 44 42 20 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70  DB );.    pCellp
35a30 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49  tr = pPg->aCellI
35a40 64 78 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  dx;.    memmove(
35a50 26 70 43 65 6c 6c 70 74 72 5b 6e 41 64 64 2a 32  &pCellptr[nAdd*2
35a60 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20 6e 43 65  ], pCellptr, nCe
35a70 6c 6c 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 70  ll*2);.    if( p
35a80 61 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a  ageInsertArray(.
35a90 20 20 20 20 20 20 20 20 20 20 70 50 67 2c 20 70            pPg, p
35aa0 42 65 67 69 6e 2c 20 26 70 44 61 74 61 2c 20 70  Begin, &pData, p
35ab0 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20 20  Cellptr,.       
35ac0 20 20 20 6e 41 64 64 2c 20 26 61 70 43 65 6c 6c     nAdd, &apCell
35ad0 5b 69 4e 65 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b  [iNew], &szCell[
35ae0 69 4e 65 77 5d 0a 20 20 20 20 29 20 29 20 67 6f  iNew].    ) ) go
35af0 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c  to editpage_fail
35b00 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2b 3d 20 6e  ;.    nCell += n
35b10 41 64 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  Add;.  }..  /* A
35b20 64 64 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  dd any overflow 
35b30 63 65 6c 6c 73 20 2a 2f 0a 20 20 66 6f 72 28 69  cells */.  for(i
35b40 3d 30 3b 20 69 3c 70 50 67 2d 3e 6e 4f 76 65 72  =0; i<pPg->nOver
35b50 66 6c 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  flow; i++){.    
35b60 69 6e 74 20 69 43 65 6c 6c 20 3d 20 28 69 4f 6c  int iCell = (iOl
35b70 64 20 2b 20 70 50 67 2d 3e 61 69 4f 76 66 6c 5b  d + pPg->aiOvfl[
35b80 69 5d 29 20 2d 20 69 4e 65 77 3b 0a 20 20 20 20  i]) - iNew;.    
35b90 69 66 28 20 69 43 65 6c 6c 3e 3d 30 20 26 26 20  if( iCell>=0 && 
35ba0 69 43 65 6c 6c 3c 6e 4e 65 77 20 29 7b 0a 20 20  iCell<nNew ){.  
35bb0 20 20 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26      pCellptr = &
35bc0 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 69 43  pPg->aCellIdx[iC
35bd0 65 6c 6c 20 2a 20 32 5d 3b 0a 20 20 20 20 20 20  ell * 2];.      
35be0 6d 65 6d 6d 6f 76 65 28 26 70 43 65 6c 6c 70 74  memmove(&pCellpt
35bf0 72 5b 32 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20  r[2], pCellptr, 
35c00 28 6e 43 65 6c 6c 20 2d 20 69 43 65 6c 6c 29 20  (nCell - iCell) 
35c10 2a 20 32 29 3b 0a 20 20 20 20 20 20 6e 43 65 6c  * 2);.      nCel
35c20 6c 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  l++;.      if( p
35c30 61 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a  ageInsertArray(.
35c40 20 20 20 20 20 20 20 20 20 20 20 20 70 50 67 2c              pPg,
35c50 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74 61 2c   pBegin, &pData,
35c60 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20   pCellptr,.     
35c70 20 20 20 20 20 20 20 31 2c 20 26 61 70 43 65 6c         1, &apCel
35c80 6c 5b 69 43 65 6c 6c 20 2b 20 69 4e 65 77 5d 2c  l[iCell + iNew],
35c90 20 26 73 7a 43 65 6c 6c 5b 69 43 65 6c 6c 20 2b   &szCell[iCell +
35ca0 20 69 4e 65 77 5d 0a 20 20 20 20 20 20 29 20 29   iNew].      ) )
35cb0 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66   goto editpage_f
35cc0 61 69 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ail;.    }.  }..
35cd0 20 20 2f 2a 20 41 70 70 65 6e 64 20 63 65 6c 6c    /* Append cell
35ce0 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  s to the end of 
35cf0 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 70 43  the page */.  pC
35d00 65 6c 6c 70 74 72 20 3d 20 26 70 50 67 2d 3e 61  ellptr = &pPg->a
35d10 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d  CellIdx[nCell*2]
35d20 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e 73 65  ;.  if( pageInse
35d30 72 74 41 72 72 61 79 28 0a 20 20 20 20 20 20 20  rtArray(.       
35d40 20 70 50 67 2c 20 70 42 65 67 69 6e 2c 20 26 70   pPg, pBegin, &p
35d50 44 61 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a  Data, pCellptr,.
35d60 20 20 20 20 20 20 20 20 6e 4e 65 77 2d 6e 43 65          nNew-nCe
35d70 6c 6c 2c 20 26 61 70 43 65 6c 6c 5b 69 4e 65 77  ll, &apCell[iNew
35d80 2b 6e 43 65 6c 6c 5d 2c 20 26 73 7a 43 65 6c 6c  +nCell], &szCell
35d90 5b 69 4e 65 77 2b 6e 43 65 6c 6c 5d 0a 20 20 29  [iNew+nCell].  )
35da0 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65   ) goto editpage
35db0 5f 66 61 69 6c 3b 0a 0a 20 20 70 50 67 2d 3e 6e  _fail;..  pPg->n
35dc0 43 65 6c 6c 20 3d 20 6e 4e 65 77 3b 0a 20 20 70  Cell = nNew;.  p
35dd0 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  Pg->nOverflow = 
35de0 30 3b 0a 0a 20 20 70 75 74 32 62 79 74 65 28 26  0;..  put2byte(&
35df0 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  aData[hdr+3], pP
35e00 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74  g->nCell);.  put
35e10 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72  2byte(&aData[hdr
35e20 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20 61 44 61  +5], pData - aDa
35e30 74 61 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ta);..#ifdef SQL
35e40 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
35e50 69 3d 30 3b 20 69 3c 6e 4e 65 77 20 26 26 20 21  i=0; i<nNew && !
35e60 43 4f 52 52 55 50 54 5f 44 42 3b 20 69 2b 2b 29  CORRUPT_DB; i++)
35e70 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
35e80 3d 20 61 70 43 65 6c 6c 5b 69 2b 69 4e 65 77 5d  = apCell[i+iNew]
35e90 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d  ;.    int iOff =
35ea0 20 67 65 74 32 62 79 74 65 28 26 70 50 67 2d 3e   get2byte(&pPg->
35eb0 61 43 65 6c 6c 49 64 78 5b 69 2a 32 5d 29 3b 0a  aCellIdx[i*2]);.
35ec0 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 61      if( pCell>=a
35ed0 44 61 74 61 20 26 26 20 70 43 65 6c 6c 3c 26 61  Data && pCell<&a
35ee0 44 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75  Data[pPg->pBt->u
35ef0 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20  sableSize] ){.  
35f00 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d      pCell = &pTm
35f10 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d  p[pCell - aData]
35f20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
35f30 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 43  rt( 0==memcmp(pC
35f40 65 6c 6c 2c 20 26 61 44 61 74 61 5b 69 4f 66 66  ell, &aData[iOff
35f50 5d 2c 20 73 7a 43 65 6c 6c 5b 69 2b 69 4e 65 77  ], szCell[i+iNew
35f60 5d 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ]) );.  }.#endif
35f70 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 20 65 64 69  ..  return;. edi
35f80 74 70 61 67 65 5f 66 61 69 6c 3a 0a 20 20 2f 2a  tpage_fail:.  /*
35f90 20 55 6e 61 62 6c 65 20 74 6f 20 65 64 69 74 20   Unable to edit 
35fa0 74 68 69 73 20 70 61 67 65 2e 20 52 65 62 75 69  this page. Rebui
35fb0 6c 64 20 69 74 20 66 72 6f 6d 20 73 63 72 61 74  ld it from scrat
35fc0 63 68 20 69 6e 73 74 65 61 64 2e 20 2a 2f 0a 20  ch instead. */. 
35fd0 20 72 65 62 75 69 6c 64 50 61 67 65 28 70 50 67   rebuildPage(pPg
35fe0 2c 20 6e 4e 65 77 2c 20 26 61 70 43 65 6c 6c 5b  , nNew, &apCell[
35ff0 69 4e 65 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69  iNew], &szCell[i
36000 4e 65 77 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  New]);.}../*.** 
36010 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  The following pa
36020 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69  rameters determi
36030 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61  ne how many adja
36040 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69  cent pages get i
36050 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20  nvolved.** in a 
36060 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74  balancing operat
36070 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20  ion.  NN is the 
36080 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  number of neighb
36090 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
360a0 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  de.** of the pag
360b0 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  e that participa
360c0 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  te in the balanc
360d0 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
360e0 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74  NB is the.** tot
360f0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
36100 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70  es that particip
36110 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74  ate, including t
36120 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61  he target page a
36130 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f  nd.** NN neighbo
36140 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
36150 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e  e..**.** The min
36160 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e  imum value of NN
36170 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65   is 1 (of course
36180 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e  ).  Increasing N
36190 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f  N above 1.** (to
361a0 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61   2 or 3) gives a
361b0 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d   modest improvem
361c0 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e  ent in SELECT an
361d0 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d  d DELETE perform
361e0 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61  ance.** in excha
361f0 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72  nge for a larger
36200 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20   degradation in 
36210 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
36220 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a  E performance..*
36230 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e  * The value of N
36240 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76  N appears to giv
36250 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c  e the best resul
36260 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23  ts overall..*/.#
36270 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20  define NN 1     
36280 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
36290 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
362a0 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
362b0 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e   pPage */.#defin
362c0 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20  e NB (NN*2+1)   
362d0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65     /* Total page
362e0 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
362f0 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23  e balance */...#
36300 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
36310 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
36320 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69  /*.** This versi
36330 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20  on of balance() 
36340 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d  handles the comm
36350 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  on special case 
36360 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65  where.** a new e
36370 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e  ntry is being in
36380 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78  serted on the ex
36390 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20  treme right-end 
363a0 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20  of the.** tree, 
363b0 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  in other words, 
363c0 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74  when the new ent
363d0 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ry will become t
363e0 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e  he largest.** en
363f0 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e  try in the tree.
36400 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f  .**.** Instead o
36410 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c 61  f trying to bala
36420 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d  nce the 3 right-
36430 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c  most leaf pages,
36440 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e   just add.** a n
36450 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72  ew page to the r
36460 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61  ight-hand side a
36470 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e  nd put the one n
36480 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74  ew entry in.** t
36490 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20  hat page.  This 
364a0 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74  leaves the right
364b0 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65   side of the tre
364c0 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e  e somewhat.** un
364d0 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f  balanced.  But o
364e0 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20  dds are that we 
364f0 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e  will be insertin
36500 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a  g new entries.**
36510 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e   at the end soon
36520 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74   afterwards so t
36530 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20  he nearly empty 
36540 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c  page will quickl
36550 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f  y.** fill up.  O
36560 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a  n average..**.**
36570 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65   pPage is the le
36580 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73  af page which is
36590 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
365a0 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65  page in the tree
365b0 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20  ..** pParent is 
365c0 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61  its parent.  pPa
365d0 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73  ge must have a s
365e0 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65  ingle overflow e
365f0 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73  ntry.** which is
36600 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d   also the right-
36610 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68  most entry on th
36620 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e page..**.** Th
36630 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
36640 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  is used to store
36650 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f 70   a temporary cop
36660 79 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  y of the divider
36670 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77 69  .** cell that wi
36680 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 69  ll be inserted i
36690 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75 63  nto pParent. Suc
366a0 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  h a cell consist
366b0 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74 65  s of a 4.** byte
366c0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c   page number fol
366d0 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72 69 61  lowed by a varia
366e0 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble length integ
366f0 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  er. In other.** 
36700 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20 31  words, at most 1
36710 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20 74  3 bytes. Hence t
36720 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
36730 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c   must be at.** l
36740 65 61 73 74 20 31 33 20 62 79 74 65 73 20 69 6e  east 13 bytes in
36750 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
36760 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69   int balance_qui
36770 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  ck(MemPage *pPar
36780 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50  ent, MemPage *pP
36790 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65 29  age, u8 *pSpace)
367a0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63 6f  {.  BtShared *co
367b0 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67 65 2d  nst pBt = pPage-
367c0 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72  >pBt;    /* B-Tr
367d0 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee Database */. 
367e0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20   MemPage *pNew; 
367f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36800 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61        /* Newly a
36810 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
36820 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
36830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36840 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
36850 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f  n Code */.  Pgno
36860 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20   pgnoNew;       
36870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36880 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
36890 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73  of pNew */..  as
368a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
368b0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
368c0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
368d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
368e0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
368f0 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
36900 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
36910 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
36920 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  ==1 );..  /* Thi
36930 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  s error conditio
36940 6e 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20  n is now caught 
36950 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e  prior to reachin
36960 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
36970 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
36980 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20  Page->nCell==0) 
36990 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
369a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20  CORRUPT_BKPT;.. 
369b0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e   /* Allocate a n
369c0 65 77 20 70 61 67 65 2e 20 54 68 69 73 20 70 61  ew page. This pa
369d0 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ge will become t
369e0 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67  he right-sibling
369f0 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e   of .  ** pPage.
36a00 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74   Make the parent
36a10 20 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20   page writable, 
36a20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  so that the new 
36a30 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a  divider cell.  *
36a40 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65  * may be inserte
36a50 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73 65  d. If both these
36a60 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
36a70 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63  successful, proc
36a80 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  eed..  */.  rc =
36a90 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
36aa0 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
36ab0 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  pgnoNew, 0, 0);.
36ac0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
36ad0 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20  E_OK ){..    u8 
36ae0 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b  *pOut = &pSpace[
36af0 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  4];.    u8 *pCel
36b00 6c 20 3d 20 70 50 61 67 65 2d 3e 61 70 4f 76 66  l = pPage->apOvf
36b10 6c 5b 30 5d 3b 0a 20 20 20 20 75 31 36 20 73 7a  l[0];.    u16 sz
36b20 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Cell = cellSizeP
36b30 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
36b40 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b  ;.    u8 *pStop;
36b50 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ..    assert( sq
36b60 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
36b70 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50  eable(pNew->pDbP
36b80 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65  age) );.    asse
36b90 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
36ba0 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59  [0]==(PTF_INTKEY
36bb0 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  |PTF_LEAFDATA|PT
36bc0 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a  F_LEAF) );.    z
36bd0 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54  eroPage(pNew, PT
36be0 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
36bf0 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b  FDATA|PTF_LEAF);
36c00 0a 20 20 20 20 72 65 62 75 69 6c 64 50 61 67 65  .    rebuildPage
36c10 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c  (pNew, 1, &pCell
36c20 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20  , &szCell);.    
36c30 70 4e 65 77 2d 3e 6e 46 72 65 65 20 3d 20 70 42  pNew->nFree = pB
36c40 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
36c50 70 4e 65 77 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  pNew->cellOffset
36c60 20 2d 20 32 20 2d 20 73 7a 43 65 6c 6c 3b 0a 0a   - 2 - szCell;..
36c70 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
36c80 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
36c90 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74   database, updat
36ca0 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  e the pointer ma
36cb0 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e  p.    ** with en
36cc0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65  tries for the ne
36cd0 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20  w page, and any 
36ce0 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
36cf0 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e   .    ** cell on
36d00 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20   the page to an 
36d10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
36d20 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 73  f either of thes
36d30 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69  e.    ** operati
36d40 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72  ons fails, the r
36d50 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65  eturn code is se
36d60 74 2c 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65  t, but the conte
36d70 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nts.    ** of th
36d80 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 61 72  e parent page ar
36d90 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61  e still manipula
36da0 74 65 64 20 62 79 20 74 68 68 20 63 6f 64 65 20  ted by thh code 
36db0 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68  below..    ** Th
36dc0 61 74 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69  at is Ok, at thi
36dd0 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65  s point the pare
36de0 6e 74 20 70 61 67 65 20 69 73 20 67 75 61 72 61  nt page is guara
36df0 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  nteed to.    ** 
36e00 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
36e10 74 79 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e  ty. Returning an
36e20 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c   error code will
36e30 20 63 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20   cause a.    ** 
36e40 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e  rollback, undoin
36e50 67 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61  g any changes ma
36e60 64 65 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  de to the parent
36e70 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
36e80 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
36e90 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  UM ){.      ptrm
36ea0 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e  apPut(pBt, pgnoN
36eb0 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ew, PTRMAP_BTREE
36ec0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c  , pParent->pgno,
36ed0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
36ee0 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69   szCell>pNew->mi
36ef0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
36f00 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
36f10 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20  tr(pNew, pCell, 
36f20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &rc);.      }.  
36f30 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72    }.  .    /* Cr
36f40 65 61 74 65 20 61 20 64 69 76 69 64 65 72 20 63  eate a divider c
36f50 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e  ell to insert in
36f60 74 6f 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20  to pParent. The 
36f70 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20  divider cell.   
36f80 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   ** consists of 
36f90 61 20 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75  a 4-byte page nu
36fa0 6d 62 65 72 20 28 74 68 65 20 70 61 67 65 20 6e  mber (the page n
36fb0 75 6d 62 65 72 20 6f 66 20 70 50 61 67 65 29 20  umber of pPage) 
36fc0 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72  and.    ** a var
36fd0 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79  iable length key
36fe0 20 76 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75   value (which mu
36ff0 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 76  st be the same v
37000 61 6c 75 65 20 61 73 20 74 68 65 0a 20 20 20 20  alue as the.    
37010 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f  ** largest key o
37020 6e 20 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a  n pPage)..    **
37030 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20  .    ** To find 
37040 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
37050 76 61 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20  value on pPage, 
37060 66 69 72 73 74 20 66 69 6e 64 20 74 68 65 20 72  first find the r
37070 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a  ight-most .    *
37080 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e  * cell on pPage.
37090 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 66   The first two f
370a0 69 65 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65  ields of this ce
370b0 6c 6c 20 61 72 65 20 74 68 65 20 0a 20 20 20 20  ll are the .    
370c0 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68  ** record-length
370d0 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e   (a variable len
370e0 67 74 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d  gth integer at m
370f0 6f 73 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73  ost 32-bits in s
37100 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20  ize).    ** and 
37110 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61  the key value (a
37120 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
37130 20 69 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61   integer, may ha
37140 76 65 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20  ve any value).. 
37150 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20     ** The first 
37160 6f 66 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e  of the while(...
37170 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b  ) loops below sk
37180 69 70 73 20 6f 76 65 72 20 74 68 65 20 72 65 63  ips over the rec
37190 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a  ord-length.    *
371a0 2a 20 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63  * field. The sec
371b0 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  ond while(...) l
371c0 6f 6f 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b  oop copies the k
371d0 65 79 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  ey value from th
371e0 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e  e.    ** cell on
371f0 20 70 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20   pPage into the 
37200 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20  pSpace buffer.. 
37210 20 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20     */.    pCell 
37220 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
37230 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  , pPage->nCell-1
37240 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26  );.    pStop = &
37250 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68  pCell[9];.    wh
37260 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29  ile( (*(pCell++)
37270 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c  &0x80) && pCell<
37280 70 53 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74  pStop );.    pSt
37290 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a  op = &pCell[9];.
372a0 20 20 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70      while( ((*(p
372b0 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c  Out++) = *(pCell
372c0 2b 2b 29 29 26 30 78 38 30 29 20 26 26 20 70 43  ++))&0x80) && pC
372d0 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20  ell<pStop );..  
372e0 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
372f0 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
37300 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a   into pParent. *
37310 2f 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c  /.    insertCell
37320 28 70 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e  (pParent, pParen
37330 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65  t->nCell, pSpace
37340 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70  , (int)(pOut-pSp
37350 61 63 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ace),.          
37360 20 20 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70       0, pPage->p
37370 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  gno, &rc);..    
37380 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67 68 74  /* Set the right
37390 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f  -child pointer o
373a0 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69  f pParent to poi
373b0 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  nt to the new pa
373c0 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  ge. */.    put4b
373d0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
373e0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
373f0 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e  Offset+8], pgnoN
37400 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52  ew);.  .    /* R
37410 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
37420 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20  ence to the new 
37430 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c  page. */.    rel
37440 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a  easePage(pNew);.
37450 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
37460 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
37470 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
37480 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30  ALANCE */..#if 0
37490 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
374a0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f  tion does not co
374b0 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e  ntribute anythin
374c0 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  g to the operati
374d0 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a  on of SQLite..**
374e0 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73   it is sometimes
374f0 20 61 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f   activated tempo
37500 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62  rarily while deb
37510 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70  ugging code resp
37520 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20  onsible .** for 
37530 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d  setting pointer-
37540 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a  map entries..*/.
37550 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
37560 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50  pCheckPages(MemP
37570 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e  age **apPage, in
37580 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  t nPage){.  int 
37590 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  i, j;.  for(i=0;
375a0 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a   i<nPage; i++){.
375b0 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20      Pgno n;.    
375c0 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67  u8 e;.    MemPag
375d0 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67  e *pPage = apPag
375e0 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72  e[i];.    BtShar
375f0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
37600 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
37610 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
37620 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  );..    for(j=0;
37630 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   j<pPage->nCell;
37640 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c   j++){.      Cel
37650 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
37660 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20    u8 *z;.     . 
37670 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c       z = findCel
37680 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20  l(pPage, j);.   
37690 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
376a0 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26  lPtr(pPage, z, &
376b0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  info);.      if(
376c0 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
376d0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
376e0 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
376f0 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  &z[info.iOverflo
37700 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  w]);.        ptr
37710 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c  mapGet(pBt, ovfl
37720 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
37730 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
37740 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
37750 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
37760 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
37770 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
37780 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  af ){.        Pg
37790 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62  no child = get4b
377a0 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  yte(z);.        
377b0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63  ptrmapGet(pBt, c
377c0 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  hild, &e, &n);. 
377d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
377e0 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
377f0 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45   e==PTRMAP_BTREE
37800 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
37810 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  }.    if( !pPage
37820 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
37830 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74  Pgno child = get
37840 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
37850 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
37860 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20  fset+8]);.      
37870 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63  ptrmapGet(pBt, c
37880 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  hild, &e, &n);. 
37890 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
378a0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
378b0 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29  ==PTRMAP_BTREE )
378c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
378d0 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
378e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
378f0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
37900 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e   copy the conten
37910 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ts of the b-tree
37920 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a   node stored .**
37930 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74   on page pFrom t
37940 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70  o page pTo. If p
37950 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f  age pFrom was no
37960 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74  t a leaf page, t
37970 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  hen.** the point
37980 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
37990 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20 70 61  or each child pa
379a0 67 65 20 61 72 65 20 75 70 64 61 74 65 64 20 73  ge are updated s
379b0 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  o that the.** pa
379c0 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64  rent page stored
379d0 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20   in the pointer 
379e0 6d 61 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e  map is page pTo.
379f0 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69   If pFrom contai
37a00 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73  ned.** any cells
37a10 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70   with overflow p
37a20 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68  age pointers, th
37a30 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  en the correspon
37a40 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ding pointer.** 
37a50 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72 65 20  map entries are 
37a60 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20  also updated so 
37a70 74 68 61 74 20 74 68 65 20 70 61 72 65 6e 74 20  that the parent 
37a80 70 61 67 65 20 69 73 20 70 61 67 65 20 70 54 6f  page is page pTo
37a90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d  ..**.** If pFrom
37aa0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61   is currently ca
37ab0 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66  rrying any overf
37ac0 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69  low cells (entri
37ad0 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d  es in the.** Mem
37ae0 50 61 67 65 2e 61 70 4f 76 66 6c 5b 5d 20 61 72  Page.apOvfl[] ar
37af0 72 61 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e  ray), they are n
37b00 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f  ot copied to pTo
37b10 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  . .**.** Before 
37b20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20  returning, page 
37b30 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c  pTo is reinitial
37b40 69 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65 65  ized using btree
37b50 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  InitPage()..**.*
37b60 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63  * The performanc
37b70 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
37b80 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63  on is not critic
37b90 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75  al. It is only u
37ba0 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62  sed by .** the b
37bb0 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72  alance_shallower
37bc0 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64  () and balance_d
37bd0 65 65 70 65 72 28 29 20 70 72 6f 63 65 64 75 72  eeper() procedur
37be0 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a  es, neither of.*
37bf0 2a 20 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c  * which are call
37c00 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e  ed often under n
37c10 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e  ormal circumstan
37c20 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ces..*/.static v
37c30 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74  oid copyNodeCont
37c40 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72  ent(MemPage *pFr
37c50 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  om, MemPage *pTo
37c60 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
37c70 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54  f( (*pRC)==SQLIT
37c80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53 68  E_OK ){.    BtSh
37c90 61 72 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74  ared * const pBt
37ca0 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20   = pFrom->pBt;. 
37cb0 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46     u8 * const aF
37cc0 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61  rom = pFrom->aDa
37cd0 74 61 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e  ta;.    u8 * con
37ce0 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44  st aTo = pTo->aD
37cf0 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e  ata;.    int con
37d00 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46  st iFromHdr = pF
37d10 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  rom->hdrOffset;.
37d20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54      int const iT
37d30 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67  oHdr = ((pTo->pg
37d40 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30  no==1) ? 100 : 0
37d50 29 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  );.    int rc;. 
37d60 20 20 20 69 6e 74 20 69 44 61 74 61 3b 0a 20 20     int iData;.  
37d70 0a 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  .  .    assert( 
37d80 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b  pFrom->isInit );
37d90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
37da0 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64  om->nFree>=iToHd
37db0 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
37dc0 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d   get2byte(&aFrom
37dd0 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d  [iFromHdr+5]) <=
37de0 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
37df0 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20  eSize );.  .    
37e00 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72  /* Copy the b-tr
37e10 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20  ee node content 
37e20 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20  from page pFrom 
37e30 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a  to page pTo. */.
37e40 20 20 20 20 69 44 61 74 61 20 3d 20 67 65 74 32      iData = get2
37e50 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f  byte(&aFrom[iFro
37e60 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65  mHdr+5]);.    me
37e70 6d 63 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d  mcpy(&aTo[iData]
37e80 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c  , &aFrom[iData],
37e90 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
37ea0 2d 69 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d  -iData);.    mem
37eb0 63 70 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d  cpy(&aTo[iToHdr]
37ec0 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  , &aFrom[iFromHd
37ed0 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f  r], pFrom->cellO
37ee0 66 66 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d  ffset + 2*pFrom-
37ef0 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20  >nCell);.  .    
37f00 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20  /* Reinitialize 
37f10 70 61 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74  page pTo so that
37f20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
37f30 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
37f40 75 63 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61  ucture.    ** ma
37f50 74 63 68 20 74 68 65 20 6e 65 77 20 64 61 74 61  tch the new data
37f60 2e 20 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  . The initializa
37f70 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20  tion of pTo can 
37f80 61 63 74 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e  actually fail un
37f90 64 65 72 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c  der.    ** fairl
37fa0 79 20 6f 62 73 63 75 72 65 20 63 69 72 63 75 6d  y obscure circum
37fb0 73 74 61 6e 63 65 73 2c 20 65 76 65 6e 20 74 68  stances, even th
37fc0 6f 75 67 68 20 69 74 20 69 73 20 61 20 63 6f 70  ough it is a cop
37fd0 79 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64  y of initialized
37fe0 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 70 46   .    ** page pF
37ff0 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  rom..    */.    
38000 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  pTo->isInit = 0;
38010 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49  .    rc = btreeI
38020 6e 69 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20  nitPage(pTo);.  
38030 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
38040 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  _OK ){.      *pR
38050 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  C = rc;.      re
38060 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  turn;.    }.  . 
38070 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
38080 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
38090 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
380a0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
380b0 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20   entries.    ** 
380c0 66 6f 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f  for any b-tree o
380d0 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
380e0 20 74 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f   that pTo now co
380f0 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
38100 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20  ers to..    */. 
38110 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
38120 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  UUM ){.      *pR
38130 43 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  C = setChildPtrm
38140 61 70 73 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a  aps(pTo);.    }.
38150 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
38160 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74  s routine redist
38170 72 69 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e  ributes cells on
38180 20 74 68 65 20 69 50 61 72 65 6e 74 49 64 78 27   the iParentIdx'
38190 74 68 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72  th child of pPar
381a0 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65  ent.** (hereafte
381b0 72 20 22 74 68 65 20 70 61 67 65 22 29 20 61 6e  r "the page") an
381c0 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e  d up to 2 siblin
381d0 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70  gs so that all p
381e0 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20  ages have about 
381f0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75  the.** same amou
38200 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65  nt of free space
38210 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67  . Usually a sing
38220 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69  le sibling on ei
38230 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65  ther side of the
38240 0a 2a 2a 20 70 61 67 65 20 61 72 65 20 75 73 65  .** page are use
38250 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  d in the balanci
38260 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20  ng, though both 
38270 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63  siblings might c
38280 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20  ome from one.** 
38290 73 69 64 65 20 69 66 20 74 68 65 20 70 61 67 65  side if the page
382a0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 72   is the first or
382b0 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69   last child of i
382c0 74 73 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68  ts parent. If th
382d0 65 20 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66  e page .** has f
382e0 65 77 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c  ewer than 2 sibl
382f0 69 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20  ings (something 
38300 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  which can only h
38310 61 70 70 65 6e 20 69 66 20 74 68 65 20 70 61 67  appen if the pag
38320 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70  e.** is a root p
38330 61 67 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f  age or a child o
38340 66 20 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74  f a root page) t
38350 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c  hen all availabl
38360 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61  e siblings.** pa
38370 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
38380 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a   balancing..**.*
38390 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
383a0 73 69 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20  siblings of the 
383b0 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e  page might be in
383c0 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65  creased or decre
383d0 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20  ased by .** one 
383e0 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66  or two in an eff
383f0 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65  ort to keep page
38400 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75  s nearly full bu
38410 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e  t not over full.
38420 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61   .**.** Note tha
38430 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  t when this rout
38440 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
38450 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  ome of the cells
38460 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
38470 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c  might not actual
38480 6c 79 20 62 65 20 73 74 6f 72 6